Unity第一人称玩家移动速度过慢问题求助
问题分析与修复
核心速度过慢原因
你在FixedUpdate中给Rigidbody.velocity赋值时,错误地乘以了Time.deltaTime。Rigidbody.velocity的单位是米/秒,本身已经是瞬时速度,不需要用Time.deltaTime进行缩放——这个操作会把速度缩小几十倍(Time.deltaTime在FixedUpdate中通常是0.02左右),这就是速度极慢的根本原因。
其他代码问题
除了速度问题,你的脚本还有两个关键错误:
- 玩家旋转逻辑错误:直接使用
cam.transform.rotation.y(四元数的分量)并乘以Time.deltaTime,导致旋转速度几乎为0,且无法正确跟随相机方向。 - 移动向量映射错误:把前后输入(
Vertical)绑定到了左右方向(transform.right),左右输入(Horizontal)绑定到了前后方向(transform.forward),导致移动方向与输入不符。 - 无用的
Up变量:定义后未使用,属于冗余代码。
修复后的完整代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMovement : MonoBehaviour { private Rigidbody RB; [SerializeField] private GameObject cam; private float walkVel; // 前后移动输入 private float strafeVel; // 左右移动输入 [SerializeField] public float walkSpeed = 5f; private void Start() { RB = GetComponent<Rigidbody>(); } private void Update() { walkVel = Input.GetAxis("Vertical"); strafeVel = Input.GetAxis("Horizontal"); } private void FixedUpdate() { // 让玩家跟随相机的Y轴旋转(保持水平方向一致) transform.rotation = Quaternion.Euler(0f, cam.transform.eulerAngles.y, 0f); // 计算移动向量:前后对应forward,左右对应right Vector3 moveDir = transform.forward * walkVel + transform.right * strafeVel; // 保留原Y轴速度(避免抵消重力/跳跃速度),只修改XZ平面速度 RB.velocity = new Vector3(moveDir.normalized.x * walkSpeed, RB.velocity.y, moveDir.normalized.z * walkSpeed); } }
关键修改说明
- 移除
Time.deltaTime:直接用walkSpeed控制米/秒级的速度,恢复正常移动速率。 - 修正旋转逻辑:使用
cam.transform.eulerAngles.y获取相机的水平旋转角度,直接赋值给玩家的Y轴旋转,确保玩家朝向与相机水平方向一致,解决“不沿相机方向移动”的问题。 - 修正移动映射:将
walkVel(前后输入)绑定到transform.forward,strafeVel(左右输入)绑定到transform.right,让输入与移动方向匹配。 - 保留Y轴速度:修改
RB.velocity时保留原有的Y轴分量,避免覆盖重力或后续添加的跳跃逻辑。
补充说明
你之前增大walkSpeed能提升速度,本质是通过放大数值抵消了Time.deltaTime的缩小作用,但这是治标不治本的方案。修复上述问题后,walkSpeed = 5f就能恢复到正常的移动速率。
内容的提问来源于stack exchange,提问作者user18614297
相关产品推荐
相关产品推荐

