| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 游戏开发 -> Unity/Auto Layout -- 理解Layout Elements(布局元素) -> 正文阅读 |
|
[游戏开发]Unity/Auto Layout -- 理解Layout Elements(布局元素) |
太长不看版: 1. UGUI两套布局系统:Rect Transform系统, AutoLayout系统 . Rect Transform系统: Canvas下的每个GameObject都会自动添加? ?.AutoLayout系统:复杂的嵌套和动态布局,主要基于? 2.?狭义上说, 广义上说,?
3.?? 4.? Layout Controllers派系的组件
前言 然而,另外的一些需要父容器依赖子类的UI功能,仅仅使用Rect Transform则很难做到。例如,让Text文本框的大小根据字数动态变化;让列表的长度根据列表项的数量动态变化等等。它们可能满足以下条件中的一条和多条: 容器的具体大小在设计阶段无法提前预知 概念 自动布局系统是基于最基础的 Rect Transform 来构筑的,它可以使用在任何一个包含 Rect Transform 的元素上。 自动布局系统主要基于 layout elements 和 layout controllers 两种概念 。本文着重介绍 layout elements。 Layout Elements 正因为广义上说所有UI GameObject都或多或少地扮演了 Layout Element的角色,所以每个UI GameObject都可以在其对应的Inspector面板中找到自身的Layout Properties参数。下面是一个新建的Text组件的Layout Properties示意图: 实际情况和图片不符? Layout Properties(布局属性) Minmum width 以Text为例来测试,默认情况下Text会根据文本的内容和字体大小都因素来修改Preferred width 和 Preferred height。当没有任何文本时,Preferred width为 0,Preferred height为16(与Font Size等属性有关,表示一行的高度);在Text一栏随意添加几行内容,会发现Preferred width 和 Preferred height会根据文本的行宽和行高来动态变化。 除此之外,如果对Text自带的布局属性不满意,我们也可以通过手动添加一个 Layout Element 组件(即狭义含义)来修改其中的任何一项属性,该组件设置的属性优先于Text,Image等内置组件,并且可以同时存在多个,它们的优先级可以通过 “Layout Priority”来调节。 深入 表面上看,虽然Text在文本改变时也会动态修改UI GameObject自身的布局属性,但是它们并没有对该元素在UI中的位置和大小等信息进行任何影响。Text组件依然会在Rect Transform中指定好的区域中渲染绘制,而这些属性完全是在游戏运行前手动指定的。所谓的Layout Element 完全没有贡献一丝一毫的力量。 事实上, Layout Element具有一个UI GameObject动态布局时所需要的特定信息,但是它本身并不会负责设置这些信息。还记得Auto Layout的两大基本概念么?另一个Layout Controller就是负责读取 Layout Element包含的信息,然后控制一个UI元素实际的大小的。如果没有手动添加Layout controller派系的组件,UI GameObject上的Layout Element完全就是摆设,它就是你空调上那些永远不会用到的按钮,因为你的空调根本久没有安装这些功能。 所以为了演示Layout Element的真实价值,本文还是不得不使用Layout Controllers派系的组件来配合演出,但主角依然是我们的 Layout Element。 Layout Property 如何发挥光和热 Minmum width/height 最先被分配,不带任何妥协 探索实验之旅开始。。 实际上,Horizontal Layout Group属于Layout Group的一种,用于快速创建一种横向的布局结构,如果把UI GameObject作为子类放在其下,它们就会像排队一样整齐地展开。 准备工作 随后在 Parent,Child1以及Child2上分别添加一个Image组件,用于直观地显示三种容器的大小。颜色最好采用不同的方便区分。这里我采用的颜色是Parent(蓝色),Child1(粉色), Child2(绿色)。 -Canvas 如果你还记得上一节学过的知识,可能会产生一些疑问:单独查看Child的Layout Properties时,会发现 Minmum width/height 和 Preferred width/height 都是 0,如果Layout Controller 真的生效了,为什么两张图片的大小不是0? 原因就在于虽然Horizontal Layout Group属于Layout Controller,但它还在背地里偷偷地修改了Layout Element的计算规则,当然下一节我们就会屏蔽这种效果。 Minmum width/height
这也解决了上一节末尾提出的问题。你也可以为Image组件添加一张Source Image观察一下变化。 当然,有的情况下我们不想使用Image为我们设置的布局属性。这时我们就可以添加Layout Element来覆盖这一默认属性。为Child1和Child2分别添加一个Layout Element组件,并且将它们的Min Width/Height设置为10。由于Layout Element设置的布局属性优先级高于Image组件,所以两个Child又会以10*10的大小再次出现。随后以20*20,30*30的大小再次测试,可以看到下图所示的效果。 不知道你有没有发现规律?实际上,Min Width/height 是最低标准,在动态布局中,每个布局元素至少要保持其自身Min Width/Height 的大小,这一大小不会因为父类容器的大小而产生任何改变,完全没有妥协的余地。因此,这一条规则也最容易理解。 Preferred Width/Height 还记得Parent的大小么?没错,40*20。我们这次通过修改Parent的Width来观察两个Child的变化情况。
无论父容器如何变化,子类始终满足 Min Size (如 15 * 20所示) 当然,仅当满足Min Size以及Preferred Size的计算后,才会考虑Flexible Size。为了方便测试,我们可以先取消Layout Element中 Min Size和Preferred Size的设置(这样两个Child都只会使用Image组件设置的默认值0,对Flexible Size计算不会产生任何影响)。下面是三种不同的Flexible Size比例下两种子容器的大小情况。 还记得那个”Horizontal Layout Group“么?在实验的第一步我们修改了其中的两个选项——即Child Controls Size和Child Force Expand。前一项的作用就是屏蔽掉这个Layout Controller对布局属性的影响,完全使用子容器的布局属性进行设置;后一项则是将所有子容器的Flexible Size都设置为1,这样就可以让所有子容器以填充的方式平分父容器。 结语 扩展阅读 Unity引擎自带的UI系统,与之类似的有Unity4时代常用的第三方UI系统NGUI。 ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 21:42:35- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |