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

