Unity角色控制器:解决W+A/D按键移动叠加问题
解决FPS角色控制器斜向移动速度叠加问题
嘿,这个坑我刚学做FPS控制器的时候也踩过!斜着按W+A或者W+D时角色跑得比直走快,其实根源特别简单,咱一步步说清楚:
问题到底出在哪?
你现在的代码是直接把水平、垂直轴的输入值分别乘速度,再组合成向量转换到本地空间。但当两个轴同时有输入时,这个向量的长度会变成√2(大概1.414),相当于速度直接放大了1.4倍,自然就比直走快了。比如当Input.GetAxis("Vertical")和Input.GetAxis("Horizontal")都返回1时,向量(1,0,1)的长度是√(1²+0+1²)=√2,乘速度后就超标了。
超简单的修复方案
核心思路就是先把方向向量归一化,让它的长度始终保持为1,这样不管直走还是斜走,最终速度都是你设定的movementspeed。修改后的代码如下:
// 1. 先获取原始输入方向(别急着乘速度) float horizontalInput = Input.GetAxis("Horizontal"); float verticalInput = Input.GetAxis("Vertical"); Vector3 moveDirection = new Vector3(horizontalInput, 0f, verticalInput); // 2. 归一化方向向量(解决斜向速度叠加) // 加个判断避免轻微输入时向量被不合理放大 if (moveDirection.magnitude > 1f) { moveDirection.Normalize(); } // 3. 转换为本地空间方向,再乘上设定的移动速度 moveDirection = transform.TransformDirection(moveDirection) * movementspeed; // 4. 添加上垂直速度(比如跳跃、重力相关的数值) moveDirection.y = verticalVelocity; // 5. 执行移动逻辑 characterController.Move(moveDirection * Time.deltaTime);
为什么这么改就好使?
- 归一化
Normalize()会把向量的长度强制变成1,不管水平和垂直输入怎么组合,最终的移动方向向量长度都是1,乘上movementspeed后,速度就始终是你想要的大小。 - 加
moveDirection.magnitude > 1f的判断是为了处理输入死区:Input.GetAxis返回的是平滑值,有时候轻微晃键盘/手柄会有很小的输入值,这时候归一化反而会让向量变大,所以只在向量长度超过1的时候才做归一化处理。
新手小提示
要是觉得Input.GetAxis的平滑感太肉,也可以试试Input.GetAxisRaw,它会直接返回-1、0、1的离散值,不过需要自己额外加平滑逻辑。但对于当前的问题,用上面的代码就完全能解决啦!
内容的提问来源于stack exchange,提问作者Ohne Dich
相关产品推荐
相关产品推荐

