C# Unity自定义协程等待函数未正确生效问题求解
问题原因
你遇到的问题核心是对Unity协程的执行逻辑理解有误:StartCoroutine()是非阻塞调用,你在普通方法wait()里调用StartCoroutine(waito(time))时,只会把协程注册到Unity的协程调度系统,当前方法会立刻执行完返回,不会等待协程内的WaitForSeconds计时结束,因此wait(3)调用后会立刻执行下一行的print("hello2"),两条打印自然会几乎同时输出。
正确实现方案
协程的等待暂停效果仅作用于协程自身的执行流,需要延迟执行的代码必须放到协程内部、yield return等待语句之后,才能实现预期的延迟效果。
最简实现
直接把顺序执行的逻辑全部放到协程中调度即可:
using System.Collections; using UnityEngine; public class Learninghowtoprogram : MonoBehaviour { private void Start() { StartCoroutine(PrintWithDelay()); } IEnumerator PrintWithDelay() { print("hello"); // 协程执行到这里会暂停3秒,再继续执行后续代码 yield return new WaitForSeconds(3f); print("hello2"); } }
封装通用等待方法的实现
如果要封装可复用的等待方法,必须在协程内部通过yield return调用等待协程,才能触发等待效果:
using System.Collections; using UnityEngine; public class Learninghowtoprogram : MonoBehaviour { private void Start() { StartCoroutine(MainWorkFlow()); } // 可复用的等待协程 IEnumerator Wait(float seconds) { yield return new WaitForSeconds(seconds); } IEnumerator MainWorkFlow() { print("hello"); // 注意:必须加yield return,才会等待Wait协程执行完成后再往下走 yield return Wait(3); print("hello2"); } }
关键注意点
- 不要在普通非协程方法里尝试通过调用
StartCoroutine实现代码行级别的等待,普通方法不会被协程的yield暂停。 - 协程不会阻塞Unity主线程,等待期间主线程仍然会正常运行帧更新、渲染等逻辑,这也是协程和线程休眠的核心区别。
内容的提问来源于stack exchange,提问作者Lleyton Bell
相关产品推荐
相关产品推荐

