1.LayoutElement
這個組件能提供組件的最大最小和最合適大小信息,比如Text,Image都是實現(xiàn)了ILayoutElement接口的組件,所以它會自動獲取
如果一個RectTransform的物體的其中一個組件實現(xiàn)了ILayoutElement接口,同時這個RectTransform的物體又添加了Layout Element組件沐兰, 那么起作用的是Layout Element
Image繼承了ILayoutElement赏半,重寫了虛方法贺归,如果沒有圖片就返回0,如果圖片類型是九宮或者重復平鋪類型断箫,那么就返回圖片的原始大小
2.LayoutGroup
LayoutGroups是用來控制子對象位置的拂酣,實現(xiàn)布局,但它不控制自己仲义;當父對象添加了LayoutGroup婶熬,那么子對象的位置不再由子對象自己控制
一共有3種組件如下圖,網(wǎng)格布局(Grid)埃撵、水平布局(Horizontal)赵颅、垂直布局(Vertical),一個游戲物體最多只能添加一個LayoutGroup
-
Horizontal & Vertical Layout Group
水平布局和垂直布局都差不多暂刘,區(qū)別只是一個排列是水平方向饺谬,一個是垂直方向,這里選水平方向來介紹.
Padding:內(nèi)邊距谣拣,可以設(shè)置距離上下左右四個邊框的偏移量
Spacing:表示cell之間的距離募寨,也就是整個布局中每個單元之間的距離
Child Alignment:表示對齊方式
Control Child Size:是否控制子物體的大小(新版UGUI水平和垂直布局都添加了這個選項森缠,網(wǎng)格布局依舊自動控制拔鹰,老版本三個布局組件都默認控制子對象大小)
Child Force Expand:表示自適應 寬 高贵涵,勾選上后所有子物體會被拉伸以至填充滿整個布局容器
-
Grid Layout Group
Cell Size:子物體大小
Start Corner: 子物體排列的角度
Start Axis: 子物體排列的方向
Constraint: Flexible靈活的( 按照父物體長寬自動橫豎行 ) Fixed Column Count 指定列數(shù) Fixed Row Count 指定行數(shù)
一般用空物體來作為布局容器(父物體)然后布局容器下就是很多個格子(cell)了列肢,而一個cell下面可能會放很多圖片,例如說要有一個格子的背景圖片宾茂,然后一個物品圖片瓷马,所以一個cell我們也會用空的gameobject來當父節(jié)點。
3.LayoutControl
LayoutControl主要用于控制組件附加物體的RectTransform刻炒,ContentSizeFitter就是一個LayoutControl組件决采,LayoutGroup下的子物體大小已被控制了自沧,會沖突所以添加不了ContentSizeFitter
-
自動布局的實際運用
1.創(chuàng)建一個空物體作為布局容器(父物體)坟奥,為父物體添加一種布局方式的組件如Grid Layout Group
2.把做好的格子(cell)拖放成Prefab,創(chuàng)建腳本實例化Prefab拇厢,把它設(shè)置為布局容器的子物體即可(setParent)爱谁,Layout Group會根據(jù)大小自動計算布局,注意這個腳本最好掛在布局容器上
總結(jié)
父控件:指的是添加了LayoutGroups組件的GameObject
控件大小信息:指的是控件最小大小孝偎,最合適(期望)大小访敌,控件最大大小
1.1 LayoutElement負責提供該組件所附加的物體的控件大小的信息,不提供位置信息衣盾。只提供大小信息寺旺,并且不直接控制自己的大小爷抓,由其它組件控制.例如,LayoutControl阻塑、LayoutGroups
1.2Text蓝撇,Image本身就實現(xiàn)了ILayoutElement接口,提供了控件大小的信息陈莽,但它的控件大小信息是系統(tǒng)源碼提供的渤昌;如果想修改Text,Image等控件大小的信息走搁,可以給物體添加LayoutElement組件独柑,系統(tǒng)會讀取LayoutElement組件提供的大小
父對象LayoutGroups是如何利用控件提供的大小信息來控制子對象大小和位置,并分配空間的呢私植?
首先忌栅,父對象獲取控件期望的最小的大小,然后分配最小的大小曲稼,即使父控件的空間比子控件的期望大小要小狂秘,子控件也一樣可以獲得它期望的最小值,也就是最小的大小一定能夠得到滿足.
其次躯肌,如果父對象還有足夠的空間者春,那就分配控件的最合適(期望)的大小給控件.
最后,如果父控件分配完最合適(期望)大小之后清女,還有額外空間.則按照控件提供的最大(擴展比率)大小钱烟,按照比率分配額外的空間給控件.
最大值,它是一個相對數(shù)值嫡丙,是0和大于0的數(shù)組成拴袭。該值的意思是表示父控件的多個子控件分配額外空間的一個比率,最大值設(shè)置是在Layout Element的Flexible Width和Flexible Height.
舉個栗子:比如一個父控件下有A曙博、B兩個子控件拥刻,A的最大值是1,B的最大值是2父泳,則表示父控件剩余的空間平分三分般哼,A占用1份,B占用2份,0表示不占用父控件的多余空間.
總之惠窄,父控件分配子控件的大小是按照先保證子控件滿足最小大小的要求蒸眠;然后,如果父控件還有足夠的空間杆融,就分配給子控件按照合適的大欣憧ā;如果還有額外的空間,則分配給子控件比率空間.
再舉個栗子:有A蒋腮、B兩個子控件淘捡,A設(shè)置寬高最小值為0,0池摧,期望值為0案淋,0,最大值2险绘,2踢京,B設(shè)置寬高最小值為0,0宦棺,期望值為100瓣距,100,最大值1代咸,1蹈丸,父控件的大小為160×160.
- 第一輪 按照最小值分配給A、B呐芥,得到A逻杖、B控件的大小都為0,0
- 第二輪 父對象此時空間依然還是160×160思瘟,空間足夠荸百,按照適合大小進行分配,A適合大小0滨攻,0够话,B適合大小100,100
- 第三輪 分配完父容器還剩余60×60光绕,還有額外空間女嘲,則按照A、B設(shè)置的最大值平分分配诞帐,A最大值2欣尼,B最大值1,一共3份停蕉,60/3=20愕鼓,每份20,那么A分到的就是40×40谷徙,B分到的就是20×20拒啰,加上之前分配的驯绎,則A控件大小是40×40完慧,B控件大小120×120,分配完畢.