Unity3D RectTransform使用详解:布局、属性、方法

主要内容

  • 布局: Anchors,Pivot,Anchor Presets
  • 属性: anchoredPosition,anchoredPosition3D,offsetMax,offsetMin,sizeDelta,rect
  • 方法: SetSizeWithCurrentAnchors,SetInsetAndSizeFromParentEdge,RectTransformUtility

Anchors

Anchors是在子类锚在父类上的点,因此如果没有父类(RectTransform),那么RectTransform属性面板上的Anchor Presets将不可设置,但Anchors仍可设置。

所谓,锚在父类上,意思就是子类的Pivot(中心点)到(父类上)Anchors(锚点)的相对位置不变,而这个位置就是RectTransform面板上显示的——PosX,PosY,PosZ——对应了anchoredPosition3D(PosX,PosY,PosZ),或anchoredPosition(PosX,PosY)。

需要注意的是,anchoredPosition3D(PosX,PosY,PosZ)并不是localPosition,除非子类的Anchors与父类的Pivot重合,这样子类的Pivot相对于(子类)Anchors的位置,刚好就是localPosition(子类Pivot相对于父类Pivot的位置)。

那么,Anchors的Min代表了在父类左下角的位置,Max代表了在父类右上角的位置,[0, 1]——的范围代表了在父类X轴和Y轴方向的百分比。

虽然,在Scene中Anchors无法超越父类区域,但在属性面板上,或是代码中(anchorMax,anchorMin,注意代码的数值是面板数值的四舍五入),Anchors均可以超过[0, 1]范围,即:代表父类区域之外。


Anchors的重要作用,就是无论父类如何变化,子类相对于父类上Anchors的相对位置都不变。

Pivot

Pivot代表了RectTransform的中心点,即:相对于RectTransform的坐标(如Anchor或Rotation)都会以它为基准点,(0,0)代表自身区域的左下,(1,1)代表自身区域的右上,如果超过了[0, 1]范围,就说明超过了自身区域之外。

注意与Anchors不同的是,Anchors的[0, 1]范围是——父类区域,而Pivot的[0, 1]范围是——自身区域。

Anchor Presets

Anchor Presets是对Anchors的快捷设置选项,提供了最常用的几种Anchors设置模式,如:上中下,左中右,拉伸。如果不使用这里的预设,通过代码(anchorMax,anchorMin),或是面板属性,也是可以自定义设置的。

选择不同Anchor Presets的选项,可以看到,Scene中的Anchor会自动定位到不同位置。

所谓,拉伸(stretch)就是Max的(x,y)和Min的(x,y)不一致:

  • 可以是x不一致,此时可以选择——上中下。
  • 也可以是y不一致,此时可以选择——左中右。
  • 或是x和y都不一致,此时没有选择——手动调节。

相反,如果Max和Min的x和y对应一致,则说明,Max和Min两点重合,此时重合的一点,可以出现在上中下(y)与左中右(x)相搭配的位置,即:非拉伸的9种选项。

下面,是拉伸的三类情况:

上中下:

在这种情况下,面板上的PosX和Width会被,Left和Right取代。这代表着,RectTransform的区域到Anchors在x方向上的左右距离(类似CSS布局中的padding left right)。

左中右:

在这种情况下,面板上的PosY和Height会被,Top和Bottom取代。这代表着,RectTransform的区域到Anchors在y方向上的上下距离(类似CSS布局中的padding top bottom)。

四角:

当然,也可以自定义,四角的位置:

在这种情况下,面板上的PosX,PosY,Width,Height会被Left,Right,Top,Bottom取代。这代表着,RectTransform的区域到Anchors在xy方向上的四周距离(类似CSS布局中的padding)。

anchoredPosition和anchoredPosition3D

在RectTransform面板上,anchoredPosition3D对应了(PosX,PosY,PosZ),anchoredPosition对应了(PosX,PosY)。

当Anchors重合的时候,Anchors与Pivot的相对位置就是anchoredPosition。

当Anchors分开的时候,Pivot在自身区域的比例,映射到Anchors上的点,再与Pivot的相对位置,就是anchoredPosition。

offsetMax和offsetMin

offsetMin是Anchors左下角到RectTransform左下角的距离。

offsetMax是Anchors右上角到RectTransform右上角的距离。
在这里插入图片描述

sizeDelta

sizeDelta是offsetMax - offsetMin的值,它的几何意义是,RectTransform的区域与Anchors区域的差值,所以:

  • 如果Anchors重合(区域大小为0),那么差值就是RectTransform的区域本身,此时sizeDelta就是面板上Width和Height的数值。
  • 如果Anchors不重合,那么差值就是两个区域的大小差值,此时sizeDelta就不在是Width和Height的数值,面板上也不再显示Width和Height。
  • 如果RectTransform区域大于Anchors区域,那么sizeDelta就是正值,否则就是负值。

rect

rect是RectTransform的区域信息,其中(x,y)是RectTransform左下角到Pivot(不是Anchors)的相对位置,(width,height)是RectTransform区域的大小。

方法

当Anchors不重合的时候,设置sizeDelta就不能正确控制RectTransform的大小,此时可以使用SetSizeWithCurrentAnchors(axis, size)来设置rect的width和height。

// rect width
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 200);
// rect height
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 200);

SetInsetAndSizeFromParentEdge(edge, inset, size)可以根据父类的某个边,设置大小和间距(注意此方法会改变Anchors的位置):

  • edge:是父类的边,Left,Right,Top,Bottom
  • inset:子类边到父类边的间距
  • size:在边方向上的大小,如:Left和Right对应Width,Top和Bottom对应Height
// 以下两个方法
// 可以将子类(Top,Left)边,定位到距离父类(Top,Left)边各100像素的地方
// 并且设置子类大小为(400,400)
SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top,  100, 400);
SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, 100, 400);

另外,RectTransformUtility提供了RectTransform相关的一些辅助方法,来处理——坐标转换、坐标获取、范围测试等,可以简化完成某些功能的实现。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值