RectTransform繼承于Transform
?????? 上圖中的中間九個按鈕叫做絕對布局(也有人叫九宮格),邊上的七個按鈕叫做相對布局。上圖只是為了讓用戶更好的操作,下圖才是它的數值:
???????Anchors的名字叫做錨點,其存在最小點與最大點,anchormin與anchormax均為向量。
???????在Anchor下面還有一個屬性叫Pivot,軸心。是坐標原點在UI自身左下角的0-1空間向量。
???????設置紅色框體的Pivot時,其坐標系如圖所示,(0,0)表示紅色物體的左下角,(1,1)表示紅色物體的右上角。
???????下圖中黑色框體為父物體,紅色框體為當前物體。設置紅色框體的anchor時,其坐標系如圖所示,(0,0)表示父物體的左下角,(1,1)表示父物體的右上角。中間的九個絕對布局就是anchormin與anchormax重合。邊上的七個相對布局就是anchormin與anchormax分開。
與父UI的關系:
?????? 當UI處于絕對布局時,軸心點與錨點之間的距離恒定。此時紅色框體的大小不會隨父物體的大小變化而變化,位置會根據Pivot點到Anchor點的距離一致而改變。
???????當UI處于相對布局時,錨點不再是一個點,而是一個框子,通常稱之為錨框,有四個點,anchormin表示左下角,anchormax表示右上角。此時紅色框體的左下角到錨框的左下角距離保持不變,紅色框體的右上角到錨框的右上角距離保持不變。此時紅色框體的四條邊與錨框的邊間距是固定的,紅色框體的大小隨父物體的大小變化而變化。
Pos (X, Y, Z) ,矩形軸心點(pivot)與錨點(anchors)之間的距離。
Left, Top, Right, Bottom,矩形的四條邊與錨框(anchors)之間的間距。
RectTransform的其他屬性:
?anchoredPosition:在絕對布局下,該屬性表示的是錨點到pivot的向量;在相對布局下,unity會根據Pivot、AnchorMin和AnchorMax計算出一個錨點,該屬性表示的是計算出的錨點到Pivot的向量。
offsetmin、offsetmax:offsetmin表示的是當前圖片的左下角相對錨框的左下角的偏移,offsetmax表示的是當前圖片的右上角相對錨框的右上角的偏移。
絕對布局如下圖:
相對布局如下圖:
sizeDelta:尺寸變化量,該屬性表示offsetMax - offsetMin得到的向量,絕對布局下即從圖片的左下角指向右上角的向量。
sizeDelta可以動態設置Rect大小:絕對布局下sizeDelta(x,y)與Rect的寬高是一致的,可以直接通過sizeDelta的x,y來動態設置RectTransform的對應的寬和高;相對布局下直接調整sizeDelta可以調整Rect大小,但是不好理解,通過offsetMin和offsetMax來動態調整Rect的大小比較方便。
Rect:這是一個只讀屬性,前兩個參數是從Pivot指向UI自身左下角的向量,后兩個參數是UI自身的width和height。在絕對布局和相對布局下輸出一致。
改變RectTransform的top
GetComponent<RectTransform>().offsetMax = new Vector2(GetComponent<RectTransform>().offsetMax.x, top);
改變RectTransform的Right
GetComponent<RectTransform>().offsetMax = new Vector2(right,GetComponent<RectTransform>().offsetMax.y);
改變RectTransform的bottom
GetComponent<RectTransform>().offsetMin = new Vector2(GetComponent<RectTransform>().offsetMin.x, bottom);
改變RectTransform的left
GetComponent<RectTransform>().offsetMin = new Vector2(left,GetComponent().offsetMin.y);
改變RectTransform的width,height
GetComponent<RectTransform>().sizeDelta = new Vector2(width, height);
改變RectTransform的pos
GetComponent<RectTransform>().anchoredPosition3D = new Vector3(posx,posy,posz);
GetComponent<RectTransform>().anchoredPosition = new Vector2(posx,posy);
RectTransform的方法:
void GetLocalCorners(Vector3[] fourCornersArray);?
該方法表示獲取UI的四個角在以自身Pivot為原點的坐標系中的坐標。作為參數的Vector3數組需要自己聲明。獲取四個角的順序是左下、左上、右上、右下。
void GetWorldCorners(Vector3[] fourCornersArray);
該方法表示獲取UI的四個角在世界坐標系的坐標。
void SetSizeWithCurrentAnchors(RectTransform.Axis axis,float size);
按照當前的anchor信息來設置尺寸(實際上根據的是pivot,設置的結果與anchor無關),有兩個參數,第一個是Axis類型的值,需要指定一個方向,水平或垂直;第二個參數,是本身的寬高。
例:將寬高設為(100,30)。
RectTransform rt = GetComponent<RectTransform>();
rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal,100);
rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical,30);
void SetInsetAndSizeFromParentEdge(RectTransform.Edge edge,float inset,float size);
設置當前UI相對父UI邊的距離及當前UI的尺寸,第一個參數是一個Edge類型的值,需要指定以父對象的哪個邊為基準(也就是Top、Bottom、Left、Right四個值之中的一個,即對齊方式); 第二個參數,是離指定邊的距離; 第三個參數,是本身的寬度或者高度。
例:將寬高設為(100,30),與父UI的右邊間距為0,與底邊間距為0。
RectTransform rt = GetComponent<RectTransform>();
rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Right, 0, 100);
rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Bottom, 0, 30);