RectTransform繼承于Transform
?????? 上圖中的中間九個(gè)按鈕叫做絕對(duì)布局(也有人叫九宮格),邊上的七個(gè)按鈕叫做相對(duì)布局。上圖只是為了讓用戶更好的操作,下圖才是它的數(shù)值:
???????Anchors的名字叫做錨點(diǎn),其存在最小點(diǎn)與最大點(diǎn),anchormin與anchormax均為向量。
???????在Anchor下面還有一個(gè)屬性叫Pivot,軸心。是坐標(biāo)原點(diǎn)在UI自身左下角的0-1空間向量。
???????設(shè)置紅色框體的Pivot時(shí),其坐標(biāo)系如圖所示,(0,0)表示紅色物體的左下角,(1,1)表示紅色物體的右上角。
???????下圖中黑色框體為父物體,紅色框體為當(dāng)前物體。設(shè)置紅色框體的anchor時(shí),其坐標(biāo)系如圖所示,(0,0)表示父物體的左下角,(1,1)表示父物體的右上角。中間的九個(gè)絕對(duì)布局就是anchormin與anchormax重合。邊上的七個(gè)相對(duì)布局就是anchormin與anchormax分開。
與父UI的關(guān)系:
?????? 當(dāng)UI處于絕對(duì)布局時(shí),軸心點(diǎn)與錨點(diǎn)之間的距離恒定。此時(shí)紅色框體的大小不會(huì)隨父物體的大小變化而變化,位置會(huì)根據(jù)Pivot點(diǎn)到Anchor點(diǎn)的距離一致而改變。
???????當(dāng)UI處于相對(duì)布局時(shí),錨點(diǎn)不再是一個(gè)點(diǎn),而是一個(gè)框子,通常稱之為錨框,有四個(gè)點(diǎn),anchormin表示左下角,anchormax表示右上角。此時(shí)紅色框體的左下角到錨框的左下角距離保持不變,紅色框體的右上角到錨框的右上角距離保持不變。此時(shí)紅色框體的四條邊與錨框的邊間距是固定的,紅色框體的大小隨父物體的大小變化而變化。
Pos (X, Y, Z) ,矩形軸心點(diǎn)(pivot)與錨點(diǎn)(anchors)之間的距離。
Left, Top, Right, Bottom,矩形的四條邊與錨框(anchors)之間的間距。
RectTransform的其他屬性:
?anchoredPosition:在絕對(duì)布局下,該屬性表示的是錨點(diǎn)到pivot的向量;在相對(duì)布局下,unity會(huì)根據(jù)Pivot、AnchorMin和AnchorMax計(jì)算出一個(gè)錨點(diǎn),該屬性表示的是計(jì)算出的錨點(diǎn)到Pivot的向量。
offsetmin、offsetmax:offsetmin表示的是當(dāng)前圖片的左下角相對(duì)錨框的左下角的偏移,offsetmax表示的是當(dāng)前圖片的右上角相對(duì)錨框的右上角的偏移。
絕對(duì)布局如下圖:


相對(duì)布局如下圖:


sizeDelta:尺寸變化量,該屬性表示offsetMax - offsetMin得到的向量,絕對(duì)布局下即從圖片的左下角指向右上角的向量。
sizeDelta可以動(dòng)態(tài)設(shè)置Rect大?。航^對(duì)布局下sizeDelta(x,y)與Rect的寬高是一致的,可以直接通過(guò)sizeDelta的x,y來(lái)動(dòng)態(tài)設(shè)置RectTransform的對(duì)應(yīng)的寬和高;相對(duì)布局下直接調(diào)整sizeDelta可以調(diào)整Rect大小,但是不好理解,通過(guò)offsetMin和offsetMax來(lái)動(dòng)態(tài)調(diào)整Rect的大小比較方便。
Rect:這是一個(gè)只讀屬性,前兩個(gè)參數(shù)是從Pivot指向UI自身左下角的向量,后兩個(gè)參數(shù)是UI自身的width和height。在絕對(duì)布局和相對(duì)布局下輸出一致。
改變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的四個(gè)角在以自身Pivot為原點(diǎn)的坐標(biāo)系中的坐標(biāo)。作為參數(shù)的Vector3數(shù)組需要自己聲明。獲取四個(gè)角的順序是左下、左上、右上、右下。
void GetWorldCorners(Vector3[] fourCornersArray);
該方法表示獲取UI的四個(gè)角在世界坐標(biāo)系的坐標(biāo)。
void SetSizeWithCurrentAnchors(RectTransform.Axis axis,float size);
按照當(dāng)前的anchor信息來(lái)設(shè)置尺寸(實(shí)際上根據(jù)的是pivot,設(shè)置的結(jié)果與anchor無(wú)關(guān)),有兩個(gè)參數(shù),第一個(gè)是Axis類型的值,需要指定一個(gè)方向,水平或垂直;第二個(gè)參數(shù),是本身的寬高。
例:將寬高設(shè)為(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);
設(shè)置當(dāng)前UI相對(duì)父UI邊的距離及當(dāng)前UI的尺寸,第一個(gè)參數(shù)是一個(gè)Edge類型的值,需要指定以父對(duì)象的哪個(gè)邊為基準(zhǔn)(也就是Top、Bottom、Left、Right四個(gè)值之中的一個(gè),即對(duì)齊方式); 第二個(gè)參數(shù),是離指定邊的距離; 第三個(gè)參數(shù),是本身的寬度或者高度。
例:將寬高設(shè)為(100,30),與父UI的右邊間距為0,與底邊間距為0。
RectTransform rt = GetComponent<RectTransform>();
rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Right, 0, 100);
rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Bottom, 0, 30);