一、Rect 是什么 & 核心定位

UnityEngine.Rect结构体(struct),不是 MonoBehaviour 脚本,是Unity引擎中专门用于描述「矩形区域」 的核心数据结构。
✅ 核心作用:定义一个矩形的位置、宽高、尺寸范围,是UGUI布局、GUI绘制、屏幕坐标计算、区域判定的基石类,开发中高频使用。


二、Rect 核心基础 - 5个核心公共字段(必记)

Rect 所有功能都基于这5个核心公共变量,全部是直接访问的公共字段,不是属性(无get/set,直接赋值读取),所有字段均为 float 类型:

  1. x :矩形的「左上角」原点 X 轴坐标
  2. y :矩形的「左上角」原点 Y 轴坐标
  3. width :矩形的宽度(正数有效,0为无宽度)
  4. height :矩形的高度(正数有效,0为无高度)
  5. position :Vector2 类型,等价于 (x, y),快速读写左上角坐标
  6. size :Vector2 类型,等价于 (width, height),快速读写宽高

✅ 重要坐标规则(重中之重,避坑关键)

Unity 的 Rect 坐标体系,默认以「左上角为原点 (0,0)」 ,和我们数学里的「左下角为原点」完全相反!
→ Y轴特性:Y值越大,矩形的位置越靠下;Y值越小,位置越靠上。
比如:Rect(0,0,100,100) 是屏幕左上角的100x100矩形;Rect(0,200,100,100) 是在它正下方200单位的同尺寸矩形。


三、Rect 只读快捷属性(超高频使用,核心必用)

Rect 提供了大量只读的计算属性(只能读取,不能直接赋值),内部是基于 x/y/width/height 计算而来,无需自己写公式,极大提升开发效率,以下是开发中99%会用到的核心属性

1. 矩形的4个顶点坐标

  • min → Vector2:矩形左上角坐标 → 等价 (x, y)
  • max → Vector2:矩形右下角坐标 → 等价 (x+width, y+height)

2. 矩形的中心点坐标

  • center → Vector2:矩形的几何中心点 → 等价 (x + width/2, y + height/2)

常用场景:UGUI锚点居中、矩形居中对齐、以中心为基准偏移位置

3. 矩形的边界极值

  • xMin → float:矩形左边界的X坐标 → 等价 x
  • xMax → float:矩形右边界的X坐标 → 等价 x + width
  • yMin → float:矩形上边界的Y坐标 → 等价 y
  • yMax → float:矩形下边界的Y坐标 → 等价 y + height

4. 其他常用快捷属性

  • centerX/centerY → float:单独获取中心点的X/Y值
  • left/right → float:等价xMin/xMax
  • top/bottom → float:等价yMin/yMax

四、Rect 核心常用方法(开发高频,必掌握)

Rect 内置了一系列实用的成员方法,都是矩形相关的高频业务逻辑,无需自己封装,核心常用方法如下,按使用频率排序

✅ 1. 包含判定:Contains(Vector2 point) → 返回 bool

作用:判断「一个2D坐标点」是否在当前矩形区域内部(含矩形边界)
开发场景:点击判定、拖拽判定、鼠标悬浮判定、UGUI点击区域校验

Rect rect = new Rect(100,100,200,200);
Vector2 mousePos = Input.mousePosition;
if(rect.Contains(mousePos)){
    Debug.Log("鼠标在矩形区域内");
}

✅ 2. 相交判定:Overlaps(Rect other) → 返回 bool

作用:判断「当前矩形」和「另一个矩形」是否存在重叠区域(相交/包含都算)
开发场景:碰撞检测(2D矩形)、UI元素遮挡判定、布局重叠校验

Rect rectA = new Rect(0,0,100,100);
Rect rectB = new Rect(50,50,100,100);
if(rectA.Overlaps(rectB)){
    Debug.Log("两个矩形相交了");
}

✅ 3. 矩形偏移:Offset(float dx, float dy) / Offset(Vector2 delta)

作用:让当前矩形整体偏移指定距离,宽高不变,只改变位置(x/y同步修改)
开发场景:拖拽UI、移动矩形区域、布局微调

Rect rect = new Rect(0,0,100,100);
rect.Offset(50, 50); // 向右偏移50,向下偏移50 → 新坐标(50,50)

✅ 4. 矩形缩放:Expand(float amount)

作用:以矩形的「中心点」为基准,向四周均匀缩放,宽高同时增减 amount*2,位置不变
开发场景:矩形区域放大/缩小、选中高亮时的区域扩展

Rect rect = new Rect(100,100,200,200);
rect.Expand(20); // 宽高变为 240x240,中心点不变

✅ 5. 获取相交区域:Intersection(Rect other) → 返回 Rect

作用:计算「当前矩形」和「另一个矩形」的重叠部分,返回这个重叠区域的新Rect;无重叠则返回空Rect
开发场景:获取两个矩形的交集区域、裁剪重叠内容

Rect rectA = new Rect(0,0,100,100);
Rect rectB = new Rect(50,50,100,100);
Rect interRect = rectA.Intersection(rectB); // 返回 (50,50,50,50) 的矩形

五、Rect 常见构造方式(2种常用写法)

Rect 是结构体,实例化必须传参,开发中只有2种高频构造方式,按需选择即可:

方式1:标准构造(最常用)

// 语法:new Rect(x, y, width, height)
Rect rect = new Rect(100, 200, 300, 400);

方式2:通过 原点+尺寸 构造

// 语法:new Rect(position, size) ,两个参数都是Vector2
Vector2 pos = new Vector2(100,200);
Vector2 size = new Vector2(300,400);
Rect rect = new Rect(pos, size); // 和方式1等价

六、⚠️ 重中之重:Rect vs RectTransform 核心区别(避坑必看)

这是Unity新手最容易混淆的两个概念,也是面试高频考点,两者名字相似,但完全是不同的东西,作用场景毫无重叠,千万不能混用!

✅ 核心区别总表(一目了然)

对比维度 Rect (UnityEngine.Rect) RectTransform (UnityEngine.UI)
类型 结构体(struct) 组件类(Component,继承Transform)
挂载对象 不能挂载,纯数据结构,代码中实例化 必须挂载在UGUI元素上(Image/Text/Button等)
核心作用 描述「一个2D矩形的位置和尺寸」的纯数据 控制「UGUI元素」的布局、锚点、大小、位置、旋转、缩放组件
坐标体系 绝对坐标(如屏幕坐标、世界坐标),左上角为原点 相对坐标(基于Canvas的锚点、父物体),UGUI专属布局坐标
使用场景 GUI绘制、坐标计算、区域判定、2D矩形描述 UGUI界面布局、UI元素的位置/大小调整、锚点适配

✅ 一句话总结区别

Rect 是**「数据」,只用来存矩形的位置和尺寸信息;
RectTransform
「组件」**,是UGUI的核心布局组件,用来控制UI元素的显示和布局。

补充:RectTransform组件内部也封装了Rect类型的属性(rect),可以通过 GetComponent<RectTransform>().rect 获取该UI元素的矩形数据。


✨ 总结(核心知识点速记,建议收藏)

  1. Rect 是结构体,核心作用是「描述2D矩形区域」,是UGUI和GUI的基础;
  2. Rect 核心字段:x/y/width/height(公共字段,可直接读写),左上角为原点,Y值越大越靠下
  3. Rect 核心属性:center/min/max/xMax/yMax(只读计算属性,高频使用);
  4. Rect 核心方法:Contains()(点在矩形内)、Overlaps()(矩形相交)、Offset()(偏移)、Expand()(缩放);
  5. 最关键区别:Rect是数据,RectTransform是UGUI组件,两者无继承、无关联,切勿混用。

以上就是Unity Rect的全部核心知识点,覆盖99%的开发使用场景,吃透这些就完全够用了!