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

Unity第三人称角色移动异常:仅向前移动问题排查

问题分析与解决方案

首先看你的代码,核心问题出在方向向量的构建和Translate的使用逻辑上,这也是导致角色只会向前移动的关键原因:

1. 方向向量初始化逻辑错误

你用Vector3 direction = transform.position;把角色当前位置赋值给了direction,这完全搞错了方向向量的定义——方向向量应该是表示移动趋势的向量(而非位置坐标)。后续你对这个位置向量做加减操作后传入Translate,本质是让角色瞬移到偏移后的位置,而非朝着目标方向移动。

2. 未处理相机方向的Y轴干扰

相机在角色后方预制体中,大概率会有俯仰角度(比如向下看向角色),此时camera.transform.forward会包含Y轴分量,直接使用会干扰水平移动逻辑,甚至可能让角色上下偏移。

3. 斜向移动速度异常

当同时按下W+A这类组合键时,你的代码会叠加两个方向向量,最终向量长度会大于1,导致斜向移动速度比单方向更快,这是不符合预期的细节问题。


修正后的代码

public class PlayerInput : MonoBehaviour 
{
    public Camera camera; 
    public float speed; 

    void Update () 
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");

        // 仅当有有效输入时处理移动(避免微小输入干扰)
        if(Mathf.Abs(horizontal) > 0.01f || Mathf.Abs(vertical) > 0.01f)
        {
            // 提取相机的水平方向,移除Y轴分量,保证移动在水平面内
            Vector3 cameraForward = Vector3.Scale(camera.transform.forward, new Vector3(1, 0, 1)).normalized;
            Vector3 cameraRight = camera.transform.right;

            // 基于相机视角构建最终移动方向
            Vector3 moveDirection = cameraForward * vertical + cameraRight * horizontal;
            // 归一化方向,确保单方向与斜向移动速度一致
            moveDirection = moveDirection.normalized;

            // 基于世界空间移动角色,避免本地空间的方向干扰
            transform.Translate(moveDirection * speed * Time.deltaTime, Space.World);
        }
    }
}

关键修复点说明

  • 用Vector3.Scale剔除相机前方向的Y轴分量,确保移动始终保持水平
  • 直接通过输入值与相机方向向量构建移动趋势,而非修改角色位置坐标
  • 对移动方向做归一化处理,避免斜向移动速度异常
  • 使用Space.World参数让Translate基于世界空间执行,适配相机与角色同属一个预制体的场景

如果修复后仍有问题,可以检查两个细节:

  • 相机的Rotation是否被意外锁定或设置了异常角度
  • Unity Input Manager中Horizontal/Vertical轴的配置是否为默认的WASD映射

内容的提问来源于stack exchange,提问作者Rinktacular

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:50:18