Unity使用InputSystem时松开WASD角色仍持续移动问题求助
问题排查与修复方案
核心问题原因
- 输入事件监听不全:Unity新Input System中,输入动作存在
performed(触发)、canceled(取消/松开)两种状态回调,你当前仅监听了输入触发的回调,松开按键时没有重置输入相关变量,导致currentMovement一直保留最后一次的输入值、movementPressed/runPressed状态不会重置为false,角色就会沿最后方向持续移动。 - 跑步启动逻辑错误:启动跑步的判断条件写反,永远无法正常触发跑步状态切换。
修复代码
1. 修改Awake方法中的事件绑定,补充canceled回调
void Awake() { input = new PlayerInput(); // 补充 Movement 输入的 canceled 回调,松开按键时重置变量 input.CharacterControls.Movement.performed += ctx => { currentMovement = ctx.ReadValue<Vector2>(); movementPressed = currentMovement.x != 0 || currentMovement.y != 0; }; input.CharacterControls.Movement.canceled += ctx => { currentMovement = Vector2.zero; movementPressed = false; }; // 补充 Run 输入的 canceled 回调,松开跑步键时重置状态 input.CharacterControls.Run.performed += ctx => runPressed = ctx.ReadValueAsButton(); input.CharacterControls.Run.canceled += ctx => runPressed = false; }
2. 修正handleMovement中的跑步启动逻辑
void handleMovement() { // Get parameter values from animator bool isRunning = animator.GetBool(isRunningHash); bool isWalking = animator.GetBool(isWalkingHash); // Start walking if movement pressed is true and not already walking if (movementPressed && !isWalking) { animator.SetBool(isWalkingHash, true); } // Stop walking if movementPressed is false and not already walking if (!movementPressed && isWalking) { animator.SetBool(isWalkingHash, false); } // 修正此处判断,原来的 isRunning 改为 !isRunning if ((movementPressed && runPressed) && !isRunning) { animator.SetBool(isRunningHash, true); } // Stop running if movement pressed or run pressed is false and not currently running if ((!movementPressed || !runPressed) && isRunning) { animator.SetBool(isRunningHash, false); } // 补充说明:如果你的角色位移逻辑是在其他脚本读取currentMovement变量执行,currentMovement归零后位移会同步停止;如果是在本脚本处理位移,需要在Update/FixedUpdate中添加类似 `transform.Translate(currentMovement * moveSpeed * Time.deltaTime)` 的逻辑即可 }
内容的提问来源于stack exchange,提问作者user14704882
相关产品推荐
相关产品推荐

