前言
在UGUI1中,Canvas下的每个GameObject都会自动添加 Rect Transform
组件来控制自身的位置和大小。通常情况下,基于Rect Transform
的布局系统已经足够灵活,可以方便地满足大部分UI布局的需要。利用UGUI中的 anchor
(锚点)和 pivot
(轴点)特性,可以让UI GameObject
2实现大部分依赖父容器的定位功能,例如绑定在父容器的左上角或正中央,长度和宽度撑满父类等功能。
然而,另外的一些需要父容器依赖子类的UI功能,仅仅使用Rect Transform
则很难做到。例如,让Text文本框的大小根据字数动态变化;让列表的长度根据列表项的数量动态变化等等。它们可能满足以下条件中的一条和多条:
- 容器的具体大小在设计阶段无法提前预知
- 父容器的大小可能会在运行时动态变化
- 父容器的布局很大程度上依赖于子类
这种情况下,使用 Auto Layout (自动布局)往往可以达到预期的效果。
概念
Auto Layout
自动布局系统为具有嵌套结构的UI布局提供了可行方案(例如水平或垂直列表或表格),并且允许布局元素根据其包含的子类内容进行大小调节(例如可以根据文本调节自身大小的Text)。
自动布局系统是基于最基础的 Rect Transform
来构筑的,它可以使用在任何一个包含 Rect Transform
的元素上。
自动布局系统主要基于 layout elements
和 layout controllers
两种概念 。本文着重介绍 layout elements
。
Layout Elements
在Unity中, Layout Element
具有广义和狭义的区别。狭义上说,Layout Element
是一种可选的UI组件;广义上说, Layout Element
指一切附加有 Rect Transform
以及 其他任意数量的UI组件的GameObject。 Auto Layout 中提到的 Layout Elements
显然指的是其广义概念。
正因为广义上说所有UI GameObject
都或多或少地扮演了 Layout Element
的角色,所以每个UI GameObject
都可以在其对应的Inspector面板中找到自身的Layout Properties参数。下面是一个新建的Text组件的Layout Properties示意图:
实际情况和图片不符?
首先底部的黑底部分是可以通过其左上角的DropDown进行切换的,其次仅含有RectTransform
的UI GameObject
是不会显示该面板的。
事实上,所有含有Rect Transform
的UI GameObject
都可以充当Layout Element
。