Unity3D第一人称游戏斜坡行走时相机异常旋转问题求助
问题原因与解决方案
核心问题
你同时启用了两套鼠标视角控制逻辑(fpc script中的MouseAiming方法和MouseLookScript),两者互相干扰;另外直接用transform.Translate移动时,玩家对象会因地形碰撞产生非Y轴旋转,进而带动相机异常转动。
解决步骤
移除冲突的视角控制代码
删除fpc script中的MouseAiming方法,同时删掉Update方法里对MouseAiming()的调用,只保留KeyboardMovement()的调用。保留MouseLookScript作为唯一的视角控制逻辑(它采用Unity新输入系统,稳定性更强)。替换移动逻辑为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); }
确保玩家对象仅绕Y轴旋转
MouseLookScript中已经通过playerBody.Rotate(Vector2.up, mouseX)只控制玩家的Y轴旋转,CharacterController默认不会让玩家因地形碰撞产生X/Z轴倾斜,可避免此类问题。检查脚本挂载位置
MouseLookScript挂载在相机对象上,相机的父对象为玩家对象fpc script挂载在玩家对象上
内容的提问来源于stack exchange,提问作者jop frenken
相关产品推荐
相关产品推荐

