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

问题描述 投票:0回答:2

yield return 之后的代码

waitforsec
。在我从敌人发射的协程中没有被执行。

这是我的敌人剧本

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

这是我的重生脚本:

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
上,重生是在
gameManager
GameObject

c# unity3d
2个回答
0
投票

文件说:

如果您将 SetActive 设置为 false 以禁用游戏对象,协程也会停止 协程附加到.

由于你停用了敌方对象,而敌方对象恰好是运行协程的对象,协程按预期停止工作。

为了解决这个问题,你可以在全局游戏对象上启动一个协程,你提到场景中有一个

gameManager
,如果我假设这个
RespawnScript
脚本附加到
gameManager
,你可以这样做:

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

0
投票

//出于某种原因,过去的一切都行不通

它按预期工作,没有任何反应,因为在上面的这一行中,您已经返回“yield wait for seconds”,之后什么都无法达到。你必须在协程之外声明你的代码。

© www.soinside.com 2019 - 2024. All rights reserved.