Unity新输入系统迁移问题:重写玩家控制器后角色无法移动
问题排查与修复方案
核心bug:读取了输入却没实际使用
你在Update里已经通过_input.Player.Move.ReadValue<Vector2>()拿到了玩家的移动输入,但MoveNick方法里根本没用到这个传入的moveDirectrion,反而一直在用没赋值的_horizontalInput和_verticalInput——这俩变量默认是0,角色当然动不了。
修复代码
把传入的输入值用上就行,直接修改MoveNick方法:
private void MoveNick(Vector2 moveDirectrion) { if (GameFlow.isMovementFreezed) { _animator.SetInteger("UpDown", 0); _animator.SetInteger("Side", 0); return; } // 从传入的输入方向里提取横竖轴的值 float horizontal = moveDirectrion.x; float vertical = moveDirectrion.y; Vector2 position = _rigidbody2d.position; position.x += _speed * horizontal * Time.deltaTime; position.y += _speed * vertical * Time.deltaTime; _animator.SetInteger("UpDown", vertical < 0 ? -1 : (int)Math.Ceiling(vertical)); _animator.SetInteger("Side", horizontal < 0 ? -1 : (int)Math.Ceiling(horizontal)); _rigidbody2d.MovePosition(position); }
嫌麻烦的话也可以直接简化位置计算:
position += _speed * moveDirectrion * Time.deltaTime;
额外要检查的地方
- 确认
GameFlow.isMovementFreezed是不是被误设成true了,要是这个值为真,移动逻辑会直接跳过。 - 检查Input System的自动生成类:你用的
InputSystem必须是Unity根据你的Input Action Asset自动生成的(创建Asset时要勾选Generate C# Class),不然输入读取会失效。 - 看Rigidbody2D的设置:确保Body Type是Dynamic,别设成Kinematic或Static;也检查下有没有其他脚本锁了角色位置。
内容的提问来源于stack exchange,提问作者GoldAnd
相关产品推荐
相关产品推荐

