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

Unity3D第一人称游戏斜坡行走时相机异常旋转问题求助

问题原因与解决方案

核心问题

你同时启用了两套鼠标视角控制逻辑(fpc script中的MouseAiming方法和MouseLookScript),两者互相干扰;另外直接用transform.Translate移动时,玩家对象会因地形碰撞产生非Y轴旋转,进而带动相机异常转动。

解决步骤

  1. 移除冲突的视角控制代码
    删除fpc script中的MouseAiming方法,同时删掉Update方法里对MouseAiming()的调用,只保留KeyboardMovement()的调用。保留MouseLookScript作为唯一的视角控制逻辑(它采用Unity新输入系统,稳定性更强)。

  2. 替换移动逻辑为CharacterController(推荐)
    直接使用transform.Translate无法处理地形倾斜时的移动稳定性,改用CharacterController组件:

  • 给玩家对象添加CharacterController组件
  • 修改fpc script代码如下:
    public float turnSpeed = 4.0f;
    public float moveSpeed = 2.0f;
    public float minTurnAngle = -90.0f;
    public float maxTurnAngle = 90.0f;
    private CharacterController cc;
    
    void Awake()
    {
        cc = GetComponent<CharacterController>();
    }
    
    void Update()
    {
        KeyboardMovement();
    }
    
    void KeyboardMovement()
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
    
        // 基于相机方向计算移动,仅保留水平平面(XZ轴)的方向
        Vector3 camForward = Camera.main.transform.forward;
        Vector3 camRight = Camera.main.transform.right;
        camForward.y = 0;
        camRight.y = 0;
        camForward.Normalize();
        camRight.Normalize();
    
        Vector3 moveDir = camForward * vertical + camRight * horizontal;
        cc.Move(moveDir * moveSpeed * Time.deltaTime);
    }
    
  1. 确保玩家对象仅绕Y轴旋转
    MouseLookScript中已经通过playerBody.Rotate(Vector2.up, mouseX)只控制玩家的Y轴旋转,CharacterController默认不会让玩家因地形碰撞产生X/Z轴倾斜,可避免此类问题。

  2. 检查脚本挂载位置

  • MouseLookScript挂载在相机对象上,相机的父对象为玩家对象
  • fpc script挂载在玩家对象上

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:40:34