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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:06:12