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

Unity 3D新手求助:如何实现玩家沿相机朝向的第一人称移动?

Unity玩家沿相机视角方向移动实现方案

原代码存在的问题

  • 基于玩家自身坐标系计算移动,方向不会随相机视角变化
  • 用else if判断按键,导致W+A这类组合按键无法触发斜向移动
  • 手动处理S键反向属于冗余操作,Input.GetAxis("Vertical")在按下S时会自动返回负值

修正后的实现代码

using UnityEngine;

public class PlayerCameraMovement : MonoBehaviour
{
    public Rigidbody rb;
    public float moveSpeed = 5f;
    public Camera playerCamera;

    void Start()
    {
        // 自动获取主相机(没手动指定时)
        if (playerCamera == null)
        {
            playerCamera = Camera.main;
        }
    }

    void FixedUpdate()
    {
        // 读取输入轴:W/S对应Vertical,A/D对应Horizontal
        float verticalInput = Input.GetAxis("Vertical");
        float horizontalInput = Input.GetAxis("Horizontal");

        // 提取相机的水平前方向(剔除Y轴,避免上下移动)
        Vector3 cameraForward = Vector3.Scale(playerCamera.transform.forward, new Vector3(1, 0, 1)).normalized;
        // 相机的水平右方向
        Vector3 cameraRight = playerCamera.transform.right;

        // 计算最终移动方向(基于相机坐标系)
        Vector3 moveDirection = (cameraForward * verticalInput + cameraRight * horizontalInput).normalized;

        // 应用移动(忽略输入死区的微小值)
        if (moveDirection.magnitude > 0.1f)
        {
            rb.MovePosition(rb.position + moveDirection * moveSpeed * Time.deltaTime);
        }
    }
}

关键逻辑说明

  • 相机方向适配:用Vector3.Scale去掉相机前方向的Y轴分量,保证玩家始终在水平面上移动,不会跟着相机抬头/低头上下飘
  • 输入逻辑优化:直接读取Input.GetAxis的正负值,自然支持前进、后退、左右平移,以及W+A这类斜向组合移动
  • 物理交互正确性:在FixedUpdate中调用rb.MovePosition,贴合Unity物理更新的时序,避免移动卡顿或者和场景物体的物理冲突
  • 新手友好配置:Start方法自动获取主相机,不用手动拖入也能运行

新手配置步骤

  1. 给玩家对象添加Rigidbody组件,勾选Freeze Rotation的X/Y/Z轴(防止移动时玩家旋转),根据需求决定是否取消Use Gravity
  2. 将脚本挂载到玩家对象上,若没手动指定playerCamera,脚本会自动获取场景中的主相机
  3. 在Inspector面板调整moveSpeed数值(建议5-10之间,根据游戏手感微调)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:06:15