第一人称移动采用世界空间而非局部空间,需按朝向移动
解决第一人称局部空间移动问题
你的问题核心是当前移动逻辑用的是世界空间向量,要改成跟随物体朝向的局部空间移动,只需要把输入向量转换为物体自身坐标系下的方向即可,修改方案如下:
修改后的代码
// 定义移动速度,根据需求调整数值 public float moveSpeed = 5f; void Update() { float hInput = Input.GetAxis("Horizontal"); float vInput = Input.GetAxis("Vertical"); // 获取物体的局部前向和右向,剔除Y轴分量保证水平移动 Vector3 localForward = transform.forward; localForward.y = 0; localForward.Normalize(); Vector3 localRight = transform.right; localRight.y = 0; localRight.Normalize(); // 计算局部空间下的移动向量 Vector3 movement = localRight * hInput + localForward * vInput; // 归一化处理,避免斜向移动时速度过快 if(movement.magnitude > 1f) { movement.Normalize(); } // 应用移动 rb.MovePosition(rb.position + movement * moveSpeed * Time.deltaTime); }
关键说明
- 用
transform.forward和transform.right获取物体自身的前、右方向,剔除Y轴是为了防止物体倾斜时移动方向跑偏 - 归一化操作是因为斜向移动时,水平和垂直输入的向量叠加后长度会超过1,导致移动速度比单方向快,破坏操作手感
- 新增
moveSpeed变量方便统一控制移动速度,比直接写死数值更灵活
内容的提问来源于stack exchange,提问作者Terraile Thomas
相关产品推荐
相关产品推荐

