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

Unity中抬头时角色自动前移问题求助(附移动与视角代码)

问题解决:抬头时角色自动移动 + WASD视角相对控制实现

问题根源

原移动代码直接基于角色自身坐标系执行transform.Translate,当角色/相机抬头(X轴旋转)时,自身Z轴方向倾斜,导致移动向量被错误解析,出现无输入时自动向前的异常;同时未基于视角方向计算移动,不符合WASD控制视角相对移动的常规需求。

修正后的Movement代码

public class Movement : MonoBehaviour
{
    public float speed = 10.0f;
    // 在Inspector面板拖入玩家主相机
    public Camera playerCamera;

    void Update()
    {
        float horizontalInput = Input.GetAxis("Horizontal");
        float verticalInput = Input.GetAxis("Vertical");

        // 提取相机的水平方向(忽略抬头低头的X轴旋转,仅保留左右转的Y轴旋转)
        Vector3 cameraForward = playerCamera.transform.forward;
        Vector3 cameraRight = playerCamera.transform.right;
        // 消除垂直方向分量,确保移动始终在水平面
        cameraForward.y = 0;
        cameraRight.y = 0;
        // 归一化避免斜向移动速度过快
        cameraForward.Normalize();
        cameraRight.Normalize();

        // 计算最终移动方向:W/S对应相机前方,A/D对应相机右侧
        Vector3 moveDirection = cameraForward * verticalInput + cameraRight * horizontalInput;

        // 基于世界空间执行移动,确保方向不受角色自身旋转干扰
        transform.Translate(moveDirection * Time.deltaTime * speed, Space.World);
    }
}

Mouselook代码优化(避免角色倾斜)

将视角旋转拆分:相机负责抬头低头(X轴),角色负责左右转向(Y轴),彻底避免角色自身倾斜导致的移动异常:

using UnityEngine;

public class Mouselook : MonoBehaviour
{
    public float sensitivity = 100.0f;
    public float clampAngle = 80.0f;
    // 在Inspector面板拖入玩家角色对象
    public Transform playerBody;

    private float rotX = 0.0f;

    void Start()
    {
        Vector3 rot = transform.localRotation.eulerAngles;
        rotX = rot.x;
        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;
    }

    void Update()
    {
        float mouseX = Input.GetAxis("Mouse X");
        float mouseY = -Input.GetAxis("Mouse Y");

        // 相机单独处理抬头低头(X轴旋转)
        rotX += mouseY * sensitivity * Time.deltaTime;
        rotX = Mathf.Clamp(rotX, -clampAngle, clampAngle);
        transform.localRotation = Quaternion.Euler(rotX, 0, 0);

        // 角色单独处理左右转向(Y轴旋转)
        playerBody.Rotate(Vector3.up * mouseX * sensitivity * Time.deltaTime);
    }
}

配置步骤

  1. 将Movement脚本挂载到角色对象,在Inspector面板中把主相机拖入playerCamera字段。
  2. 将Mouselook脚本挂载到相机对象,在Inspector面板中把角色对象拖入playerBody字段。
  3. 给角色添加Rigidbody组件,勾选Freeze Rotation的X、Z轴,避免角色物理倾斜;保留Box Collider确保碰撞检测正常。

内容的提问来源于stack exchange,提问作者Learn to Sk8

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:31:05