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

Unity开发:为什么while循环满足退出条件后Run动画仍未停止?

问题原因
  • 动画播放逻辑仅在移动的while循环体内执行,移动结束循环退出后,没有代码触发Run动画的停止/状态切换,Animator会持续保持Run动画的播放状态
  • 现有代码存在逻辑冗余问题:Update函数每帧都会判断selected状态,只要selected为true就会调用Move方法启动新的协程,会导致同一时间多个移动协程并行执行,出现异常
修复方案
  • 新增协程运行状态判断,避免重复启动协程
  • 在移动结束的逻辑分支中,新增动画状态切换代码,切换到Idle等非移动状态的动画
修正后参考代码
// 新增协程运行标记,避免重复启动
private bool isMoving = false;

void Update()
{ 
    // 只有选中且不在移动中时才触发移动
    if(selected == true && !isMoving)
    {
        Move();
    }
}

void Move() 
{
    pos = left.transform.position;
    StartCoroutine(MoveOverTime());
}

IEnumerator MoveOverTime()
{
    isMoving = true;
    while (transform.position != pos)
    {
        transform.position = Vector3.MoveTowards(transform.position, pos, 0.04f * Time.deltaTime);
        animator.Play("Run");
        yield return null;
    }
    // 移动结束,切换为闲置动画
    animator.Play("Idle");
    selected = false;
    isMoving = false;
    yield return null;
}

补充说明:如果你的Animator使用参数控制状态切换,可将直接调用Play的逻辑改为修改参数值,比如移动时设置animator.SetBool("IsRun", true),移动结束设置animator.SetBool("IsRun", false),状态切换逻辑交给状态机处理更易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:54:04