如何实现Unity Coroutine每隔X秒执行?解决每帧重复触发问题
问题修复:让协程每隔2秒执行一次
问题根源
你的代码每帧都在打印“Ran”,核心原因是在Update方法里每帧调用StartCoroutine——这会导致每一帧都创建并启动一个新的协程实例。哪怕每个协程只执行一次打印就进入等待,但架不住每帧都有新协程启动,最终表现为控制台每帧输出内容。
另外你写的running变量逻辑完全多余且矛盾:刚进入协程就设running = true,循环执行打印后等待2秒又立刻设running = false,每个协程本质上只跑一次循环就结束,完全起不到“每隔2秒执行”的作用。
修复方案一:单协程循环(推荐)
只在脚本初始化时启动一次协程,让协程内部通过循环持续每隔2秒执行逻辑:
public class EveryXSeconds: MonoBehaviour { public bool running = true; private void Start() { // 仅在脚本启动时初始化一次协程 StartCoroutine(MyCoroutine()); } IEnumerator MyCoroutine() { // 持续循环直到running被设为false while (running) { print("Ran"); // 等待2秒后再进入下一次循环 yield return new WaitForSeconds(2f); } } }
如果不需要中途停止协程,甚至可以去掉running变量,改成无限循环:
IEnumerator MyCoroutine() { while (true) { print("Ran"); yield return new WaitForSeconds(2f); } }
修复方案二:Update计时器(无需协程)
如果不想用协程,也可以通过在Update里累加时间来实现定时逻辑:
public class EveryXSeconds: MonoBehaviour { // 可在Inspector面板调整间隔时间 public float interval = 2f; private float timer = 0f; private void Update() { timer += Time.deltaTime; if (timer >= interval) { print("Ran"); // 重置计时器,用timer -= interval可避免时间溢出误差 timer -= interval; } } }
内容的提问来源于stack exchange,提问作者m0a
相关产品推荐
相关产品推荐

