UGUI __自動佈局

Unity/Auto Layout -- 理解Layout Elements(布局元素) 前言 在UGUI1中,Canvas下的每个GameObject都会自动添加 Rect Transform 组件来控制自身的位置和大小。通常情况下,基于Rect Transform的布局系统已经足够灵活,可以方便地满足大部分UI布局的需要。利用UGUI中的 anchor(锚点)和 pivot(轴点)特性,可以让UI GameObject2实现大部分依赖父容器的定位功能,例如绑定在父容器的左上角或正... 阅读详情

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

 

另外要注意的是,Text、Image 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

Unity--自动版面(Layout Element)||Unity--自动版面(Content Size Fitter) 如果要覆盖布局元素的最小,首选或灵活大小,可以通过向GameObject添加一个Layout Element组件来实现。启用width或height属性时,其旁边会出现一个值字段。使用此值字段输入宽度或高度的确切值。最小和首选尺寸以常规单位表示,而弹性尺寸以相对单位表示。Ignore Layout:(忽略布局)启用后,布局系统将忽略此布局元素Min Width:(最小宽度)此布局元素应具有的最小宽度。Min Height:(最小高度)此布局元素应具有的最小高度。 阅读详情

相关推荐

Unity中的UI系统之UGUI

UGUI是什么UGUI是Unity引擎内自带的UI系统官方称之为:Unity UI是目前Unity商业游戏开发中使用最广泛的UI系统开发解决方案它是基于Unity游戏对象的UI系统,只能用来做游戏UI功能不能用于开发Unity编辑器中内置的用户界面如何在Unity中使用UGUI直接在Hierarchy窗口中右键选择UIUI中所有内容都是UGUI相关控件六大基础组件1、Canvas对象上依附的:①Canvas:画布组件,主要用于渲染UI控件②。

K_CRACKING的博客 7893

Unity所有UGUI组件的基础——Layout Element

问题背景 在我制作人物背包的过程中,需要当鼠标放在物体上时显示一些字符串表示物品的信息,所以我希望所显示的文本框大小以及背景图片大小都能随我填入的文字多少而变化,并且我需要有一个最小宽度,即超出宽度后应当换行竖向增长而不是无限制的横向变长,并且文本应当在背景的中央。 解决方案 层级关系: 我们先分析一下问题,父物体Inspect Window中包含image背景图,它要能够随着子物体Inspect Text大小变化而变化,Inspect Text大小需要根据组件Text中的文字数目变化,并且Inspect

hacning的博客 5824

怎样使用UGUI

什么是 UGUI UGUI 是 Unity 自带的一套 GUI 系统,含有基本的一些 UI 控件。 UGUI 控件有哪些? 我们常用的有 Canvas,Text,Image,Button,Toggle,Slider,Scroll Bar,Scroll View,Input Field。 怎样新建 UI 控件 在 Hierarchy 中右键添加 在菜单栏的 Component 中添加Can

fannyandfly的专栏 1万+

Unity 布局控件

Unity 自适应布局控件

明明明的博客 1923

UGUI导入图集自动设置格式

unity-ugui由于其自身引擎设计,需要对导入的图片设置格式设置,以便更好的引擎支持,一下为自动设置的代码: private static void OnImportTexture (string assetPath) { if(assetPath.Contains(RAW_ATLAS_PATH)) { TextureImporter textureImp...

Rhett 2247

UGUI使用TexturePacker自动打包图集

在游戏开发过程中,图片资源是我们经常打交道的一种很重要的资源,对这部分优化也显得很重要的, 首先想到的是将散图打成一张大图(图集),然后再压缩,到手机上可能还要压缩成ETC格式。说到打图集,一般来说有三种方案: (1) 使用NGUI,这是必须先打出图集然后才能开始做界面,这点有点恶心,放弃。 (2)使用UGUI的SpritePacker,网络上有很多的资料讲述这些,看雨松MOMO的博客。 (

壹支筆的专栏 1054

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

http://www.arkaistudio.com/blog/2016/06/19/unity-ugui-%e5%8e%9f%e7%90%86%e7%af%87%e4%ba%94%ef%bc%9aauto-layout-%e8%87%aa%e5%8b%95%e4%bd%88%e5%b1%80/   目標 Auto Layout System 架構 Layout Element 元素大小 ...

chqj_163的专栏 298

UGUI的事件机制

UGUI使用了新的event机制,我们之前在NGUI中,为了处理ui的交互,通常是在ui组件挂载的mono上写onclick(),onpress()这些函数,换到ugui后,unity使用了新的event 机制。但是unity的文档解释的很乱,这里整理一下。

leon 5751

Unity之UGUI详解

UGUI 文章目录UGUI六大基础组件概述Canvas对象上依附的:CanvasCanvas ScalerGraphic RaycasterRectTransformEventSystem对象上依附的:EventSystemStandalone Input ModuleCanvas画布组件Screen Space overlayScreen Space CameraWorld SpaceCanvasScaler画布缩放控制器组件学前准备:Constant Pixel Size恒定像素模式Scale With

BraveRunTo的博客 3万+

UGUI源码分析:系统总结UGUI的全部内容

序言 嗨,我是Vin129,一名Unity客户端游戏开发者。UGUI应该算Unity客户端开发者们经常接触的东西了,所以该系列文章主旨在于加深对UGUI的了解,深入理解其组件实现原理,以便在日常使用中更加得心应手。其次,多读读源码也是一种成长:) 本系列文章到此已经完结啦!历时一个半月的时间,花费了30+个小时,Markdown记录了17000+内容(有许多代码),这仅仅是自己使用的部分。发布文章,在润色整理并能很好的呈现出来重要的东西,反复推敲,我觉得这上面可能花费的时间要更多。不过分享文章这也是我的初

vin129的博客 3483

Unity3D之UGUI学习EventSystem

坚持 成长 每日一篇 Unity3D之UGUI学习EventSystem

chirs的专栏 6841

Unity UGUI源码解析

前言 这篇文章想写的目的也是因为我面试遇到了面试官问我关于UGUI原理性的问题,虽然我看过,但是并没有整理出完整的知识框架,导致描述的时候可能自己都是不清不楚的。自己说不清楚的东西,别人就等于你不会。每当学完一个东西的时候,应该会大体框架流程,具体实现细节有所了解,然后整理出来,以备日后查阅。人的记忆是有限的,如果不记下来,每次翻的都是别人的博客,这样其实是一个很不好的习惯。所以决定整理出一些自己关于UGUI的了解。以上只是我的牢骚,下面开始今天的内容。 学习方法论与要点整理 在框架之前我们需要先思考,我

菜鸟的学习历程 5792

Unity UGUI的LayoutElement组件详解及使用示例

通过使用LayoutElement组件,我们可以更加方便地控制UI元素的布局行为,提升游戏开发的效率和质量。LayoutElement组件是用于控制布局的一种组件,它可以与其他UGUI组件(如RectTransform、LayoutGroup等)一起使用,用于定义UI元素在布局中的行为。最后,将UI元素的父对象设置为Canvas,并设置了UI元素的尺寸和颜色。通过以上的代码,我们可以在Unity中看到一个具有LayoutElement组件的UI元素,并根据设置的属性进行布局。

XwyMysql的博客 548

【Unity3D-UGUI应用篇】(三)使用UGUI实现层级菜单

推荐阅读 优快云主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 前段时间分享了UGUI的每个组件的属性和使用方法,比如Text、Button、Image、Toggle、InputField、ScrollView等等。 接着分享了UGUI的一些原理,比如说UGUI的渲染模式、UGUI的缩放计算、UGUI的描点定位、UGUI的自动布局等等。.

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 5359

【unity游戏开发入门到精通——UGUI】UGUI自动布局组件

虽然UGUI的RectTransform已经非常方便的可以帮助我们快速布局,但UGUI中还提供了很多可以帮助我们对UI控件进行自动布局的组件。他们可以帮助我们自动的设置UI控件的位置和大小等。注意要参与自动布局的布局元素必须包含布局属性,其实也就是指具备RectTransform的UI组件。一般是布局组件放到父对象上,子对象就是被布局的对象。属性翻译功能Padding填充左右上下边缘的偏移位置。Spacing间距子对象之间的间距。子级对齐九宫格对齐方式。控制子对象的大小。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1945

【UE5】三步搞定Pixel Streaming:从零搭建Windows像素流服务

本文详细介绍了如何在Windows平台上快速搭建UE5 Pixel Streaming像素流服务,从插件安装、项目打包到服务启动的全流程操作。通过实战案例和优化配置,帮助开发者实现零客户端配置、跨设备兼容的高性能3D应用流式传输,特别适合建筑可视化和实时协作场景。

weixin_29000991的博客 318
上一篇: Unity 接入Facebook
下一篇: Shader_UV平移,模拟水流效果
Le_Sam
博客等级 码龄11年 342粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值