基本規律
記住一個對應關係即可
-
Top => 1
-
Middle => 0.5
-
Bottom => 0
-
Left => 0
-
Center => 0.5
-
Right => 1
遞增規律:從左到右(x),從下到上(y)
無論是錨點還是軸心,當 x 或 y 的取值爲:
-
[0, 1]
時,表示點在對象區域內 -
< 0
或>1
時,表示該點在對象範圍之外
錨點(Anchor)
UGUI 中的錨點是用來管理子節點與其父節點相對關係的一個屬性,主要可以分 24 中類型,也可以分爲兩大類:
-
16 種標準的對齊方式:
-
6 種自定義對齊方式:
而不管是上面的哪種方式,本質上都可以通過 RectTransform
中的 Anchors
設置先中的 Min
和 Max
設置不同的值來實現,而通過代碼動態修改錨點的對齊方式便是利用這兩個參數來實現的
1. 16種標準對齊方式對應的 Anchor 設置
直接設置 RectTransform
組件的 anchorMin
和 anchorMax
屬性就可以了,這兩個屬性使用的都是 Vector2
類型的數據,如下:
RectTransform rectTrans = transform.GetComponent<RectTransform>();
-
左上(LeftTop)
rectTrans.anchorMin = new Vector2(0, 1); rectTrans.anchorMax = new Vector2(0, 1);
-
中上(CenterTop)
rectTrans.anchorMin = new Vector2(0.5f, 1); rectTrans.anchorMax = new Vector2(0.5f, 1);
-
右上(RightTop)
rectTrans.anchorMin = new Vector2(1, 1); rectTrans.anchorMax = new Vector2(1, 1);
可以看到大致的規律:Vector 變量中:
-
x:表示從左到右的錨點位置上下限
-
y:表示從下島上的錨點位置上下限
min 表示下限值,max 表示上限值,因此 min 的 x 和 y 必定小於等於 max 的 x 和 y
2. 8種自定義對齊方式和 anchoredPosition
標準對齊方式的參數值只有 0、0.5 和 1 三個取值,而自定義對齊方式的參數值可以是任意值,表示當前錨點在其所綁定節點的垂直和水平方向的一個座標值,起點是左下角。
軸心(Pivot)
Pivot,即轉軸或軸心,是賴以旋轉的基礎。
在 UGUI 中,軸心位置可以直接通過設置 Pivot
屬性來控制,使用的是 Vector2
類型的數據,其中 x 和 y 分別表示軸心在當前對象水平和垂直方向是的一個比例值,如:x = 0.5,y = 0.5 表示垂直和水平方向上的中心點。
可以將當前物體看作一個以左下角爲原點,上限值爲 1 的座標系,軸心就是該座標系中的一個座標點。其中,x 表示水平方向的,y 表示垂直方向
1. 旋轉
當修改當前組件的 Rotation
從而使該 GameObject 旋轉時,便是繞 Pivot 進行的。
-
將 Pivot 設爲 (0.5, 0.5),則軸心在中心點,效果如下:
-
將 Pivot 改爲 (0, 0.5),即軸心在左側中心點,效果如下:
2. 修改大小
修改 Scale
進行縮放修改對象大小的話,也是以軸心爲基礎。同理,當通過組件的 Width 或 Height 修改大小,也是以 Pivot 作爲固定點向外延伸。
-
將 Pivot 設爲 (0.5, 0.5),則軸心在中心點,改變 Width 時以中心往兩邊延伸:
-
將 Pivot 改爲 (0, 0.5),即軸心在左側中心點,改變 Width 只往右側軸心反方向延伸:
3. 代碼設置
可以在代碼中動態修改當前組件的軸心位置:
RectTransform rectTrans = transform.GetComponent<RectTransform>();
rectTrans.pivot = new Vector2(0.5f, 0.5f);// 中心點
rectTrans.pivot = new Vector2(0, 0); // 左下角
動態修改 RectTransform 的 Left, Bottom, Right 和 Top 參數
通過兩個屬性修改:
-
offsetMin:對應 (Left, Bottom)
-
offsetMax:對應 (-Right, -Top)
例如邊距都是 10 的話,用代碼動態設置如下:
RectTransform rectTrans = transform.GetComponent<RectTransform>();
rectTrans.offsetMin = new Vector2(10, 10);
rectTrans.offsetMax = new Vector2(-10, -10);