Unity中如何降低玩家后退、左右移动时的移动速度?
优化角色移动速度差异化的实现方案
不用单独判断每个WASD按键,那样既破坏Input.GetAxis自带的平滑输入效果,还会让代码冗余难维护。更简洁的方式是基于输入轴的方向,给不同的移动方向设置速度系数,具体实现如下:
首先在你的类里定义几个可调节的速度系数(建议设为公开变量,方便在Unity Inspector里实时调整数值):
public float walkSpeed = 5f; public float sprintSpeed = 10f; public float forwardSpeedMultiplier = 1f; // 前进速度倍率(正常) public float backwardSpeedMultiplier = 0.7f; // 后退速度倍率(更慢) public float strafeSpeedMultiplier = 0.8f; // 侧移速度倍率(较慢) private CharacterController controller; private float currentSpeed;
然后修改你的移动逻辑代码:
void Update() { // 先处理冲刺切换,避免延迟一帧生效 currentSpeed = Input.GetKey(KeyCode.LeftShift) ? sprintSpeed : walkSpeed; float x = Input.GetAxis("Horizontal"); float z = Input.GetAxis("Vertical"); // 给不同方向的输入应用对应的速度倍率 float adjustedX = x * strafeSpeedMultiplier; float adjustedZ = z * (z > 0 ? forwardSpeedMultiplier : backwardSpeedMultiplier); Vector3 move = transform.right * adjustedX + transform.forward * adjustedZ; // 保持移动向量的最大长度为1,避免斜向移动速度过快 if (move.magnitude > 1) move.Normalize(); controller.Move(move * currentSpeed * Time.deltaTime); }
方案优势:
- 保留了
Input.GetAxis的平滑输入特性,移动过渡更自然 - 代码简洁易维护,调整速度倍率只需修改变量值,不用加一堆if判断
- 可以在Inspector里实时调整各个方向的速度,方便调试
额外说明:
原代码里把speed的赋值放在controller.Move之后,会导致按下LeftShift的第一帧速度没更新,所以调整到了输入处理的最前面,让速度切换更及时。
内容的提问来源于stack exchange,提问作者dangoqut132
相关产品推荐
相关产品推荐

