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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 16:22:55