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
相关产品推荐
相关产品推荐

