2013-04-21 55 views
0

我正在寫一個遊戲(2D平臺遊戲),當玩家重生時我想讓敵人重生。我不能簡單地重新加載關卡,因爲我有一些在關卡加載時加載的對象,所以會導致一些問題。相反,爲了重生玩家,我已經回到了初始位置(並處理了失去的生活和其他細節)。Respawn被毀壞的遊戲對象(敵人)

玩家通過點擊它在它的頭摧毀敵人,如下(以OnTriggerEnter對玩家):

if(otherObject.CompareTag("Minion")) //hit by minion 
    { 
     if(hitFromTop(otherObject.gameObject)) //if player jumped on enemy 
     { 
      otherObject.GetComponent<Minion>().setMoving(false); //stop moving 
      playSound(KillEnemySound); //play killing enemy sound 
      jump(); 
      Destroy(otherObject.gameObject); //kill minion 

     } 
        //else hurt player 
    } 

正如你所看到的,我摧毀敵方目標完全。爲了維護哪些敵人在哪裏,我將它們添加到創建時的列表(存儲在單獨的GameObject中)。在單獨的敵人重生對象被創建的列表如下:

void Start() 
{ 
    enemyList = GameObject.FindGameObjectsWithTag("Minion"); 
    Debug.Log ("Adding all minions to list"); 
} 

我試圖通過列表會在原來的位置調用一個函數重生列表中的所有的爪牙。功能如下:

public void RespawnAll() 
{ 
    foreach(GameObject minion in enemyList) 
    { 
     Destroy(minion); //make sure to respawn ALL minions 
    } 
    Debug.Log ("Respawning all"); 
    foreach(GameObject minion in enemyList) 
    { 
     Debug.Log ("instantiating minions from list"); 
     Instantiate (minion, minion.GetComponent<Minion>().origPosition, Quaternion.identity); 
    } 
} 

我知道這是不是刪除所有的敵人和重生他們所有的時間最優化方法,如果這個邏輯是錯誤的,或者如果你知道一個更好的辦法,我正在接受新的想法。

這種想法的問題是,我得到一個錯誤:

MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object.

看來我加入到現有的奴才一個參考列表,而不是一個副本。我怎樣才能在原來的位置正確地重生敵人?

+1

爲什麼不將敵人狀態存儲爲類/結構體並傳遞這些存儲的值來實例化?如果您需要恢復比位置/方向更多的序列化對象或不銷燬它們,只需禁用遊戲對象並在重新啓動關卡時重新啓用。 – Jerdak 2013-04-21 03:01:09

+0

將狀態作爲類/結構體是什麼意思?這將如何幫助重生敵人?我只是將位置/方向傳遞給respawn函數並實例化一個全新的對象? (我將考慮禁用/啓用,但我很好奇你的意思是第一條語句。) – muttley91 2013-04-21 03:12:03

+0

我應該更清楚。我所指出的是,你的目標是在你的開始位置重新實例化你的敵人。與'enemylist'平行,你可以有'enemyposition'或者類似的列表來存儲類似於Vector3的類似列表或者包含相關敵人信息的自定義類,例如開始生命,位置,方向等。 – Jerdak 2013-04-21 03:29:46

回答

2

我接受了傑爾達克的建議,而不是摧毀敵人,我禁用了他們。這樣,它們仍然存在,我可以循環並重新啓用所有被禁用(殺死)的敵人。