x


C# GameObject Lists

Hi im using a list in C# to list all of my game objects in unity so that i can select them, but when i destroy those game objects im not able to select the rest of the objects because the gameobect was destroyed. can anyone help me?

ok this is my targeting code

 using UnityEngine;
 using System.Collections;
 using System.Collections.Generic;
 
 public class targetting : MonoBehaviour {
     public List<Transform> targets;
     public Transform selectedTarget;
     private Transform myTransform;
     
         
     // Use this for initialization
     void Start () {
     targets = new List<Transform>();
         selectedTarget = null;
         myTransform = transform;
         AddAllEnemies();
         
     }
     public void AddAllEnemies(){
     GameObject[]go = GameObject.FindGameObjectsWithTag("Enemy");    
         foreach(GameObject enemy in go)
             AddTarget(enemy.transform);
     }
     public void AddTarget(Transform enemy){
     targets.Add(enemy);    
         
     }
     private void SortTargetsByDistance(){
         
         targets.Sort(delegate(Transform t1, Transform t2) { 
             return Vector3.Distance(t1.position, myTransform.position).CompareTo(Vector3.Distance(t2.position, myTransform.position));
                 });
     }
     private void targetEnemy (){
             if(selectedTarget == null)
             {
                 SortTargetsByDistance();
                 selectedTarget = targets[0];
             }
         else
         {
         int index = targets.IndexOf(selectedTarget);
             if(index < targets.Count-1)
             {
                 index++;
             }
             else
             {
             index = 0;    
             }
             DeselectTarget();
             selectedTarget = targets[ index ];
             
         }
         SelectTarget();
         if(selectedTarget == null){
             SortTargetsByDistance();
             selectedTarget = targets[1];
         }
     }
     private void SelectTarget(){
     selectedTarget.renderer.material.color = Color.red;    
         PlayerAttack pa = (PlayerAttack)GetComponent("PlayerAttack");
         pa.target = selectedTarget.gameObject;
     }
     private void DeselectTarget()
     {
     selectedTarget.renderer.material.color = Color.blue;
         selectedTarget = null;    
             
     }
     // Update is called once per frame
     void Update () {
     if(Input.GetKeyDown(KeyCode.Tab)){
             targetEnemy();
             
             
         }
     }
     private void deselectTargets(){
     
     }
 }
 

and this is the health script that applies the destroyed object ( by the way i just used gameobject(destroy))

 using UnityEngine;
 using System.Collections;
 
 public class EnemyHealth : MonoBehaviour {
     public int maxHealth = 100;
     public int curHealth = 100;
     
     
     public float healthBarLength;
     // Use this for initialization
     void Start () {
         healthBarLength = Screen.width /2;
     }
     
     // Update is called once per frame
     void Update () {
     AddjustCurrentHealth(0);
         
     }
     void OnGUI(){
         
     if(curHealth <= 0){
     GUI.Box(new Rect(Screen.width /2.1f, Screen.height /2.1f, 100, 25), "you are dead");
             Time.timeScale = 0;
             
     }
     GUI.Box(new Rect(10, 40, healthBarLength, 20), curHealth + "/" + maxHealth);    
         
     if(curHealth <= 0){
         gameObject(Destroy);
         }
     
 }
     public void AddjustCurrentHealth(int adj) {
         
     curHealth += adj;
     if(curHealth <0)
         curHealth = 0;
     if(curHealth > maxHealth)
         curHealth = maxHealth;
     if(maxHealth < 1)
         maxHealth = 1;
     healthBarLength = (Screen.width /2) * (curHealth /(float)maxHealth);        
     }
     
     void Die(){
     
         transform = 0;
         
     }
 }
more ▼

asked May 02, 2012 at 07:36 PM

BAgamer0 gravatar image

BAgamer0
6 4 6 7

The question is not fully clear. Could you give an example of how you destroy your object and how you cannot select it anymore? A piece of code will do fine.

May 02, 2012 at 08:17 PM Marnix

is gameObject(Destroy) valid code? It doesn't work in C# for me...

May 03, 2012 at 08:44 AM Marnix

No, if you want to destroy a GameObject and all its Components and children, use Destroy(gameObject);

May 03, 2012 at 09:39 AM Wolfram

That's what I thought. But it still does not remove the Transform from the list, so he will also need to remove that reference manually.

May 03, 2012 at 09:47 AM Marnix
(comments are locked)
10|3000 characters needed characters left

2 answers: sort voted first

After destroy the object, you can just call AddAllEnemies() to update list.

more ▼

answered May 03, 2012 at 07:17 AM

luozitian gravatar image

luozitian
51 13 9 9

This should work, although I don't think it is a nice piece of code. An event structure would be a better alternative.

May 03, 2012 at 08:45 AM Marnix
(comments are locked)
10|3000 characters needed characters left

You might need to reupdate you list because once you destroy an object, the list pointer points to null.,You might need to reupdate your list so that the pointer to the destroyed object is overwritten. I think your problem is with a null pointer.

more ▼

answered May 03, 2012 at 03:13 AM

MangoDerp gravatar image

MangoDerp
109 7 5 9

ok so would u be able to help me do this im still very new to programming

May 03, 2012 at 03:15 AM BAgamer0

That is not true unfortunately. The list still points to the transform that was once there. Unity garbage collection does not destroy the object you store in a list, only in the scene.

So the list still points to the Transform, but the transform is not used by anything anymore.

May 03, 2012 at 08:42 AM Marnix

@Marnix: Yes and no ;) The C# part of components remain but it can't be used anymore. Also a check against null will be positive since they overloaded UnityEngine.Objects equally and inequally operators.

May 03, 2012 at 10:24 AM Bunny83
(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x10313
x6901
x862
x335
x158

asked: May 02, 2012 at 07:36 PM

Seen: 24950 times

Last Updated: May 03, 2012 at 10:24 AM