Unity FPS角色未按键自动左移问题求助(附脚本代码)
解决角色未按键时持续左移的问题
我仔细看了你的两份脚本代码,逻辑本身是完全没问题的——正常情况下,没按任何按键时Input.GetAxisRaw("Horizontal")应该返回0,最终计算出的移动向量是Vector3.zero,PlayerMotor也就不会执行移动操作。出现持续左移的情况,大概率是Unity的**Input Manager(输入管理器)**配置出了问题,而非脚本代码错误,下面是具体的排查和修复步骤:
1. 优先检查Input Manager的Horizontal轴配置
这是最常见的触发原因:
- 打开Unity编辑器,依次点击
Edit > Project Settings > Input Manager - 在
Axes列表里找到Horizontal轴并展开:- 确认**Gravity(重力)**值不为0:这个参数控制松开按键后输入值回弹到0的速度,设为0的话,输入值会一直停留在最后一次的状态(比如之前按了左方向键,松开后数值不会归零,持续为-1)。建议设置为默认的
3即可。 - 确认**Dead(死区)**值合理:如果你的设备(比如手柄)存在微小的摇杆漂移,设置0.1-0.2的死区可以过滤掉这些误输入。
- 检查Negative Button/Positive Button绑定:确认没有不小心绑定到会持续触发的按键(比如系统级的全局按键,或者误绑了某个一直处于激活状态的外设按键)。
- 确认**Gravity(重力)**值不为0:这个参数控制松开按键后输入值回弹到0的速度,设为0的话,输入值会一直停留在最后一次的状态(比如之前按了左方向键,松开后数值不会归零,持续为-1)。建议设置为默认的
2. 临时测试:替换输入检测方式(验证问题根源)
为了彻底排除Input轴的问题,你可以临时修改PlayerController的输入代码,直接检测具体按键,看看是否还会出现自动左移:
// 替换PlayerController里原来的_xMov计算代码 float _xMov = 0; if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow)) { _xMov = -1; } else if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow)) { _xMov = 1; }
如果修改后角色不再自动左移,就完全可以确定是Input Manager的Horizontal轴配置出了问题。
3. 排查其他潜在原因
- 检查是否有其他脚本在修改PlayerMotor的velocity:比如有没有其他组件在调用
motor.Move()方法,传入了非零的移动向量? - 检查Rigidbody的设置:确认Rigidbody的
Is Kinematic未被勾选,也没有设置Velocity或Angular Velocity的初始值。
按照上面的步骤排查,应该能快速解决你的问题。
内容的提问来源于stack exchange,提问作者Clark Meyer
相关产品推荐
相关产品推荐

