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

第一人称移动采用世界空间而非局部空间,需按朝向移动

解决第一人称局部空间移动问题

你的问题核心是当前移动逻辑用的是世界空间向量,要改成跟随物体朝向的局部空间移动,只需要把输入向量转换为物体自身坐标系下的方向即可,修改方案如下:

修改后的代码

// 定义移动速度,根据需求调整数值
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 03:44:49