Unity 中的 Quaternion(四元数)详解

Quaternion 是 Unity 里专门用来表示物体旋转的数学结构,所有 GameObject 的旋转本质都是 Quaternion,你在 Inspector 面板看到的 Rotation (x,y,z) 只是方便查看的欧拉角,底层全是 Quaternion。

它的核心优势:完全避免万向节死锁,旋转计算流畅、稳定,是 Unity 唯一推荐的旋转方式。

一、最核心知识点(必记)

复制代码
不要手动修改 Quaternion 的 x/y/z/w 值!(都是计算用的,看不懂、易改错)
全部用官方提供的 API 实现旋转,安全又简单。
面板上的欧拉角 = transform.eulerAngles,代码里优先用 Quaternion 方法。

二、静态常量(直接用,最常用)

这些是 Unity 预设好的旋转值,一行代码就能用:

cpp 复制代码
Quaternion.identity;       // 无旋转(默认状态,和父物体方向一致)
Quaternion.Euler(0,90,0);  // 按欧拉角旋转(最常用!)

三、最常用 API(90% 场景都用这几个)

  1. 欧拉角 → 四元数(日常开发 No.1)
    把你熟悉的 (x,y,z) 角度,直接转成 Quaternion:
cpp 复制代码
// 物体 Y 轴转 90 度
transform.rotation = Quaternion.Euler(0, 90, 0);

// 每秒绕 Y 轴旋转 30 度
transform.rotation = Quaternion.Euler(0, 30 * Time.time, 0);
  1. 看向目标(怪物 / 炮台看向玩家)
    让物体自动转向指定目标:
cpp 复制代码
public Transform target;

void Update()
{
    // 物体正面始终看向目标
    transform.LookAt(target);
    // 等价写法
    transform.rotation = Quaternion.LookRotation(target.position - transform.position);
}
  1. 平滑旋转 / 缓动旋转(非常常用)
    像 "转头" 一样慢慢转向目标,不生硬:
cpp 复制代码
public Transform target;
public float turnSpeed = 2f;

void Update()
{
    // 计算目标旋转
    Quaternion targetRot = Quaternion.LookRotation(target.position - transform.position);
    
    // 平滑旋转过去
    transform.rotation = Quaternion.Lerp(transform.rotation, targetRot, turnSpeed * Time.deltaTime);
}
  1. 沿某轴旋转(右转、抬头、低头)
cpp 复制代码
// 绕自身 Y 轴(上方向)旋转 30 度
transform.rotation = Quaternion.AngleAxis(30, transform.up);

四、常用实用代码(直接复制)

  1. 让物体永远向前旋转
cpp 复制代码
void Update()
{
    // 自身 Y 轴每秒转 90 度
    transform.Rotate(0, 90 * Time.deltaTime, 0);
}
  1. 随机旋转方向
cpp 复制代码
// 生成一个完全随机的旋转
transform.rotation = Quaternion.Euler(Random.Range(0,360), Random.Range(0,360), 0);
  1. 获取当前旋转的欧拉角
cpp 复制代码
// 获取物体当前的 X/Y/Z 角度(面板上看到的值)
Vector3 angles = transform.eulerAngles;
float yRot = angles.y;

总结

复制代码
Quaternion = Unity 标准旋转格式,替代欧拉角,无死锁。
90% 需求只用这两个:
   Quaternion.Euler(角度) → 直接设置旋转
   Quaternion.Lerp() → 平滑转向
永远不要手动修改 x/y/z/w,用官方 API 最安全。
看向目标用 LookAt,沿轴旋转用 AngleAxis。
相关推荐
mxwin13 小时前
unity shader中 ddx ddy是什么
unity·游戏引擎·shader
郝学胜-神的一滴16 小时前
[简化版 GAMES 101] 计算机图形学 08:三角形光栅化上
c++·unity·游戏引擎·godot·图形渲染·opengl·unreal
nnsix16 小时前
Unity ILRuntime 笔记
unity·游戏引擎
nnsix18 小时前
Unity API 兼容的 .NET Standard 2.1 和 .NET Framework 区别
unity·游戏引擎·.net
mxwin18 小时前
Unity Shader 制作半透明物体 使用多Pass提前写入深度的方式 避免穿模
unity·游戏引擎
nnsix20 小时前
Unity HybridCLR 笔记
笔记·unity·游戏引擎
nnsix21 小时前
Unity Addressables 笔记
unity·游戏引擎
RReality21 小时前
【Unity Shader URP】视差贴图 实战教程
ui·平面·unity·游戏引擎·图形渲染·贴图
小清兔1 天前
Addressable的设置打包流程
笔记·游戏·unity·c#
3D霸霸2 天前
Sourcetree 拉取新工程
数据仓库·unity