Unity2D玩家子对象武器动画指定不旋转,松开按键后仍轻微偏移如何解决
问题根因
- 武器的Animator未同步获取
lastMoveX、lastMoveY参数,停止移动时没有正确的参数驱动武器朝向动画 Input.GetAxis自带输入平滑效果,松开按键时数值会线性衰减到0,当数值低于0.5阈值进入停止逻辑时,lastMove存储的是低于1的中间值,不是最终的标准朝向值,导致动画混合出现偏移- 若武器动画状态机的待机过渡条件未使用
lastMove参数判断朝向,也会导致停止时武器朝向错误
修复步骤
- 修正
lastMove赋值逻辑,确保存储标准化的朝向值,避免衰减的中间值干扰动画:
void Update() { // 可选:换成GetAxisRaw取消输入平滑,数值会直接跳变无过渡 // float horizontalInput = Input.GetAxisRaw("Horizontal"); // float verticalInput = Input.GetAxisRaw("Vertical"); float horizontalInput = Input.GetAxis("Horizontal"); float verticalInput = Input.GetAxis("Vertical"); rb.velocity = new Vector2(horizontalInput * moveSpeed, verticalInput * moveSpeed); if (Mathf.Abs(horizontalInput) > 0.5f) { isMoving = true; // 直接存储±1的标准朝向值,不要存中间衰减值 lastMove = new Vector2(Mathf.Sign(horizontalInput), 0f); } else if (Mathf.Abs(verticalInput) > 0.5f) { isMoving = true; lastMove = new Vector2(0f, Mathf.Sign(verticalInput)); } else { isMoving = false; rb.velocity = Vector2.zero; } animator.SetFloat("moveX", horizontalInput); animator.SetFloat("moveY", verticalInput); animator.SetBool("isMoving", isMoving); animator.SetFloat("lastMoveX", lastMove.x); animator.SetFloat("lastMoveY", lastMove.y); // 新增:同步参数到武器Animator,weaponAnimator需要先在面板挂载武器的Animator组件 weaponAnimator.SetFloat("moveX", horizontalInput); weaponAnimator.SetFloat("moveY", verticalInput); weaponAnimator.SetBool("isMoving", isMoving); weaponAnimator.SetFloat("lastMoveX", lastMove.x); weaponAnimator.SetFloat("lastMoveY", lastMove.y); }
- 在
playermovements脚本中添加武器Animator的引用声明,在Inspector面板将Weapon对象的Animator组件拖入对应插槽:
public Animator weaponAnimator;
- 检查武器的Animator状态机配置:
- 确认参数列表存在和玩家Animator一致的
moveX、moveY、isMoving、lastMoveX、lastMoveY参数 - 朝向相关的待机状态过渡条件必须使用
lastMoveX/lastMoveY判断,不要用实时输入的moveX/moveY判断
- 确认参数列表存在和玩家Animator一致的
内容的提问来源于stack exchange,提问作者Arya
相关产品推荐
相关产品推荐

