在 Unity 中,TransformRectTransform 是处理游戏对象位置、旋转、缩放的核心组件,但适用场景和功能差异显著。RectTransformTransform 的子类,专门为 UI 元素(UGUI)设计,而 Transform 用于 3D/2D 非 UI 游戏对象。下面从核心区别、关键属性、使用场景、常见操作四个维度详细解析:

一、核心定位与适用场景

特性 Transform RectTransform
继承关系 基础组件,所有游戏对象默认挂载 继承自 Transform,仅 UI 元素(Canvas 下的子对象)默认挂载
适用对象 3D 物体、2D 精灵(Sprite)、空对象等非 UI 元素 Canvas 下的所有 UI 元素(Image、Text、Button、Panel 等)
空间体系 基于世界/局部坐标系的自由 3D/2D 空间 基于锚点(Anchor)+ 轴心(Pivot) 的矩形布局空间,适配 Canvas 渲染模式
核心作用 控制对象在 3D/2D 世界中的位置、旋转、缩放 不仅控制位置,还定义 UI 矩形的大小、锚点、边距,适配不同分辨率

二、关键属性详解

1. Transform 核心属性(通用)

Transform 的属性围绕坐标、旋转、缩放,无布局相关逻辑:

  • position:世界坐标系下的位置(Vector3)。
  • localPosition:相对于父对象的局部位置(Vector3)。
  • rotation:世界坐标系下的旋转(Quaternion)。
  • localRotation:局部旋转(Quaternion)。
  • localScale:局部缩放(Vector3)。
  • eulerAngles:欧拉角(Vector3,更直观的旋转表示)。
  • parent:父 Transform(可通过 SetParent() 修改)。

2. RectTransform 核心属性(UI 专属)

RectTransform 继承了 Transform 的所有属性,新增布局相关核心属性,是 UI 适配的关键:

属性 作用
Anchors(锚点) 定义 UI 矩形的四个锚点(Min/Max),绑定到父 RectTransform 的相对位置,是分辨率适配的核心
Pivot(轴心) UI 矩形的变换中心(旋转/缩放/锚点计算的基准),取值 0~1(如 (0.5,0.5) 是中心)
Anchored Position 相对于锚点的位置(Vector2),UI 位置的核心控制属性(替代 Transform.localPosition)
Size Delta UI 矩形的大小偏移:
- 锚点四角重合时:直接表示宽高(x=宽,y=高);
- 锚点分散时:相对于锚点包围盒的偏移
Rect(Rect) 世界空间中的矩形区域(只读),包含 x/y/width/height,反映最终渲染的矩形范围
Offset Min/Max 锚点最小/最大点与 UI 矩形边缘的偏移,等价于 Size Delta 的底层表示

锚点关键规则

  • 锚点四角重合(如都在父中心):UI 位置由 anchoredPosition 控制,大小由 sizeDelta 直接定义(最常用)。
  • 锚点分散(如左/右绑定父左右边缘):UI 宽度会随父对象宽度自动拉伸,sizeDelta 表示与锚点包围盒的偏移。

三、核心操作对比(代码示例)

1. 位置控制

需求 Transform 实现 RectTransform 实现
设置局部位置 transform.localPosition = new Vector3(10, 20, 0); rectTransform.anchoredPosition = new Vector2(10, 20);
获取世界位置 transform.position rectTransform.position(与 Transform 一致)

2. 大小控制(仅 RectTransform)

// 方式1:直接设置 Size Delta(锚点重合时)
rectTransform.sizeDelta = new Vector2(200, 100); // 宽200,高100

// 方式2:通过 SetSizeWithCurrentAnchors(推荐,适配锚点)
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 200); // 宽200
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 100);   // 高100

// 方式3:修改 Rect(仅锚点固定时生效)
rectTransform.rect = new Rect(0, 0, 200, 100);

3. 锚点与轴心设置

// 设置锚点到父对象左上角(Min/Max 均为 (0,1))
rectTransform.anchorMin = new Vector2(0, 1);
rectTransform.anchorMax = new Vector2(0, 1);

// 设置轴心到左上角(默认是中心 (0.5,0.5))
rectTransform.pivot = new Vector2(0, 1);

4. 父对象设置

// 通用方式(Transform/RectTransform 均可)
transform.SetParent(parentTransform);

// UI 专属:设置父对象并保持锚点/位置不变
rectTransform.SetParent(parentRectTransform, false); // 第二个参数:是否保持世界位置

四、常见坑与注意事项

  1. UI 位置不要用 localPosition/position
    UI 元素的位置应通过 anchoredPosition 控制,直接修改 localPosition 会导致锚点逻辑失效,适配异常。

  2. 锚点分散时 Size Delta 不是实际大小
    若锚点左右绑定父边缘,sizeDelta.x 是「UI 宽度 - 父锚点宽度」,需通过 rectTransform.rect.width 获取实际渲染宽度。

  3. Canvas 渲染模式影响 RectTransform 坐标

    • Screen Space - Overlay:RectTransform 坐标以屏幕左下角为原点;
    • World Space:RectTransform 坐标是世界空间,需结合 Canvas 缩放处理。
  4. Pivot 影响位置和旋转
    修改 Pivot 会改变 UI 的显示位置(如 Pivot 从中心改到左上角,UI 会偏移),需同步调整 anchoredPosition

  5. RectTransform 的 rotation/scale 与 Transform 一致
    UI 旋转/缩放仍用 transform.rotation/transform.localScale,RectTransform 无专属旋转属性。

五、总结

场景 用 Transform 用 RectTransform
3D 物体/2D 非 UI 精灵 ✅ 必选 ❌ 无需使用
Canvas 下的 UI 元素 ❌ 仅继承基础属性 ✅ 必选,控制位置/大小/锚点
控制位置 localPosition/position anchoredPosition(核心)
控制大小 ❌ 无此属性 sizeDelta/SetSizeWithCurrentAnchors
分辨率适配 ❌ 无适配逻辑 ✅ 锚点(Anchors)是核心适配手段

简单来说:非 UI 用 Transform,UI 用 RectTransform 并聚焦锚点/anchoredPosition/sizeDelta,避免混用两套坐标体系。