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。
相关推荐
淡海水4 小时前
02-02-原理篇-分代GC
算法·unity·c#·游戏引擎·.net·gc
小贺儿开发7 小时前
Unity 文物新生 会讲故事的文物展墙
人工智能·科技·unity·ai·视频·互动·演示
淡海水12 小时前
02-03-原理篇-大对象堆
unity·c#·游戏引擎·.net·gc
WarPigs1 天前
Unity在Create菜单添加创建自定义脚本模板选项
unity
郝学胜-神的一滴1 天前
C++ Templates 01:拨开迷雾,读懂C++模板经典著作
开发语言·c++·程序人生·游戏·游戏引擎·软件构建
淡海水1 天前
02-01-原理篇-Mark-Sweep与变种算法
算法·unity·c#·游戏引擎·.net·gc
babywang01 天前
Unity笔记--塔防游戏中的ECS架构:从原理到实战的全面解析
unity·ecs架构
babywang02 天前
Unity笔记--AssetBundle详解
unity·游戏引擎
魔士于安3 天前
经典Game
游戏·游戏引擎·贴图·技术美术·模型
淡海水3 天前
01-04-认知篇-Unity内存全景
unity·c#·游戏引擎·.net·gc