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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:06:04