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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章