UIElements开发人员指南9 样式(Style)和Unity样式表(style sheets)

本文深入探讨Unity中UI元素的样式设置方法,包括样式属性的C#设置与USS(Unity样式表)的使用。USS受CSS启发,支持样式规则的定义与应用,能自动适配UIElements树,实现统一的视觉效果。

样式(Style)和Unity样式表(style sheets)

每个VisualElement都包含样式属性,用于设置元素的尺寸以及元素在屏幕上的绘制方式,例如backgroundColorborderColor

样式属性可以在C#中设置,也可以在样式表中设置。样式属性将会在其自己的数据结构(IStyle接口)中重新组装。

UIElements支持用USS编写的样式表(Unity样式表)。USS文件受到HTML中层叠样式表(CSS)的启发,格式与CSS类似,但USS包括覆盖和自定义以更好地与Unity协同工作。

本节包含有关USS及其语法的详细信息,以及与CSS相比时的差异。

Unity样式表的定义

Unity样式表(USS)的基本构建规则如下:

  • USS是被识别为资产的文本文件,文件必须具有.uss扩展名。
  • USS仅支持样式规则。
  • 样式规则由选择器和声明块组成。
  • 选择器标识了样式规则将会影响的那些可视元素。
  • 由大括号括起来的声明块包含一个或多个样式声明。每个样式声明都由属性和值组成。每个样式声明以分号结尾。
  • 每个样式属性的值是一个文字,在解析时,必须与目标属性名称匹配。

样式规则的一般语法是:

selector {
  property1:value;
  property2:value;
}

将USS附加到可视元素

您可以将Unity样式表(USS)附加到任何可视元素。样式规则适用于可视元素及其所有子类。必要时,还会自动重新应用样式表。

可以使用标准Unity API 加载StyleSheet对象,例如AssetDatabase.Load()Resources.Load(),可以使用VisualElement.styleSheets.Add()方法将样式表附加到可视元素。

如果在EditorWindow运行时修改USS文件,则会修改的结果会立刻得到应用。

样式应用的处理过程对使用UIElements的开发人员是透明的,样式表会在需要时自动重新应用(如:层次结构更改,样式表重新加载等)。

样式匹配规则

定义样式表后,可以将其应用于可视元素的UIElements树。

在此过程中,选择器将与元素进行匹配,以从USS文件解析需要应用的属性。如果选择器与元素匹配,则样式声明将应用于元素。

例如,以下规则匹配任何Button对象:

Button {
  width: 200px;
}

可视元素匹配

UIElements使用以下条件将可视元素与其样式规则相匹配:

  • 它的C#类名(大部分情况下是派生类)
  • 名为name的字符串属性
  • 表示为一组字符串的class列表
  • VisualElement在可视树中层次中的相对位置。

这些特征可用于样式表中的选择器。

如果您熟悉CSS,则可以看到它们与HTML的tag名称,id属性和class属性的相似性。

### 如何在 Unity 中展开 UI 面板 #### 使用 UI Toolkit 展开 UI 面板 为了更好地理解如何在 Unity 中操作 UI 面板,特别是使用现代的 UI Toolkit 进行面板的操作,可以考虑如下方法: 当涉及到调整或展开 UI 面板时,在 UI Toolkit 下可以通过修改 `IMGUIContainer` 组件内的属性来实现。对于更复杂的布局需求,则可能涉及到了解并应用样式表StyleSheets),这允许开发者定义控制 UI 元素的外观以及行为。 具体到展开 UI 面板这一动作上,通常意味着改变其尺寸或是可见状态。如果目标是在运行期间动态地扩大某个面板的空间占用,那么应该关注于编程方式设置该容器的高度宽度等参数;如果是关于显示隐藏,则可通过脚本逻辑切换对象的活动状态(active self)或者通过视觉效果模拟收起/打开的效果[^1]。 另外,针对传统意义上的 Unity UI (非 UI Toolkit),若要处理类似的需求——即垂直排列子项并且能够方便地管理间距等问题,Unity 提供了一个名为 Vertical Layout Group 的组件,此功能可以帮助自动安排子元素的位置,并提供选项来自定义这些项目的相对位置关系及其各自的伸缩特性[^2]。 下面是一个简单的 C# 脚本例子展示怎样通过代码去影响一个 GameObject 上挂载有 IMGUIContainer 的实例化对象的状态变化: ```csharp using UnityEngine; using UnityEditor.UIElements; public class ExpandPanelExample : MonoBehaviour { public VisualElement panel; // 将此字段连接至 Inspector 中的目标 Panel void Start() { // 假设想要在此处执行初始化后的首次展开操作 ToggleExpand(true); } public void ToggleExpand(bool expand) { if(expand){ ((IMGUIContainer)this.panel).style.height = new StyleLength(new Length(400, LengthUnit.Pixel)); this.panel.style.display = DisplayStyle.Flex; }else{ this.panel.style.display = DisplayStyle.None; } } } ``` 上述代码片段展示了如何利用样式属性来控制指定面板的可视性高度,从而达到“展开”的目的。请注意实际项目里应当依据具体情况调整数值以适应设计意图。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值