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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 01:55:16