- Home /
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;
}
}
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.
is gameObject(Destroy)
valid code? It doesn't work in C# for me...
No, if you want to destroy a GameObject and all its Components and children, use Destroy(gameObject);
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.
Answer by luozitian · May 03, 2012 at 07:17 AM
After destroy the object, you can just call AddAllEnemies() to update list.
This should work, although I don't think it is a nice piece of code. An event structure would be a better alternative.
you still would need to re-sort to target the nearest current enemy? this is where you will have a performance problem...
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.
ok so would u be able to help me do this im still very new to program$$anonymous$$g
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.
@$$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
Follow this Question
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