Unity 3D中Bool参数无法切换Idle动画至其他动画的问题求助
修复Unity玩家控制器的动画切换逻辑
你的代码已经正确声明了Animator私有字段并在Start方法中获取了组件,但动画切换逻辑存在明显问题——最后那段设置IsMoving参数的代码会先设为true再立刻设为false,导致动画永远停留在Idle状态。以下是针对AWSD控制逻辑的修正方案:
问题代码分析
原代码中这段逻辑完全无效:
animator.SetBool("IsMoving", true); { animator.SetBool("IsMoving", false); }
它没有任何条件判断,执行顺序是先把IsMoving设为true,紧接着就设为false,Animator根本不会捕捉到移动状态。
修正后的完整代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { private float speed = 5.0f; private Animator animator; // 新增字段:跟踪玩家是否处于移动/旋转状态 private bool isMoving; void Start() { animator = GetComponent<Animator>(); speed = 5.0f; } void Update() { // 每帧开始重置移动状态为false isMoving = false; if (Input.GetKey(KeyCode.W)) { transform.Translate(Vector3.forward * Time.deltaTime * speed); isMoving = true; } if (Input.GetKey(KeyCode.S)) { transform.Translate(-Vector3.forward * Time.deltaTime * speed); isMoving = true; } if (Input.GetKey(KeyCode.A)) { transform.Rotate(0, -1, 0); isMoving = true; } if (Input.GetKey(KeyCode.D)) { transform.Rotate(0, 1, 0); isMoving = true; } // 根据实际移动状态设置动画参数 animator.SetBool("IsMoving", isMoving); } }
关键改动说明
- 新增
private bool isMoving;私有字段:用来记录当前帧玩家是否有移动或旋转操作 - 每帧开头重置
isMoving = false;:确保没有按键输入时,状态会自动回到Idle - 在每个AWSD的输入判断块内设置
isMoving = true;:只要有移动/旋转行为,就标记为正在移动 - 最后统一设置
animator.SetBool("IsMoving", isMoving);:确保每帧只更新一次动画参数,逻辑清晰且避免冲突
这样修改后,玩家按住AWSD任意按键时,IsMoving会被设为true,触发移动动画;松开按键后,isMoving重置为false,动画自动切回Idle状态,完全保留你喜欢的AWSD控制布局。
内容的提问来源于stack exchange,提问作者BBatz07
相关产品推荐
相关产品推荐

