RectTransform详解

本文深入解析Unity中的RectTransform组件,它是UI对象定位、尺寸调整和旋转的核心。内容包括Anchors的概念,如何通过anchorMin和anchorMax实现绝对布局和相对布局,以及Pivot、Offset、sizeDelta、anchoredPosition的含义和作用。同时介绍了SetSizeWithCurrentAnchors和SetInsetAndSizeFromParentEdge等方法用于动态调整UI元素的布局,并提供了相关代码示例。此外,还提到了GetWorldCorners方法用于获取UI元素在世界坐标系中的角落位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

在这里插入图片描述
RectTransform组件继承自Transform, 它控制UI对象的位置,尺寸,旋转和坐标系原点等信息。
除了Canvas外,每个带有RectTransform组件的对象并不能单独存在,必须是另一个带有RectTransform组件对象的子节点。
这也能说明为什么当我们创建一个UI对象的时候,Unity会自动为我们创建一个Canvas对象,并且将该对象至于Canvas的子节点。

Anchors

Anchors是UI对象在其父节点矩形区域的锚心位置,它由两个值组成,anchorMin和anchorMax。
在这里插入图片描述
anchorMin和anchorMax是一个Vector2类型的变量,x,y 的取值在0-1之间,对应于所在点位置占据父节点区域的对应轴向上的百分比。那么父节点的左下角就是Vector2(0,0), 右上角则为(1,1)。

当我们设置anchorMin和anchorMax的值的时候,将会出现以下几种情形。

  1. anchorMin == anchorMax
    在这里插入图片描述
    在这里插入图片描述
    当锚心位置重合,可设置属性如上图。锚心点重合又称作绝对布局,即UI对象的大小并不受父节点的影响,保持不变。位置信息则是 Pivot 与 锚心位置的 向量差。

  2. anchorMin.x == anchorMax.x && anchorMin.y !=c anchorMax.y
    在这里插入图片描述
    在这里插入图片描述
    x点重合,y点不重合,可见y轴上有一定的距离差,那么我们可以设置PosX与锚心点的距离差,但是PosY将变成与父节点上下边的距离,当父节点的高度发生变化,子节点将始终保持与父节点的上下边框的距离。

  3. anchorMin.x != anchorMax.x && anchorMin.y == anchorMax.y
    在这里插入图片描述
    在这里插入图片描述
    x点不重合,y点重合,可见x轴上有一定的距离差,那么我们可以设置PosY与锚心点的距离差,但是PosX将变成与父节点左右边的距离,当父节点的宽度发生变化,子节点将始终保持与父节点的左右边框的距离。

  4. anchorMin.x != anchorMax.x && anchorMin.y != anchorMax.y
    在这里插入图片描述
    在这里插入图片描述
    当x,y 均不相等,那么锚心点将形成一个矩形框,我们设置的是每条边到对应锚框的边的距离。

当锚心点重合,我们称之为绝对布局,当锚心点不相等时,则形成了相对布局,通过以上对anchor的分析,我们也能理解,为什么我们的RectTransform组件需要依赖于父对象的RectTransform组件。

Pivot

在这里插入图片描述
pivot 是节点自身的坐标系原点位置,Vector2 类型,取值为0-1,表示自身对应轴向上的百分比。
在绝对布局下,PosX和PosY的值就是Pivot到锚点的值。

Offset

OffsetMax:
OffsetMax: 矩形框右上角坐标 - AnchorMax所在坐标
OffsetMin: 矩形框左下角坐标 - AnchorMin所在坐标

在锚框的情况下我们可以在代码里面动态的去调整UI元素相对边界的距离,其次更重要的是,利用这这两个值就可以计算出sizeDelta的值

sizeDelta

sizeDelta = OffsetMax - OffsetMin

  1. 在锚点情况下,offsetMax和offsetMin的起点相同,根据向量相减的三角形法则可以得到一个新的向量,这个新的向量的X和Y的大小正好UI元素的宽和高相等,所以在这个时候去设置sizeDelta的值,可以直接调整UI元素的大小
    在这里插入图片描述
  2. 在锚框的情况下,offstMax减去offsetMin,得到的将不再是UI元素的大小这个向量代表的物理意义是,sizeDelta.x值就是UI元素的宽度与的锚框宽度的差值,sizeDelta.y的值就是UI元素的的高度与的锚框高度的差值(sizeDelta.x:UI宽度 - 锚框宽度;sizeDelta.y:UI高度 - 锚框高度)
    在这里插入图片描述

anchoredPosition

通过直接设置anchoredPosition的值可以改变UI元素的位置,但也是要分锚点和锚框的情况。

  1. 在使用锚点的情况下,anchoredPosition表征的是元素Pivot到Anchor的距离
  2. 在使用锚框的情况下,anchoredPosition表征的是元素Pivot到锚框中心点的距离

rect

在本地坐标系中对象的矩形框。
width: UI的框
height: UI的高
x: 左下角.x相对于Pivot.x 的距离
y: 左下角.y相对于Pivot.y 的距离
在这里插入图片描述

方法简介

SetSizeWithCurrentAnchors(Axis axis, float size);

这个方法无论在绝对布局还是相对布局的情况下,都可以通过直接设置rect中的width和height值来改变UI元素的大小。

  	public RectTransform rt;
    // Start is called before the first frame update
    void Start()
    {
        rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 50);
        rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 50);
    }

SetInsetAndSizeFromParentEdge(Edge edge, float inset, float size);

可以根据父物体的Edge(某一边)去布局。其中第一个参数就是用于确定基准的边,第二个参数是UI元素的该边界与父物体该边界的距离,第三个元素是设定选定轴上UI元素的大小

首先以右边界为基准

private RectTransform rectTransform;
// Use this for initialization
void Start()
{
    rectTransform = GetComponent<RectTransform>();
    rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Right, 200, 400);
    //这种情况下我选定父物体的右边界为基准,结果如下图
}

在这里插入图片描述
然后以下边界为基准

 private RectTransform rectTransform;
// Use this for initialization
void Start()
{
    rectTransform = GetComponent<RectTransform>();
    //rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Right, 200, 400);
    rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Bottom, 200, 400);
}

在这里插入图片描述
在使用这个方法的时候要注意锚点也会改变,改变的规则为

  • 以左边界为基准时,anchorMin和anchorMax 的y不变x变为0.
  • 以右边界为基准时,anchorMin和anchorMax 的y不变x变为1.
  • 以上边界为基准时,anchorMin和anchorMax 的x不变y变为1.
  • 以下边界为基准时,anchorMin和anchorMax 的x不变y变为0.

GetWorldCorners(Vector3[] fourCornersArray)

可以取得UI元素四个角的世界坐标,具体使用方法,先建立一个长度为4的vector3数组,然后传进这个方法,调用一次后,数组被赋值,里面的四个元素分别是UI的左下角 ,左上角,右上角,右下角。

  private RectTransform rectTransform;
    // Use this for initialization
    void Start()
    {
        rectTransform = GetComponent<RectTransform>();
        Vector3[] corners = new Vector3[4];
        rectTransform.GetWorldCorners(corners);
        foreach (Vector3 corner in corners)
            Debug.LogWarning(corner);
    }

在这里插入图片描述

文章引用地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

静水流深&1111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值