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

Unity新输入系统OnMove绑定无法移动玩家问题求助

Unity新输入系统OnMove回调正确实现方案

先确认基础配置

  • 你的Move输入动作必须设置正确:
    • 类型选Value,控制类型设为Vector2(适配方向键/摇杆的二维输入)
    • 绑定好WASD、方向键这类对应输入源

两种靠谱的OnMove绑定方式

方式1:可视化绑定(用PlayerInput组件)

  1. 给玩家对象挂PlayerInput组件
  2. 关联你的Input Action资源,行为类型选「Invoke Unity Events」
  3. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 02:37:16