2017-07-17 32 views
0

我做了一个目前在我的箱子对撞机中的gameObjects列表,它的工作原理。但是,当我将游戏对象设置为非活动状态时,统一:如何从列表中删除不活动的gameObject

gameObject.SetActive(false); //消除敌人

gameObject保留在List中而不被删除。如何从另一个类的OnTriggerEnter函数的列表中删除gameObject?

PlayerLifeClass:

 private List<GameObject> ObjectsInRange = new List<GameObject>(); 
     public void OnTriggerEnter(Collider collider) 
     { 
      if (collider.tag != "Player" && collider.tag == "Zombie") 
      { 
       ObjectsInRange.Add(collider.gameObject); 
       damage = ObjectsInRange.Count; //amount of zombies inside collider 
       //***Over here*** 

       zombie.DamagePlayer(damage); 
       Debug.Log(damage); 
      } 
     } 
     public void OnTriggerExit(Collider collider) 
     { 
      if (collider.tag != "Player" && collider.tag == "Zombie") 
      { 
       //Probably you'll have to calculate wich object it is 
       ObjectsInRange.Remove(collider.gameObject); 
       Debug.Log(ObjectsInRange); 
      } 
     } 

-

ZombieClass: 

    public class Zombie : MonoBehaviour 
    { 
     public int currentHealth; 
     private Player player; 
     private PlayerLifeCollider playerCollider; 

     public void Damage(int damageAmount) 
     { 
      //subtract damage amount when Damage function is called 
      currentHealth -= damageAmount; 

      //Check if health has fallen below zero 
      if (currentHealth <= 0) 
      { 
       //if health has fallen below zero, deactivate it 
       gameObject.SetActive(false); //***Over here*** 

      } 

    public void DamagePlayer(int damage) 
    { 
     player.Life(damage); 
     } 
    } 
+0

为什么不只是做'摧毁(游戏对象);' –

+0

会破坏(游戏对象)从列表中删除吗?我打算去,但后来我被告知SetActive(false)对性能更好。 – BenSmith

+0

我觉得它会让gameObject变为null,而不是将它从List中移除。 – BenSmith

回答

1

如果我明白你想要什么,这样的事情会做,

PlayerLife类

public static List<GameObject> ObjectsInRange = new List<GameObject>(); 

僵尸类

public void Damage(int damageAmount) 
    { 
     //subtract damage amount when Damage function is called 
     currentHealth -= damageAmount; 

     //Check if health has fallen below zero 
     if (currentHealth <= 0) 
     { 
      //if health has fallen below zero, deactivate it 
      PlayerLife.ObjectsInRange.Remove(gameObject); 
      gameObject.SetActive(false); //***Over here*** 
      //You can also do a Destroy(gameObject) if you'd like; 

     } 
    } 
+0

静态功能工作!但是,它迫使我把所有东西都变成静态的。有没有办法做一个班轮没有静力学? – BenSmith

+1

@ BenSmith你可以使用单身,如果你不想把所有的变量设置为静态。请参阅下面的答案。 – nipercop

+0

@BenSmith它是什么强迫你改变?您可以访问类内部和外部的任何静态变量。 –

2

你有更多的方式,我会告诉你一个简单的。

Modificate你的僵尸类:

public bool Damage(int damageAmount) 
{ 
    currentHealth -= damageAmount; 
    if (currentHealth <= 0) 
    { 
     gameObject.SetActive(false); //***Over here*** 
     return true; 
    } 
    return false; 
} 

和PlayerLifeClass:

if (collider.tag != "Player" && collider.tag == "Zombie"){ 
    ObjectsInRange.Add(collider.gameObject); 
    damage = ObjectsInRange.Count; //amount of zombies inside collider 
    if(collider.GetComponent<Zombie>().Damage(damage)){ 
     // if zombie dead, remove him. 
     ObjectsInRange.Remove(collider.gameObject); 
    } 
    Debug.Log(damage); 
} 

或者somithing这样,但它不是好的选择,我想。

void Start(){ 
    playerLifeClass = GameObject.FindGameObjectWithTag("Player")>GetComponent<PlayerLifeClass>(); 
} 
public bool Damage(int damageAmount) 
{ 
    currentHealth -= damageAmount; 
    if (currentHealth <= 0) 
    { 
    //if health has fallen below zero, deactivate it 
     gameObject.SetActive(false); //***Over here*** 
     playerLifeClass.RemoveZombie(gameObject); 
    } 
} 

而且在PlayerLifeClass添加新的方法:

public void RemoveZombie(GameObject zomb){ 
    ObjectsInRange.Remove(zomb); 
} 

或者使用单身人士。在Zombie.cs

... 
public static PlayerLifeClass instance; 
public List<GameObject> ObjectsInRange = new List<GameObject>(); 
... 

void Start(){ 
    instance = this; 
    ... 
} 

,并使用它:新变量添加到PlayerLifeClass

if (currentHealth <= 0){ 
    gameObject.SetActive(false); //***Over here*** 
    PlayerLifeClass.instance.ObjectsInRange.Remove(gameObject); 
} 
+0

好吧,ps,我试了第一个两个,它没有工作。我得到了一个N​​ullReferenceException,或者当僵尸失效时发生了同样的问题,而伤害没有回到零。 – BenSmith

+0

@BenSmith是的,也许我的例子不是100%的解决方案,也许他们有一些错误,但他们应该给你一些想法。祝你好运) – nipercop

+0

当我声明zombie.DamagePlayer(损坏)为非静态时,我得到一个NullReferenceException。你知道如何解决它吗?我觉得这只是了解基础知识。 – BenSmith