Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
1
Question by BAgamer0 · May 02, 2012 at 07:36 PM · c#listprogramminggameobjects

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;
         
     }
 }
Comment
Add comment · Show 4
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Marnix · May 02, 2012 at 08:17 PM 0
Share

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.

avatar image Marnix · May 03, 2012 at 08:44 AM 0
Share

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

avatar image Wolfram · May 03, 2012 at 09:39 AM 0
Share

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

avatar image Marnix · May 03, 2012 at 09:47 AM 0
Share

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.

2 Replies

· Add your reply
  • Sort: 
avatar image
2

Answer by luozitian · May 03, 2012 at 07:17 AM

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

Comment
Add comment · Show 2 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Marnix · May 03, 2012 at 08:45 AM 0
Share

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

avatar image Ziron999 · Feb 03, 2015 at 12:15 AM 0
Share

you still would need to re-sort to target the nearest current enemy? this is where you will have a performance problem...

avatar image
0

Answer by MangoDerp · May 03, 2012 at 03:13 AM

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.

Comment
Add comment · Show 3 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image BAgamer0 · May 03, 2012 at 03:15 AM 0
Share

ok so would u be able to help me do this im still very new to program$$anonymous$$g

avatar image Marnix · May 03, 2012 at 08:42 AM 0
Share

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.

avatar image Bunny83 · May 03, 2012 at 10:24 AM 0
Share

@$$anonymous$$arnix: 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.

Your answer

Hint: You can notify a user about this post by typing @username

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

Answers Answers and Comments

7 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Multiple Cars not working 1 Answer

A node in a childnode? 1 Answer

What should i learn for unity C# or UnityScript? 4 Answers

List Bug when using debugger 1 Answer

Making a camera list 1 Answer


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges