2013-04-21 54 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

我接受了杰尔达克的建议,而不是摧毁敌人,我禁用了他们。这样,它们仍然存在,我可以循环并重新启用所有被禁用(杀死)的敌人。