【问题标题】:Respawn Destroyed GameObject (Enemy)重生被摧毁的游戏对象(敌人)
【发布时间】:2013-04-14 04:40:18
【问题描述】:

我正在编写一个游戏(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.

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

【问题讨论】:

  • 为什么不将敌人状态存储为类/结构并将这些存储的值传递给实例化?如果您需要恢复的不仅仅是位置/方向,或者序列化您的对象或不销毁它们,只需禁用游戏对象并在重新启动关卡时重新启用。
  • 将状态作为类/结构是什么意思?这将如何帮助重生敌人?我是否只需将位置/方向传递给 respawn 函数并实例化一个全新的对象? (我将研究禁用/启用,但我很好奇你的第一句话是什么意思。)
  • 我应该更清楚。我要指出的是,您的目标是在敌人的起始位置重新实例化您的敌人。与enemylist 平行,您可以拥有enemyposition 或类似的列表,其中存储类似Vector3 或包含相关敌人信息(如起始生命、位置、方向等)的自定义类。
  • 这是一个有趣的方法。我最终发布了您的答案,只是禁用而不是销毁作为这个问题的答案。如果您希望我选择它作为您的答案,您可以发布它,我会代替您的!
  • 没关系,我对评论业力很满意。 :) 随意接受你自己的答案。

标签: c# unity3d


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多