unity3d 敌人没有重生(yield return waitforseconds之后的所有代码都不会执行)

sg24os4d  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(227)

yield后面的代码返回waitforsec。在我的协程中,我从敌人那里发起的命令不会被执行。
这是我的敌人剧本

public void Death()
{
    playerStats.onXpGathered(stats.xpReward);
    if(canRespawn)
    {
        health = stats.maxHealth;
        StartCoroutine(resScript.Respawn(respawnTime, gameObject, spawnPos));
    }
    else
    {
        Destroy(gameObject);
    }        
}

以下是我的Respawn脚本:

public class RespawnScript : MonoBehaviour
{
        
    public IEnumerator Respawn(float cooldown, GameObject enemy, Vector2 spawnPos) 
    {
        //enemy deactivates
        enemy.SetActive(false);
        yield return new WaitForSeconds(5);
        //nothing past this works for some reason
        print("got past yield return")
        enemy.SetActive(true);
        enemy.transform.position = spawnPos; 
    }
}

我试着使用Time.deltaTime计时器(这很有效,但我没有办法使用void Update函数(至少据我所知),以便它在敌人死亡时启动。
我也试过使用WaitForSecondsRealtime,但这并没有改变任何东西。
注意:死亡功能在敌人GameObject上,重生在gameManagerGameObject

gcuhipw9

gcuhipw91#

document说道:
如果您将SetActive设置为false以禁用协程所连接的GameObject,则协程也会停止。
由于您停用了敌人对象,而敌人对象恰好是运行协程的对象,因此协程停止了预期的工作。
为了解决这个问题,你可以在一个全局游戏对象上启动一个协同程序,你提到场景中有一个gameManager,如果我假设这个RespawnScript脚本附加到gameManager上,你可以这样做:

resScript.StartCoroutine(resScript.Respawn(respawnTime, gameObject, spawnPos));
pgky5nke

pgky5nke2#

更好的方法是杀死敌人并通过游戏管理器示例化一个新的敌人。

相关问题