2017-07-17 75 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