Unity 3D角色绕外部轴旋转问题:如何改为绕自身轴旋转?
解决Unity角色绕外部轴旋转的问题
问题出在你旋转玩家时使用了世界空间的Y轴(Vector3.up),而非玩家自身的局部Y轴。当玩家朝向偏离世界正方向时,绕世界Y轴旋转就会呈现出绕身体外某个点转动的效果。
两种可行修复方案:
方案1:绕玩家自身局部Y轴旋转
将player.Rotate的参数从Vector3.up替换为player.up,让旋转基于玩家自身的竖直轴进行:
using System.Collections; using System.Collections.Generic; using UnityEngine; // 注:C#类名建议遵循大驼峰命名规范 public class Visual : MonoBehaviour { public Transform player; float sensibility = 100f; float rotation; void Start () { Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; } void Update () { float x = Input.GetAxis("Mouse X") * Time.deltaTime * sensibility; float y = Input.GetAxis("Mouse Y") * Time.deltaTime * sensibility; rotation -= y; rotation = Mathf.Clamp(rotation, -60f, 60f); transform.localRotation = Quaternion.Euler(rotation, 0, 0); // 改用玩家自身Y轴执行旋转 player.Rotate(player.up * x); } }
方案2:直接控制玩家局部欧拉角(更可控)
单独维护玩家Y轴旋转变量,直接赋值给localRotation,避免累积旋转可能引发的异常:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Visual : MonoBehaviour { public Transform player; float sensibility = 100f; float cameraXRotation; float playerYRotation; void Start () { Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; // 初始化玩家当前Y轴旋转角度 playerYRotation = player.localEulerAngles.y; } void Update () { float x = Input.GetAxis("Mouse X") * Time.deltaTime * sensibility; float y = Input.GetAxis("Mouse Y") * Time.deltaTime * sensibility; cameraXRotation -= y; cameraXRotation = Mathf.Clamp(cameraXRotation, -60f, 60f); // 更新玩家Y轴旋转角度 playerYRotation += x; // 分别设置相机与玩家的局部旋转 transform.localRotation = Quaternion.Euler(cameraXRotation, 0, 0); player.localRotation = Quaternion.Euler(0, playerYRotation, 0); } }
额外建议:
- 建议将相机挂载为玩家对象的子物体,确保玩家移动时视角同步跟随,避免视角与角色位置脱节。
- 类名遵循C#大驼峰命名法(如将
visual改为Visual),提升代码可读性与规范性。
内容的提问来源于stack exchange,提问作者Andrearoma2
相关产品推荐
相关产品推荐

