Unity的Rect
一、Rect 是什么 & 核心定位
UnityEngine.Rect 是结构体(struct),不是 MonoBehaviour 脚本,是Unity引擎中专门用于描述「矩形区域」 的核心数据结构。
✅ 核心作用:定义一个矩形的位置、宽高、尺寸范围,是UGUI布局、GUI绘制、屏幕坐标计算、区域判定的基石类,开发中高频使用。
二、Rect 核心基础 - 5个核心公共字段(必记)
Rect 所有功能都基于这5个核心公共变量,全部是直接访问的公共字段,不是属性(无get/set,直接赋值读取),所有字段均为 float 类型:
x:矩形的「左上角」原点 X 轴坐标y:矩形的「左上角」原点 Y 轴坐标width:矩形的宽度(正数有效,0为无宽度)height:矩形的高度(正数有效,0为无高度)position:Vector2 类型,等价于(x, y),快速读写左上角坐标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坐标 → 等价xxMax→ float:矩形右边界的X坐标 → 等价x + widthyMin→ float:矩形上边界的Y坐标 → 等价yyMax→ float:矩形下边界的Y坐标 → 等价y + height
4. 其他常用快捷属性
centerX/centerY→ float:单独获取中心点的X/Y值left/right→ float:等价xMin/xMaxtop/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元素的矩形数据。
✨ 总结(核心知识点速记,建议收藏)
- Rect 是结构体,核心作用是「描述2D矩形区域」,是UGUI和GUI的基础;
- Rect 核心字段:
x/y/width/height(公共字段,可直接读写),左上角为原点,Y值越大越靠下; - Rect 核心属性:
center/min/max/xMax/yMax(只读计算属性,高频使用); - Rect 核心方法:
Contains()(点在矩形内)、Overlaps()(矩形相交)、Offset()(偏移)、Expand()(缩放); - 最关键区别:Rect是数据,RectTransform是UGUI组件,两者无继承、无关联,切勿混用。
以上就是Unity Rect的全部核心知识点,覆盖99%的开发使用场景,吃透这些就完全够用了!