Unity新InputSystem角色移动仅触发1帧问题求助
解决Unity新版InputSystem按住按键仅移动1帧的问题
问题核心
你碰到的问题本质是:仅绑定performed事件时,只有按键按下瞬间会触发一次回调,按住期间不会持续更新移动值;同时canceled事件触发时,ReadValue()会返回0,导致移动值被意外重置。
解决方案(基于UnityEvents+InputSystem)
不用绕开UnityEvents,只需正确利用InputAction的三个回调阶段(started/performed/canceled),就能实现持续移动:
配置InputAction参数
打开你的Input Action Asset,找到移动对应的Action:- 将
Type设为Value(比如Axis 2D对应方向键/WASD) - 将
Behavior设为Hold,确保按住按键时会持续触发performed事件
- 将
绑定回调方法
支持代码绑定或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方法
关键注意事项
- 不要在
Update或FixedUpdate中直接调用moveAction.ReadValue(),而是通过回调维护movement变量,这样能保证按住时持续更新,松开时及时重置 - 确保PlayerInput的
Behavior设置为Invoke Unity Events(如果用可视化绑定)
- 不要在
内容的提问来源于stack exchange,提问作者Gaspard GUILLOT
相关产品推荐
相关产品推荐

