0

我正在编写一个游戏(2D 平台游戏),我试图让敌人在玩家重生时重生。我不能简单地重新加载关卡,因为我有一些在关卡加载时会加载的对象,因此会导致一些问题。相反,为了重生玩家,我让它回到了它的起始位置(我处理了失去的生命和其他细节)。

玩家通过击中敌人的头来摧毁敌人,如下所示(在玩家的 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
    }

如您所见,我完全摧毁了敌人的物体。为了维护哪些敌人在哪里,我在创建时将它们添加到列表中(存储在单独的游戏对象中)。该列表是在单独的敌人重生对象中创建的,如下所示:

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.

看来我正在向列表中添加对现有奴才的引用而不是副本。如何在原始位置正确重生敌人?

4

1 回答 1

2

我接受了 Jerdak 的建议,没有消灭敌人,而是禁用了他们。这样,它们仍然存在,我可以循环并重新启用所有被禁用(杀死)的敌人。

于 2013-04-21T03:23:10.390 回答