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
上,重生在gameManager
GameObject
上
2条答案
按热度按时间gcuhipw91#
document说道:
如果您将SetActive设置为false以禁用协程所连接的GameObject,则协程也会停止。
由于您停用了敌人对象,而敌人对象恰好是运行协程的对象,因此协程停止了预期的工作。
为了解决这个问题,你可以在一个全局游戏对象上启动一个协同程序,你提到场景中有一个
gameManager
,如果我假设这个RespawnScript
脚本附加到gameManager
上,你可以这样做:pgky5nke2#
更好的方法是杀死敌人并通过游戏管理器示例化一个新的敌人。