主要內容
- 佈局: 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相關的一些輔助方法,來處理——座標轉換、座標獲取、範圍測試等,可以簡化完成某些功能的實現。