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

Unity新InputSystem角色移动仅触发1帧问题求助

解决Unity新版InputSystem按住按键仅移动1帧的问题

问题核心

你碰到的问题本质是:仅绑定performed事件时,只有按键按下瞬间会触发一次回调,按住期间不会持续更新移动值;同时canceled事件触发时,ReadValue()会返回0,导致移动值被意外重置。

解决方案(基于UnityEvents+InputSystem)

不用绕开UnityEvents,只需正确利用InputAction的三个回调阶段(started/performed/canceled),就能实现持续移动:

  1. 配置InputAction参数
    打开你的Input Action Asset,找到移动对应的Action:

    • 将Type设为Value(比如Axis 2D对应方向键/WASD)
    • 将Behavior设为Hold,确保按住按键时会持续触发performed事件
  2. 绑定回调方法
    支持代码绑定或Inspector可视化绑定(更贴合你学习UnityEvents的需求),两种方式如下:

    方式1:代码绑定回调

    using UnityEngine;
    using UnityEngine.InputSystem;
    
    public class PlayerMovement : MonoBehaviour
    {
        [SerializeField] private float moveSpeed = 5f;
        [SerializeField] private PlayerInput playerInput;
        private InputAction moveAction;
        private Vector2 movement;
        private Rigidbody2D rb;
    
        private void Awake()
        {
            rb = GetComponent<Rigidbody2D>();
            moveAction = playerInput.actions["Move"];
            
            // 绑定三个回调事件
            moveAction.started += UpdateMovement;
            moveAction.performed += UpdateMovement;
            moveAction.canceled += ResetMovement;
        }
    
        // 更新移动值(按下和持续按住时调用)
        private void UpdateMovement(InputAction.CallbackContext context)
        {
            movement = context.ReadValue<Vector2>();
        }
    
        // 重置移动值(松开按键时调用)
        private void ResetMovement(InputAction.CallbackContext context)
        {
            movement = Vector2.zero;
        }
    
        private void FixedUpdate()
        {
            // 把移动值应用到刚体
            rb.velocity = new Vector2(movement.x * moveSpeed, rb.velocity.y);
        }
    
        private void OnDestroy()
        {
            // 移除回调避免内存泄漏
            moveAction.started -= UpdateMovement;
            moveAction.performed -= UpdateMovement;
            moveAction.canceled -= ResetMovement;
        }
    }
    

    方式2:Inspector可视化绑定(UnityEvents)

    • 选中Player对象,找到PlayerInput组件
    • 在Events下找到你的Move Action,展开后分别绑定:
      • Started事件到PlayerMovement脚本的UpdateMovement方法
      • Performed事件到PlayerMovement脚本的UpdateMovement方法
      • Canceled事件到PlayerMovement脚本的ResetMovement方法
  3. 关键注意事项

    • 不要在Update或FixedUpdate中直接调用moveAction.ReadValue(),而是通过回调维护movement变量,这样能保证按住时持续更新,松开时及时重置
    • 确保PlayerInput的Behavior设置为Invoke Unity Events(如果用可视化绑定)

内容的提问来源于stack exchange,提问作者Gaspard GUILLOT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 12:03:29