You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中Start调用含while(true)协程与Update调用无while协程的差异疑问

问题原因分析
  • Update() 是Unity的帧生命周期函数,每渲染一帧就会执行1次,常规设备下每秒会执行30~120次不等。
  • 每次调用StartCoroutine()都会启动一个全新的独立协程实例,不会复用之前已启动的协程。你移除while(true)后,单个协程的逻辑仅为:执行1次敌人生成逻辑 -> 等待对应时长 -> 协程终止。
  • 两者结合后,每帧都会新增一个协程实例,每个协程等待自己的随机时长后就会生成一次敌人,启动后短时间内就会有数十上百个协程先后到点触发生成,看起来就像没有延迟疯狂生成。
原有正常写法的逻辑

你之前在Start()中仅调用1次协程,协程内部的while(true)会让这个唯一的协程循环执行:生成敌人 -> 执行yield return new WaitForSeconds(随机时长)挂起等待 -> 等待结束后回到循环头再次生成敌人,因此每次生成之间的间隔完全符合预期。

推荐的正确实现方式

建议沿用Start()中单次启动带while(true)循环的协程写法,性能和逻辑可控性都更高,示例代码如下:

void Start()
{
    // 全局仅启动1次生成协程
    StartCoroutine(SpawnEnemiesLoop());
}

IEnumerator SpawnEnemiesLoop()
{
    while(true)
    {
        // 你的敌人生成逻辑
        Instantiate(enemyPrefab, spawnPosition, Quaternion.identity);
        // 随机等待1~5秒后进入下一轮生成
        yield return new WaitForSeconds(Random.Range(1f, 5f));
    }
}

内容的提问来源于stack exchange,提问作者AlbertDang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 21:54:04