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

Unity协程是否有类似JS async.then的后续执行机制?

Unity协程实现类似JavaScript async.then的后续执行方法

有几种简便的方法可以实现协程结束后的后续操作,对应你的需求整理如下:

  • 方法1:嵌套封装协程(无需修改原有Tweeng逻辑)
    直接写一个封装后的协程,先等待目标Tweeng协程执行完毕,再执行重置m_IsMoving的逻辑,这是最不需要改动原有代码的方案:
if (!m_IsMoving)
{
    m_IsMoving = true;
    StartCoroutine(MoveAndResetState());
}

// 封装的协程方法
private IEnumerator MoveAndResetState()
{
    // 等待Tweeng协程完全执行结束
    yield return StartCoroutine(time_passed.Tweeng(
        (time_Set_Movement) => transform.position = time_Set_Movement,
        transform.position,
        new Vector3(
            transform.position.x + positior.x,
            transform.position.y + positior.y,
            transform.position.z + positior.z
        )
    ));
    // 协程结束后执行的后续逻辑
    m_IsMoving = false;
}
  • 方法2:给Tweeng添加完成回调(若可修改Tweeng实现)
    如果你有权限修改Tweeng方法的定义,可以给它增加一个Action类型的可选参数,在协程逻辑结束时触发这个回调,完美对应JS里then的写法:
// 修改后的Tweeng方法示例(补全你的实际补间逻辑)
public IEnumerator Tweeng(Action<Vector3> onUpdate, Vector3 startPos, Vector3 endPos, Action onComplete = null)
{
    // 这里是你原有的补间动画逻辑,比如逐帧更新位置
    float elapsedTime = 0f;
    while (elapsedTime < 1f)
    {
        elapsedTime += Time.deltaTime;
        Vector3 currentPos = Vector3.Lerp(startPos, endPos, elapsedTime);
        onUpdate?.Invoke(currentPos);
        yield return null;
    }
    // 协程执行完毕时触发回调
    onComplete?.Invoke();
}

// 调用时直接传入后续逻辑
if (!m_IsMoving)
{
    m_IsMoving = true;
    StartCoroutine(time_passed.Tweeng(
        (time_Set_Movement) => transform.position = time_Set_Movement,
        transform.position,
        new Vector3(
            transform.position.x + positior.x,
            transform.position.y + positior.y,
            transform.position.z + positior.z
        ),
        () => m_IsMoving = false // 这里就是类似then的后续操作
    ));
}
  • 方法3:用UniTask实现类JS异步语法(可选)
    如果项目中引入了UniTask(Unity生态常用的异步库),可以将协程转换为UniTask,直接使用.ContinueWith或者await语法,和JS的then体验几乎一致:
// 需要先引入UniTask命名空间
using Cysharp.Threading.Tasks;

// 调用示例
if (!m_IsMoving)
{
    m_IsMoving = true;
    // 等待协程完成后执行后续逻辑
    time_passed.Tweeng(
        (time_Set_Movement) => transform.position = time_Set_Movement,
        transform.position,
        new Vector3(
            transform.position.x + positior.x,
            transform.position.y + positior.y,
            transform.position.z + positior.z
        )
    ).ToUniTask().ContinueWith(() => m_IsMoving = false);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:05:18