Unity新输入系统OnMove绑定无法移动玩家问题求助
Unity新输入系统OnMove回调正确实现方案
先确认基础配置
- 你的Move输入动作必须设置正确:
- 类型选
Value,控制类型设为Vector2(适配方向键/摇杆的二维输入) - 绑定好WASD、方向键这类对应输入源
- 类型选
两种靠谱的OnMove绑定方式
方式1:可视化绑定(用PlayerInput组件)
- 给玩家对象挂
PlayerInput组件 - 关联你的Input Action资源,行为类型选「Invoke Unity Events」
- 在Events列表里找到
Move事件,把玩家脚本拖进去,选择你写的回调方法(比如OnMoveCallback)
方式2:代码动态绑定
在脚本的生命周期方法里绑定/解绑,避免内存泄漏:
private PlayerInput _playerInput; private InputAction _moveAction; private Vector2 _moveInput; // 关键:用类成员变量存输入值 void Awake() { _playerInput = GetComponent<PlayerInput>(); _moveAction = _playerInput.actions["Move"]; } void OnEnable() { // 按下/按住、释放按键都要触发回调更新输入值 _moveAction.performed += OnMoveCallback; _moveAction.canceled += OnMoveCallback; } void OnDisable() { // 必须解绑,防止组件禁用后回调还触发 _moveAction.performed -= OnMoveCallback; _moveAction.canceled -= OnMoveCallback; }
写对OnMove回调逻辑
回调要直接更新类成员变量_moveInput,这样FixedUpdate才能读到正确值:
private void OnMoveCallback(InputAction.CallbackContext context) { _moveInput = context.ReadValue<Vector2>(); // 这里日志能正常输出,说明变量已经更新 Debug.Log($"当前输入:{_moveInput}"); }
FixedUpdate里的无刚体移动逻辑
用保存的输入值计算位移,注意把2D输入转成3D世界空间方向:
public float moveSpeed = 5f; // 移动速度,可在Inspector调 void FixedUpdate() { // 把XY输入转成XZ平面的移动方向(默认Unity世界空间) Vector3 moveDirection = new Vector3(_moveInput.x, 0f, _moveInput.y).normalized; // 用固定时间步长计算位移,保证移动帧率稳定 transform.position += moveDirection * moveSpeed * Time.fixedDeltaTime; }
避坑提醒
- 绝对不能用局部变量存输入值,必须用类成员变量,否则FixedUpdate访问不到
- 一定要绑定
canceled事件,不然松开按键后输入值不会重置为0 - 如果PlayerInput选了「Send Messages」行为,回调方法名必须严格是
OnMove(大小写不能错) - 检查脚本和PlayerInput组件有没有被意外禁用
内容的提问来源于stack exchange,提问作者MuzealnaDotacja
相关产品推荐
相关产品推荐

