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

为什么Unity WebGL中await Task.Delay(10)会导致程序执行停止?

问题根因

Unity WebGL 构建目标基于浏览器的单线程 JavaScript 运行时,不支持多线程调度,Task.Delay 依赖 .NET 线程池的定时器回调逻辑,在 WebGL 环境下无法正常触发回调,会导致异步流程永久挂起。

解决方案

方案1:使用UniTask异步库(推荐)

UniTask是专门为Unity优化的异步实现,完美适配WebGL平台,替换成本极低:

  • 导入UniTask库到项目中
  • 将代码中的await Task.Delay(10);替换为await UniTask.Delay(10);即可,其余逻辑无需修改

修改后的代码示例:

while (XAxiscurrentXpos <= -izvalue) 
{ 
    await UniTask.Delay(10); 

    XAxiscurrentXpos += 0.001f;
    Vector3 posx = new Vector3(XAxiscurrentXpos, XAxisposition.y, XAxisposition.z);
    XAxis.transform.localPosition = posx;
}

方案2:使用Unity原生协程(无第三方依赖)

如果不想引入第三方库,可以将这段逻辑改写为协程实现:

// 调用处启动协程
StartCoroutine(MoveXAxisCoroutine());

IEnumerator MoveXAxisCoroutine()
{
    while (XAxiscurrentXpos <= -izvalue) 
    { 
        // 10ms对应0.01秒,使用WaitForSecondsRealtime不受时间缩放影响
        yield return new WaitForSecondsRealtime(0.01f);

        XAxiscurrentXpos += 0.001f;
        Vector3 posx = new Vector3(XAxiscurrentXpos, XAxisposition.y, XAxisposition.z);
        XAxis.transform.localPosition = posx;
    }
}

注意事项

  • WebGL平台不支持任何依赖多线程的.NET异步API,包括Task.Run、Thread.Sleep、Task.Delay等,调用后都会出现调度异常
  • 所有延迟、异步逻辑优先使用Unity原生或适配过WebGL的异步实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:45:03