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

Unity FPS控制器鼠标俯仰时移动方向反向问题求助

问题根因

问题出在FPSInput脚本的位移计算逻辑:代码在给移动向量赋值重力参数后,直接调用transform.TransformDirection()对包含重力的整个三维向量做了世界空间转换。当角色存在俯仰角(X轴旋转)时,原本仅作用于Y轴的重力会被分解到Z轴方向:向上俯仰时重力分解出向前的位移分量,向下俯仰时分解出向后的位移分量,和你观测到的异常表现完全吻合。

修复方案

将水平面移动的坐标转换逻辑与重力计算拆分,重力不需要跟随角色旋转做坐标转换,直接在世界空间Y轴生效即可,修正后的FPSInput代码如下:

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(CharacterController))]
[AddComponentMenu("Control Script/FPS Input")]
public class FPSInput : MonoBehaviour
{
    public float speed = 6.0f;
    public float gravity = -9.8f;
    private CharacterController _charController;

    void Start()
    {
        _charController = GetComponent<CharacterController>();
    }

    void Update()
    {
        // 仅对水平移动向量做本地坐标转世界坐标处理
        float deltaX = Input.GetAxis("Horizontal") * speed;
        float deltaZ = Input.GetAxis("Vertical") * speed;
        Vector3 horizontalMovement = new Vector3(deltaX, 0, deltaZ);
        horizontalMovement = Vector3.ClampMagnitude(horizontalMovement, speed);
        horizontalMovement = transform.TransformDirection(horizontalMovement);

        // 重力单独赋值,不参与旋转转换,直接作用于Y轴
        Vector3 finalMovement = horizontalMovement;
        finalMovement.y = gravity;
        finalMovement *= Time.deltaTime;
        
        _charController.Move(finalMovement);
    }
}

附加优化建议

可以调整MouseLook脚本的挂载结构:将左右旋转(X轴鼠标输入)逻辑挂在角色根对象,俯仰旋转(Y轴鼠标输入)逻辑挂在角色根节点下的相机子节点,保证角色根对象永远不会存在X轴旋转,从架构层面避免后续出现同类位移异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 07:54:04