How to Develop a Game
Unity Build-in Types
PublishDate: 2025-06-01 | CreateDate: 2025-06-01 | LastModify: 2025-06-01 | Creator:ljf12825

Unity内建类型

1.空间/几何类型(Transform相关)

类型说明
Vector2, Vector3, Vector4表示二维/三维/四维向量
Quaternion四元数,表示旋转
Matrix4x44×4 矩阵,常用于转换
Bounds包围盒(中心+尺寸)
Ray, RaycastHit射线检测相关类型
Plane表示一个无限平面
Rect二维矩形区域
Color, Color32表示颜色(线性空间和 sRGB)

Vector

Vector2Vector3Vector4

它们是Unity提供的三个核心向量类型,广泛用于位置、方向、速度、缩放、颜色等各种场景

向量类型维度作用
Vector22D 向量,包含 x, y用于 2D 空间中的位置、速度等
Vector33D 向量,包含 x, y, z用于 3D 空间中的大多数情况
Vector44D 向量,包含 x, y, z, w用于更高级的计算,如齐次坐标、shader 编程

Vector2(二维向量)

Vector2 position = new Vector2(1.5f, 3.0f);

常见用途:

Vector3(三维向量)

Vector3 direction = new Vector3(0f, 1f, 0f); //向上
transform.position += direction * Time.deltaTime;

常见用途:

API

Static Properties
这些属性是Vector3结构体的常用快捷方式,简化了常见的方向或特殊值的表示,使得代码更简洁易读

PropertyDescription
back等价于 Vector3(0, 0, -1)
down等价于 Vector3(0, -1, 0)
forward等价于 Vector3(0, 0, 1)
left等价于 Vector3(-1, 0, 0)
negativeInfinity等价于 Vector3(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity),表示-∞
one等价于 Vector3(1, 1, 1)
positiveInfinity等价于 Vector3(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity),表示+∞
right等价于 Vector3(1, 0, 0)
up等价于 Vector3(0, 1, 0)
zero等价于 Vector3(0, 0, 0)

Properties

PropertyDescription
magnitude返回此向量的长度(只读)。
normalized返回基于当前向量的标准化向量。标准化后的向量长度为 1,并与当前向量方向相同。如果当前向量太小,返回零向量。
sqrMagnitude返回此向量的平方长度(只读)。
this[int]通过 [0][1][2] 分别访问向量的 x、y、z 分量。
x向量的 x 分量。
y向量的 y 分量。
z向量的 z 分量。

Constructors

COnstructorDescription
Vector3创建一个三维向量或点

Public Methods

MethodDescription
Equals如果给定的向量与当前向量完全相等,返回 true
Set设置现有 Vector3 的 x、y 和 z 分量。
ToString返回该向量的格式化字符串表示。"(x, y, z)"

Static Methods

MethodDescription
Angle计算两个向量之间的夹角。
ClampMagnitude返回一个新的向量,最大长度被限制为 maxLength
Cross计算两个三维向量的叉积。
Distance计算两个三维点之间的距离。
Dot计算两个三维向量的点积,定义在相同坐标空间中。
Lerp在两个点之间进行线性插值。
LerpUnclamped在两个向量之间进行线性插值,不限制插值范围。
Max返回一个由两个向量中最大分量组成的向量。
Min返回一个由两个向量中最小分量组成的向量。
MoveTowards计算一个位置,当前位置到目标位置的最大移动距离不超过 maxDistanceDelta
Normalize将向量标准化,使其长度为 1。
OrthoNormalize使两个向量都标准化并且相互正交。
Project将一个向量投影到另一个向量上。
ProjectOnPlane将一个向量投影到一个平面上。
Reflect将向量反射到由法线定义的平面上。
RotateTowards将一个向量 current 旋转到目标向量 target,并计算旋转。
Scale逐分量地将两个向量相乘。
SignedAngle计算两个向量之间相对于某一轴的带符号夹角。
Slerp在两个三维向量之间进行球面线性插值。
SlerpUnclamped在两个向量之间进行球面线性插值,不限制插值范围。
SmoothDamp逐渐地将向量朝着目标位置变化,随着时间变化。

Operators

OperatorDescription
operator -将一个向量从另一个向量中减去。
operator !=如果两个向量不同,则返回 true
operator *将一个向量与一个数值相乘(逐分量相乘)。
operator /将一个向量与一个数值相除(逐分量相除)。
operator +两个三维向量进行逐分量加法。
operator ==如果两个向量大致相等,则返回 true

Unity官方文档(Vector3)

Vector4(四维向量)

Vector4 v = new Vector4(1, 2, 3, 4);

常见用途:

Quaternion & Euler Angles

在Unity中,Quaternion是用来表示旋转的核心数学结构,它避免了Euler Angles的万向节死锁问题,并且适用于平滑插值和复杂3D计算

Quaternion

Quaternion表示绕某一条单位轴旋转一个角度的这个过程,简单来说:表示一个旋转

数学本质 四元数是一种复数扩展:

Q = w + xi + yj + zk

在Unity中被表示为:

public struct Quaternion
{
    public float x;
    public float y;
    public float z;
    public float w;
}

x, y, z表示旋转轴的向量部分(方向)
w表示旋转的角度部分(cos(θ/2))

四元数不是角度 + 轴直接拼成的,是通过以下方式构造:

x=axis.x⋅sin(θ/2)
y=axis.y⋅sin(θ/2)
z=axis.z⋅sin(θ/2)
w=cos(θ/2)

其中axis是归一化的旋转轴向量
θ是旋转角度(弧度)

你可以把四元数想象成一个旋转操作,它编码了两个信息:

Quaternion用途

用途场景描述
表示物体旋转替代 transform.rotation = new Vector3(...),更稳定
做平滑旋转(Slerp/Lerp)保持插值平滑、不跳跃、不变形
实现摄像机跟随平滑跟随目标的朝向
构建旋转动画可结合 Timeline、Animator 使用
控制角色面向看向目标、追踪方向等

Quaternion API

方法/属性说明
Quaternion.identity零旋转(即不旋转)
Quaternion.Euler(x, y, z)从欧拉角创建旋转
Quaternion.LookRotation(dir)让对象朝向某个方向
Quaternion.Angle(a, b)计算两个旋转之间的角度
Quaternion.AngleAxis(float angle, Vector3 axis)围绕axis旋转angle度
Quaternion.Slerp(a, b, t)在两个旋转之间平滑插值(匀速)
Quaternion.Lerp(a, b, t)线性插值旋转(不推荐用于大角度)
Quaternion.RotateTowards(a, b, maxDegreesDelta)限制最大旋转角度的平滑旋转
* 运算符(例如 rot * vector将旋转应用于向量,旋转该方向向量

构建方式

Quaternion q = Quaternion.AngleAxis(90, Vector3.up); //绕Y轴旋转90°

使用欧拉角构建:

Quaternion q = Quaternion.Euler(0, 90, 0); //XYZ分别是绕X Y Z轴的角度

Euler Angles

欧拉角的定义
欧拉角是用三个角度来描述3D空间中的一个旋转变换,每个角度表示围绕一个坐标轴的旋转量。
在Unity中,欧拉角就是一个Vector3

transform.eulerAngles = new Vector3(30, 45, 0);

这表示:

欧拉角的本质是「分轴顺序旋转」,三个角度 + 一个旋转顺序(X -> Y -> Z),顺序不能出现问题,否则结果不同

欧拉角的特点

特点描述
直观直接写角度,容易理解和调试
顺序敏感顺序不同,结果不同(ZYX ≠ XYZ)
有死锁当某个轴旋转到特定位置时,另一个轴“失效”——万向节死锁(Gimbal Lock)
插值难在两个角度之间插值时可能会突然“跳动”或绕远路

欧拉角适用于:

实际旋转逻辑中,建议使用Quaternion

Euler Angels和Quaternion的关系
Unity内部几乎不直接用欧拉角进行旋转运算,它会自动把你设置的欧拉角转换为四元数

transform.eulerAngles = new Vector3(0, 90, 0);
// 实际上自动转换为:
transform.rotation = Quaternion.Euler(0, 90, 0);

欧拉角插值出现的问题

Vector3 from = new Vector3(0, 0, 0);
Vector3 to = new Vector3(0, 360, 0);

Vector3 result = Vector3.Lerp(from, to, 0.5f); //会插值到180°

实际上,从0°到360°最短路径时0°,这就是欧拉角插值跳变的问题
使用四元数可以避免

Quaternion q1 = Quaternion.Euler(from);
Quaternion q2 = Quaternion.Euler(to);

Quaternion qResult = Quaternion.Slerp(q1, q2, 0.5f);

Euler Angles和Quaternion的转换
欧拉角 -> 四元数

Quaternion q = Quaternion.Euler(30, 45, 60);

四元数 -> 欧拉角

Vector3 euler = q.eulerAngles;

四元数本身不会存储旋转顺序和原始角度,这个反转换可能会出现不寻常的角度,比如-180°、350°等

欧拉角和四元数的关系:三次独立的XYZ轴旋转(Euler Angle)相当于对于某个特定轴旋转特定角度(Quaternion)
深入原理 给定欧拉角 (𝛼, 𝛽, 𝛾),表示绕 X、Y、Z 旋转,四元数变换公式如下(XYZ顺序):

Quaternion q = Quaternion.Euler(alpha, beta, gamma);

等价于

Quaternion qx = Quaternion.AngleAxis(alpha, Vector3.right);
Quaternion qy = Quaternion.AngleAxis(beta, Vector3.up);
Quaternion qz = Quaternion.AngleAxis(gamma, Vector3.forward);
Quaternion q = qy * qx * qz; //组合旋转,顺序重要;Unity为左乘

万向节死锁(Gimbal Lock)
Gimbal Lock是指使用欧拉角进行三维旋转时,当两个旋转轴重合,导致自由度从3变成2,某个方向的旋转无法表达的情况
产生Gimbal Lock的核心原因是欧拉角的特性:
一组欧拉角描述一个旋转过程:即,围绕每个轴的旋转角度和围绕每个轴旋转的顺序,顺序很重要,不同的顺序会带来不同的结果 Gimbal Lock产生的核心是:先执行旋转的轴会带动后执行旋转的轴转动,即产生新轴;但后执行旋转的轴不会带动先执行旋转的轴转动,即一个轴旋转过后就不会出现新轴了,这就会出现轴重合问题,即导致万向节死锁的产生
数学本质是矩阵乘法的非交换性
旋转在数学上是用矩阵表示的:

核心关键是为什么后旋转的轴不能带动先旋转的轴?
这个问题涉及到旋转的执行顺序本质上是“嵌套变换”,而不是“同步协商”的。这就像流水线的工序,是不可逆和不可交错的
核心结论:
每一步旋转都是在“当前局部坐标系”下完成的,而不是回头修改前面坐标系的历史状态
后面的旋转只是在前面旋转结果基础上叠加,它并不会“回头影响”之前已经旋转过的坐标系
举个例子: 假设做一个蛋糕:
第一步:打鸡蛋
第二步:加牛奶
第三步:搅拌
现在你问:为什么我搅拌的时候不能回头改变我打鸡蛋这个过程?
因为:打鸡蛋已经做完了,是个不可逆的状态变换,你在搅拌的时候,只能处理“鸡蛋 + 牛奶”的混合物,不能改变已经打完的蛋

数学视角:矩阵乘法是方向性的 旋转是通过矩阵来表示的,顺序matters: FinalRotation = Rz · Ry · Rx
你先执行Rx,然后再执行Ry,再执行Rz
每个旋转操作都是将当前状态乘上一个旋转矩阵
一旦Rx被应用,坐标系就已经变了
之后的Ry是在这个变了的坐标系下进行的
Ry不会也无法回头修改Rx的效果
因为矩阵乘法不是可交换的,所以这个顺序是“单向嵌套”,不是“双向影响”

欧拉角是旋转变换,每次旋转变换都是叠加了上次旋转的状态后再进行的,也就是说,虽然每次变换都是独立的,但都要经历从初始状态按顺序旋转,绕轴旋转角度达到目标状态这一系列流程,这就把时序包含在其中了
初始状态是(0,0,0)

为什么看到的变换是连续的
欧拉角变换虽然顺序嵌套,但它们构成的是一个连续函数映射
欧拉角 → 四元数 → 变换矩阵 → 渲染出模型的姿态 整个链条中:

欧拉角:你手动输入的 (X, Y, Z) 是连续的(例如你拖动滑块)

四元数:Unity 把欧拉角转换成一个四元数,这是一个连续光滑的旋转表示

矩阵:四元数再转成 3×3 旋转矩阵,依然是平滑的

模型:在世界中展示的姿态是自然旋转、连贯变化的

所以你看到的旋转是连续的、平滑的。

哪些地方是不连续的
1.万向节死锁,当某个周旋转到90°,两个轴重合,自由度减少,Unity为了保持“姿态”,可能会自动调整其他轴的值,此时Rotation的值再Inspector中跳变,但物体并没有跳
2.四元数存在加减号不唯一(180°对称)问题,一个方向可以由两个四元数表示:q和-q,它们作用在物体上是一样的,Unity在背后自动选择最短路径,所以视觉上依旧是连续旋转路径上的最短旋转

Matrix4×4

在 Unity 中,Matrix4x4 是一个 4x4 的矩阵,通常用于表示和处理 3D 图形变换(例如:平移、旋转、缩放)以及投影变换。它是 Unity 中进行图形学计算时不可或缺的工具之一,特别是在操作坐标系变换和投影时,矩阵起到了重要作用。

结构和基本概念

一个 4x4 的矩阵包含 16 个元素,用来存储 3D 空间中的变换信息。矩阵通常表示为:

$$ \begin{bmatrix} m_00 & m_01 & m_02 & m_03\ m_10 & m_11 & m_12 & m_13\ m_20 & m_21 & m_22 & m_23\ m_30 & m_31 & m_32 & m_33 \end{bmatrix} $$

Matrix4×4的常见用途

  1. 变换(Transformations) 在3D图形中,变换通常包含平移(Translation)、旋转(Rotation)和缩放(Scaling),这些都可以通过矩阵来表示。矩阵变换是通过矩阵与向量的乘法实现的
  1. 矩阵乘法 多个变换(如平移、旋转、缩放)可以通过矩阵乘法结合起来。例如,将旋转和缩放变换合并到一个矩阵中,执行复合变换。
Matrix4x4 rotationMatrix = Matrix4x4.Rotate(Quaternion.Euler(0, 45, 0));
Matrix4x4 scaleMatrix = Matrix4x4.Scale(new Vector3(2, 2, 2));
Matrix4x4 combinedMatrix = rotationMatrix * scaleMatrix; // 复合变换
  1. 投影矩阵 投影矩阵用于将 3D 场景投影到 2D 屏幕上。常见的投影有 正射投影 和 透视投影。
  1. 视图矩阵(View Matrix) 视图矩阵用于描述相机在场景中的位置和朝向。它把世界空间中的物体转换到相机的视图空间

API

Static Properties

PropertyDescription
identity返回单位矩阵(只读)
zero返回零矩阵(只读)

Properties

PropertyDescription
decomposeProjection该属性接受一个投影矩阵并返回定义投影视锥体的六个平面坐标。
determinant返回矩阵的行列式(只读)。
inverse返回该矩阵的逆矩阵(只读)。
isIdentity检查此矩阵是否为单位矩阵(只读)。
lossyScale尝试从矩阵中获取一个缩放值(只读)。
rotation尝试从矩阵中获取一个旋转四元数。
this[int, int]访问矩阵中的元素,使用 [row, column] 索引。
transpose返回矩阵的转置矩阵(只读)。

Public Methods

MethodDescription
GetColumn获取矩阵的某一列。
GetPosition从矩阵中获取位置向量。
GetRow返回矩阵的某一行。
MultiplyPoint使用此矩阵对一个位置进行变换(通用)。
MultiplyPoint3x4使用此矩阵对一个位置进行快速变换(适用于 3x4 矩阵)。
MultiplyVector使用此矩阵对一个方向进行变换。
SetColumn设置矩阵的某一列。
SetRow设置矩阵的某一行。
SetTRS将此矩阵设置为一个平移、旋转和缩放矩阵。
ToString返回此矩阵的格式化字符串表示。
TransformPlane返回一个在空间中经过变换的平面。
ValidTRS检查此矩阵是否是一个有效的变换矩阵(平移、旋转、缩放组合矩阵)。

Static Methods

MethodDescription
Frustum返回一个具有视景体(viewing frustum)的投影矩阵,近平面由传入的坐标定义。
Inverse3DAffine计算一个 3D 仿射矩阵的逆矩阵。
LookAt创建一个“Look At”矩阵,使物体朝向指定的目标点。
Ortho创建一个正交投影矩阵。
Perspective创建一个透视投影矩阵。
Rotate创建一个旋转矩阵。
Scale创建一个缩放矩阵。
Translate创建一个平移矩阵。
TRS创建一个平移、旋转和缩放的组合矩阵。

Operators

OperatorDescription
operator*两个矩阵相乘

Application

Application是Unity提供的一个全局静态类,用来获取或控制应用程序的整体运行状态,比如游戏生命周期、平台信息、版本号、退出应用、持久化路径、事件系统等
可以理解为:Application = 游戏运行时的全局控制台

API

Static Properties

分组属性用途简述
应用信息productName应用产品名
companyName公司名
version应用版本号
unityVersionUnity 运行时版本
buildGUID构建唯一标识
cloudProjectId云项目 ID
identifier包名 / Bundle ID
installerName安装来源(商店)
installMode安装模式
sandboxType沙盒环境类型
平台与运行环境platform当前运行平台
isMobilePlatform是否移动平台
isConsolePlatform是否主机平台
isEditor是否在编辑器运行
isBatchMode是否批处理模式
absoluteURL当前 URL / 深度链接
systemLanguage系统语言
internetReachability网络可达性
数据路径dataPath游戏数据路径(只读)
persistentDataPath持久化数据路径(可写)
streamingAssetsPathStreamingAssets 路径
temporaryCachePath临时缓存路径
consoleLogPath日志文件路径
运行状态isPlaying是否正在运行
isFocused是否获得焦点
runInBackground后台运行开关
backgroundLoadingPriority后台加载优先级
targetFrameRate目标帧率
exitCancellationToken退出时取消令牌
安全与验证genuine应用是否被篡改
genuineCheckAvailable是否可用完整性检查

Static Methods

分组方法描述典型用途
场景与运行控制CanStreamedLevelBeLoaded(string levelName)检查指定场景是否可以加载(适用于流式加载)场景预检测,避免加载不存在的场景
Unload()卸载 Unity PlayerWebGL、嵌入式 Unity 内容的卸载
日志与调试GetStackTraceLogType(LogType logType)获取指定日志类型的堆栈跟踪模式日志调试策略
SetStackTraceLogType(LogType logType, StackTraceLogType stackTraceType)设置指定日志类型的堆栈跟踪模式减少无关堆栈信息,提高性能
权限与授权HasUserAuthorization(UserAuthorization mode)检查用户是否授权使用麦克风或摄像头(iOS/WebGL)设备访问控制
RequestUserAuthorization(UserAuthorization mode)请求用户授权麦克风/摄像头(iOS/WebGL)首次访问硬件设备时使用
许可证与广告HasProLicense()检查当前 Unity 是否为 Pro 许可证编辑器功能限制判断
RequestAdvertisingIdentifierAsync(Action<string, bool, string> callback)请求广告标识符(iOS/UWP)广告分析、用户追踪(需遵守隐私法规)
运行状态IsPlaying(Object obj)检查对象是否在运行环境中(Play 模式或构建版本)运行时逻辑分支判断
系统交互OpenURL(string url)打开外部链接或资源跳转到网页、商店、帮助文档
Quit()退出应用程序游戏退出按钮

注意事项

  1. Quit()在编辑器中无效,只在构建版本中退出
  2. 权限方法仅在特定平台有效(iOS、WebGL),Android需要用原生接口
  3. 广告ID受隐私政策限制(iOS 14+ 必须先获得用户同意)
  4. Unload()主要用于WebGL等嵌入环境,不适用于独立应用
  5. 日志堆栈设置可以优化性能,但会影响调试信息完整性

Events

事件名触发时机常见用途注意事项
deepLinkActivated当 App 通过 Deep Link URL 被激活时(Android / iOS / UWP)处理外部 URL 跳转,例如从浏览器点击链接直接打开游戏并跳转到特定场景仅在移动端/UWP生效,需要在系统设置好 Deep Link
focusChanged当应用程序获得或失去焦点时暂停/恢复游戏逻辑、音乐播放、计时器等Application.runInBackground 配合使用
logMessageReceived在主线程收到 Debug.Log/Debug.LogError/Debug.LogWarning 时触发收集运行时日志、保存到文件、上传服务器仅主线程调用,性能安全
logMessageReceivedThreaded任意线程收到日志信息时触发捕获多线程环境下的日志(Job System、线程池等)回调不在主线程,访问 Unity API 会报错
lowMemory当设备内存不足时触发释放不必要的资源、清理缓存常见于移动设备,尤其是低端机
memoryUsageChanged当内存使用量显著变化时触发做内存优化监控,比如动态调节贴图分辨率Unity 2021.2+ 新增功能
onBeforeRender在渲染前调用(尤其是 VR 输入更新)VR/AR 场景中,在渲染前同步姿态数据用途很小众,主要面向 XR
quitting应用退出时触发保存存档、上传数据、关闭网络连接有时不一定能保证执行完,比如强杀进程
unloadingPlayer 卸载时触发卸载前释放资源(场景卸载、资源清理)常与 Addressables 资源卸载配合
wantsToQuit应用想要退出时触发,可拦截弹出“是否退出”确认框通过返回 false 阻止退出

Delegates

委托作用常用场景签名
AdvertisingIdentifierCallback获取设备广告 ID(Ad ID / IDFA)广告投放、用户追踪void(string advertisingId, bool trackingEnabled, string error)
LogCallback自定义日志处理日志系统、异常上传void(string condition, string stackTrace, LogType type)
LowMemoryCallback低内存回调清缓存、卸载贴图void()
MemoryUsageChangedCallback内存使用变化回调实时内存监控、自适应性能void(long memoryUsage)

Color

Color是UnityEngine命名空间下的一个非常核心的结构体,它的本质是RGBA颜色表示

定义

public struct Color
{
  public float r; // 红色分量
  public float g; // 绿色分量
  public float b; // 蓝色分量
  public float a; // 透明度
}

API

  1. Constructor
public Color(float r, float g, float b);
public Color(float r, float g, float b, float a);
  1. Static Properties 各种颜色 Color.aliceBlue.ToString() RGBA(0.9411765f, 0.9725491f, 1f, 1f)

  2. Properties

| Property | Description | | a | Alpha component of color(0 is transparent, 1 is opaque) | | b | Blue component of color | | g | Green component of color | | r | Red component of color | | gamma | 返回应用Gamma矫正的颜色 | | linear | 返回从sRGB转换为Linear空间的颜色 | | grayscale | 返回灰度值 | | maxColorComponent | 返回r, g, b三个分量中的最大值 | | this[int index] | 索引访问器,允许用数组的方式访问颜色分量, 0, 1, 2, 3对应r, g, b, a |

// TODO: gamma and linear and sRGB

  1. Public Methods
MethodDescription
Equalsrbga均相等
GetHashCode返回该颜色的哈希值
ToString返回颜色的标准字符串
  1. Static Methods
MethodDescription
HSVToRGBHSV转RGB (HSV是色相、饱和度、明度颜色模型)
RGBToHSVRGB转HSV
Lerppublic static Color Lerp(Color a, Color b, float t); 从颜色a到颜色b的线差转换,速率为t
LerpUnclamped非钳制插值,参数无范围限制

使用

  1. 材质颜色
renderer.material.color = Color.red;
  1. UI颜色
GetComponent<Image>().color = new Color(1, 1, 1, 0.5f);
  1. Gizmos绘制
Gizmos.color = Color.yellow;
Gizmos.DrawSphere(transform.position, 1f);

Color32

以32位格式表示RGBA颜色,每个颜色分量都是一个字节值,范围从0到255

Color使用float,精度高,Color32使用byte,更适合和贴图、GPU数据交互

Color c = new Color(1f, 0f, 0f, 1f);
Color32 c32 = new Color32(255, 0, 0, 255);

二者可以隐式转换

Color c = (Color) new Color32(128, 200, 255, 255);
Color32 c32 = (Color32) Color.green;

ColorColor32可以和Vector4进行转化

Vector4 newV4 = new Color(0.3f, 0.4f, 0.6f);