在编写 USS 以设置视觉元素的样式时,请遵循以下最佳实践。
尽可能使用 USS 文件而不是内联样式,以提高内存使用率。
内联样式基于每个元素,可能会导致内存开销。当在许多元素上的 C# 脚本或 UXML 文件中使用内联样式时,内存使用量会快速增加。
所有 USS 选择器都在运行时应用,因此架构会影响初始化性能。当元素首次出现或其类发生更改时应用 USS 选择器:
:hover 选择器是选择器导致交互性问题和重新设置样式的主要原因。通常,如果您有很多选择器,这不是问题,因为每个 USS 文件都会转换为查找表。但是,向元素添加类时,性能会呈线性下降。列表中的每个类都用于查询查找表。复杂性是 N1 x N2,其中:
N1 是元素上的类数N2 是当前适用的 USS 文件数层级结构中的元素数量是影响性能的主要原因。对于简单的__ UI__(即用户界面,User Interface)让用户能够与您的应用程序进行交互。Unity 目前支持三种 UI 系统。更多信息
See in Glossary,更新样式可能微不足道,但对于具有数千个元素的大型 UI,更新样式非常重要。如果一个元素匹配大量选择器,则会导致合并来自每个规则的样式产生开销。
通常,相比简单选择器,复杂选择器对性能的影响更大。复杂选择器依赖于元素的前代来匹配元素。如果可能,请考虑以下几点:
selector1 > selector2 > selector3) 而不是后代选择器 (selector1 selector2 selector3)。selector1 > selector2 > *) 末尾使用通用选择器,或避免将后代选择器与通用选择器 (selector1 * selector2) 组合使用。通用选择器根据可能影响性能的选择器测试每个潜在元素。.yellow:hover > * > Button)的选择器中使用 :hover 伪类。鼠标移动会使 :hover 选择器所针对的整个元素层级结构无效。您可以使用块元素修饰符 (BEM) 约定来减少层级结构选择器。使用 BEM 时,每个元素都会收到一个类,该类将其特定存在组合在另一个元素中。
BEM 表示块元素修饰符。BEM 是一个简单的系统,有助于编写结构化、明确、易于维护的选择器。可以通过 BEM 向元素分配类,然后将这些类用作样式表中的选择器。
BEM 类最多包含三个组件:
menu、button、list-view
menu__item、button__icon 或 list-view__item
menu--disabled、menu__item--disabled、button--small 或 list-view__item--selected
每个名称部分可能由拉丁字母、数字和短划线组成。每个名称部分用双下划线 __ 或双短划线 -- 连接起来。
以下示例显示了菜单的 UXML 代码:
<VisualElement class="menu">
<Label class="menu__item" text="Banana" />
<Label class="menu__item" text="Apple" />
<Label class="menu__item menu__item--disabled" text="Orange" />
</VisualElement>
每个元素都配有描述其作用和外观的类,您可以仅使用一个类名来编写大多数选择器:
.menu {
}
.menu__item {
}
.menu__item--disabled {
}
可以使用单个类名称对元素进行样式设置。有时,可能需要使用复杂的选择器。例如,元素的样式取决于其块的修饰符时,可以使用复杂选择器:
.button {
}
.button__icon {
}
.button--small {
}
.button--small .button__icon {
}
注意:
Button、Label)或元素名称 (#my-button)。UI 工具包遵循 BEM。每个视觉元素都附有必要的类名。例如,所有 TextElement 都具有 unity-text-element 类。派生自 TextElement 的每个 Button 实例的类列表中都填充了 unity-button 和 unity-text-element 类。
如果从 VisualElement 或其某个后代派生新元素,请遵循以下准则以确保元素易于使用 BEM 方法进行样式设置:
AddToClassList(),将相关 USS 类添加到元素实例。my-block__first-child、my-block__other-child。