Unity UGUI 原理篇(五):Auto Layout 自動佈局

Auto Layout System

Auto Layout System 是基於 Rect Transform Layout System 之上的系統,自動調整一個或多個的元素大小、位置、間格,又分為 Layout Controllers(父物件) 與 Layout Elements(子物件) 兩部分,一個簡單的 Auto Layout 架構如下 (此處介紹理論,實作留到後面)

AutoLayoutSystem_01

 

 

Layout Element (子物件)

代表著每個元素的大小,擁有資訊如下:

Minimum Width

最小寬度

Minimum Height

 

Preferred Width

優先寬度

Preferred Height

 

Flexible Width

彈性寬度

Flexible Height

 

 

點選UI後,可以在 Inspector 最下方切換為 Layout Properties 看到資訊

LayoutElement_05

LayoutElement_03

 

Layout Controllers 透過不同的佈局方式,取得 Layout Element size 分配子物件,基本原則如下

  • 首先分配 Minimum Size

  • 如果還有足夠空間,分配 Preferred Size

  • 如果還有額外空間,分配 Flexible Size

 

從以下圖片可以看出圖片寬度的增長方式 (此處介紹理論,實作留到後面)

LayoutElement_01

LayoutElement_02

  • 首先分配 Minimum Size (300,紅色部分)

  • 如果還有足夠空間,分配 Preferred Size (300~500,綠色部分)

  • 如果還有額外空間,分配 Flexible Size:1 (500~700,藍色部分)

 

比較特別的是 Flexible,他是代表著整個大小的比例,如果 Layout 下有2個物體,分別給 Flexible 設定為 0.3 與 0.7,那比例就會變成下圖 (3:7)

LayoutElement_04

 

另外要注意的是,TextImage Component 會根據內容大小自動分配 Preferred Size

 

 

Layout Controllers (父物件)

Layout Group

不會控制 Layout Controllers (父物件)自身大小,而是控制子物件大小與位置,在大多數情況下,根據每個元素的 minimum、preferred、flexible 大小分配適當的空間,layout group 之間也可以嵌套,又分為 Horizontal(水平)Vertical(垂直)Grid(格狀) 3種

 

Horizontal Layout Group

HorizontalLayoutGroup_00

水平方向(Width) 排列子物件
組件位置:Unity Menu Item → Component → Layout → Horizontal Layout Group

 

Padding:填充內部空間
Spacing:每個元素間格
Child Alignment:當沒有填滿全部空間時,子物件對齊位置
Child Force Expand:強制控制子物件填滿空間

 

透過實例理解各參數:
A.開新 Scene
Unity Menu Item → File → New Scene
B.新增一個 Canvas
Unity Menu Item → GameObject → UI → Canvas
C.Canvas 下新增空物件,做為 Layout Controllers (以下簡稱父物件)
D.父物件增加 Horizontal Layout Group Component
Unity Menu Item → Component → Layout → Horizontal Layout Group
E.父物件下建立5個 Button(子物件),完成後如下,當大小改變時會自動分配子物件大小

HorizontalLayoutGroup_02

 

F.此時在 Button 的 Rect Transform Component 就不能進行調整,因為我們已經透過 Horizontal Layout Group 進行分配空間,在 Rect Transform 會顯示目前被哪個 Layout Group 控制

HorizontalLayoutGroup_09

 

G.將 Padding 數值調整如圖,可以看出填充區域

HorizontalLayoutGroup_03

 

H.將 Spacing 數值調整如圖,可以看出元素區間

HorizontalLayoutGroup_04

 

I.接下來我們將5個 Button 增加 Layout Element Component 覆蓋預設大小,用於手動設定每個元素的大小
組件位置:Unity Menu Item → Component → Layout → Layout Element
J.此時將 Horizontal Layout Group 的 Child Force Expand Width 取消勾選,不強制子物件填滿額外空間,而是透過 Layout Element 手動設定
K.這裡使用幾種不同的設定,來理解 Horizontal Layout Group 是怎麼取得 Layout Element size 分配子物件
■ 複習一下子物件大小分配方式,如果不清楚請回去上面 Layout Elements 部分
  • 首先分配 Minimum Size
  • 如果還有足夠空間,分配 Preferred Size
  • 如果還有額外空間,分配 Flexible Size

 

■ 將5個 Button 的 Layout Element Min Width 分別改為 20、30、40、50、60,此時可以看出每個 Button 寬度分佈,改變父物件大小時子物件大小並不會改變,因為只有分配 Min Width,並不會分配額外有效空間

HorizontalLayoutGroup_11

 

此時改變 Horizontal Layout Group 的 Child Alignment,可以看出元素對齊

HorizontalLayoutGroup_16

 

父物件 Layout Properties Min Width = 5個按鈕寬(20+30+40+50+60=200) + Spacing(40) + Padding Left、Right(20) = 260

HorizontalLayoutGroup_10

 

■ 現在將第1個 Button 的 Layout Element 數值調整如圖

HorizontalLayoutGroup_13

這邊設定 Preferred Width 為 100
1.首先分配 Minimum Size(20)
2.空間足夠的情況下,將會分配剩下的 Preferred Size (20~100 空間),如下所示

HorizontalLayoutGroup_12

 

■ 現在將第1個 Button 的 Layout Element 數值調整如圖

HorizontalLayoutGroup_14

這邊設定 Flexible Width 為 1
1.首先分配 Minimum Size(20)
2.如果還有足夠空間,將會分配剩下的 Preferred Size (20~100 空間)
3.如果還有額外空間,分配剩下 Flexible Size,如下所示

HorizontalLayoutGroup_15

 

■ 現在將 Horizontal Layout Group 的 Child Force Expand Width 勾選,讓子物件強制填滿
1.首先分配 Minimum Size(20)
2.如果還有足夠空間,將會分配剩下的 Preferred Size (20~100 空間)
3.如果還有額外空間,分配剩下元素 Flexible Size 與 Child Force Expand Width

HorizontalLayoutGroup_17

 

結論:
上面我們看到,所有元素會先被分配 Minimum Size,接下來還有足夠空間,將會分配剩下的 Preferred Size,最後才是 Flexible Size 與 Child Force Expand Width
至此我們了解到 Horizontal Layout Group 是怎麼取得 Layout Element size 分配子物件

 

 

Vertical Layout Group

VerticalLayoutGroup_00

垂直方向(Height) 排列子物件,與 Horizontal Layout Group 只差在水平或是垂直,這邊不在贅述
組件位置:Unity Menu Item → Component → Layout → Vertical Layout Group

 

 

Grid Layout Group

GridLayoutGroup_00

網格方式排列子物件
組件位置:Unity Menu Item → Component → Layout → Grid Layout Group

 

Padding:填充內部空間
Cell Size:每個元素的寬高

GridLayoutGroup_01

 

Spacing:每個元素間格
Start Corner:開始排列的角落(位置),又分為 “左上”、”右上”、”左下”、”右下”,請仔細看元素數字

GridLayoutGroup_02

 

Start Axis:”水平” 或是 “垂直” 排列,請仔細看元素數字

GridLayoutGroup_03

 

Child Alignment:當沒有填滿全部空間時,子物件對齊位置
Constraint:排列限制
Flexible:自動根據大小彈性排列
Fixed Column Count:限制排列 “行數(直)”
Fixed Row Count:限制排列 “列數(橫)”

 

 

Layout Fitter

控制著 Layout Controllers 自身大小,大小取決於子物件,或是設定的大小比例,又分為 Content Size Fitter 與 Aspect Ratio Fitter

 

Content Size Fitter

ContentSizeFitter_00

控制著 Layout Controllers (父物件)自身大小,大小取決於子物件的 Minimum 或是 Preferred 大小,能透過 Pivot 改變縮放方向
組件位置:Unity Menu Item → Component → Layout → Content Size Fitter

 

Horizontal、Vertical Fit:水平、垂直 適應調整
None 不調整
Min Size 根據子物件的 Minimum 大小進行調整
Preferred Size 根據子物件的 Preferred 大小進行調整

 

透過實例理解:
如果我們現在有一個需求,必需要讓 “父物件大小” 根據 “子物件大小” 進行縮放,完成如下 (方便明顯看出父物件大小,增加黑色外框)
ContentSizeFitter_02

 

A.開新 Scene
Unity Menu Item → File → New Scene
B.新增一個 Canvas
Unity Menu Item → GameObject → UI → Canvas
C.Canvas 下新增空物件,做為 Layout Controllers (以下簡稱父物件)
D.父物件增加 Horizontal Layout Group Component
Unity Menu Item → Component → Layout → Horizontal Layout Group
這時如果增加 Button(子物件),上面有提到,Horizontal Layout Group 會根據子物件的 Layout Element 進行分配子物件大小,而不會修改父物件本身的大小,如下所示 (方便明顯看出父物件大小,增加黑色外框)
ContentSizeFitter_01

 

E.父物件下增加 Button(子物件),並增加 Layout Element Component 覆蓋預設大小,Minimum Width 調整為 100
組件位置:Unity Menu Item → Component → Layout → Layout Element

 

F.父物件增加 Content Size Fitter Component,Horizontal Fit 調整為 Min Size,透過子物件 Minimum Width 調整父物件本身大小 (Horizontal 方向其實就是取得子物件 Width)

ContentSizeFitter_04

 

G.此時如果 Button 複製增加,父物件本身的大小也會跟著改變,如下所示

ContentSizeFitter_02

 

H.調整父物件的 pivot,可以控制縮放方向,如下所示

ContentSizeFitter_03

 

I.通過上面實例,我們首先使用 Horizontal Layout Group 排列子物件,並在子物件增加 Layout Element 覆蓋預設大小,最後透過 Content Size Fitter 取得子物件 Layout Element 設定父物件大小,至此父物件大小就會根據子物件大小進行縮放

 

 

Aspect Ratio Fitter

AspectRatioFitter_00

控制著 Layout Controllers 自身大小,按照物件寬高比調整大小,能透過 pivot 改變縮放方向
組件位置:Unity Menu Item → Component → Layout → Aspect Ratio Fitter

 

Aspect Mode:調整模式
None:不調整
Width Controls Height:
基於 Width 為基準,依據比例改變 Height
AspectRatioFitter_01_01
當 Width 改變時,Height 會依比例改變

AspectRatioFitter_01_02

 

Height Controls Width:
基於 Height 為基準,依據比例改變 Width
AspectRatioFitter_02_01
當 Height 改變時,Width 會依比例改變

AspectRatioFitter_02_02

 

Fit In Parent:依據比例將 寬高、位置、anchors自動調整,使此圖形大小在父物件中完全貼齊,此模式可能不會包覆所有空間
調整比例 (方便明顯看出父物件增加黑底)

調整父物件大小,物體會依據比例貼齊父物件

AspectRatioFitter_03_02

 

Envelope Parent:依據比例將 寬高、位置、anchors自動調整,使此圖形大小完全包覆父物件,此模式可能會超出空間
調整比例 (方便明顯看出父物件增加黑框)

調整父物件大小,物體會依據比例包覆父物件

AspectRatioFitter_04_02

 

Aspect Ratio:比例,此數值為 寬/高

 

 

差別:
Content Size Fitter 是透過子物件自動進行調整大小
Aspect Ratio Fitter 是透過數值(寬高比)進行調整

 

 

後記

Auto Layout System 可以快速、方便的排列多個 UI,當大小改變時會自動調整內容,也能應用在多層崁套下,在日後調整與修改上也是非常方便與直覺,是 UI 系統中必學的功能之一 !!

 

 

參考資料

■ Unity – Manual- Auto Layout

http://docs.unity3d.com/Manual/UIAutoLayout.html

■ Unity – Manual- Auto Layout_UI Reference

http://docs.unity3d.com/Manual/comp-UIAutoLayout.html

  • 17
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Unity的UGUIUnity Graphic User Interface)布是通过RectTransform组件来实现的。RectTransform是一种特殊的Transform组件,它可以控制物体在屏幕上的位置、大小和旋转。 UGUI主要有以下几种方式: 1. 相对位置布:使用锚点(Anchor)来设置物体相对于父级容器的位置。通过设置锚点的最小和最大值来确定物体的偏移位置,使用比例来自动适应不同屏幕分辨率。 2. 绝对位置布:直接设置物体的位置坐标(position)来确定其在屏幕上的绝对位置。这种布方式在需要精确控制物体位置时比较常用。 3. 自动布:通过使用Layout组件(如Vertical Layout Group、Horizontal Layout Group)来实现物体的自动排列布Layout组件会根据子物体的尺寸和间距来自动调整其位置和大小,使它们适应容器的尺寸。 4. 网格布:使用GridLayout Group来实现物体的网格布,可以设置行数、列数、间距和边界等参数来控制物体的位置和排列方式。 在使用Unity控制UGUI时,可以通过代码或者编辑器来进行设置。在代码中,可以获取RectTransform组件并通过设置其属性来控制物体的位置、大小和旋转。在编辑器中,可以直接在Inspector面板上通过拖拽和调整参数来实现布控制。 UGUI的设计原则是灵活性和可适应性,可以根据不同的需求和场景来选择合适的布方式。同时,还可以结合动画效果和事件系统来实现更复杂的交互和界面效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值