版本:Unity 6 (6000.0)
语言:English
在 C# 脚本中获取自定义样式
USS 的最佳实践

在 C# 脚本中应用样式

您可以写入 style 以将样式值设置为元素。但是,要获取元素的实际渲染样式,请从 resolvedStyle 读取。

设置样式

在 C# 脚本中,您可以直接将样式设置为 视觉元素视觉树的节点,实例化或派生自 C# VisualElement 类。您可以设置外观样式、定义行为,并将其作为 UI 的一部分显示在屏幕上。 更多信息
参见 术语表
style 属性。例如,以下代码将按钮的背景颜色设置为红色

button.style.backgroundColor = Color.red

您还可以将 Unity 样式表 (USS) 添加到任何视觉元素。Unity 在 C# 脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间修改组件属性以及以您喜欢的任何方式响应用户输入。 更多信息
参见 术语表
中将 USS 文件表示为 StyleSheet 对象。

要将样式表添加到视觉元素

  1. 使用标准 Unity API(如 AssetDatabase.Load()Resources.Load())加载 StyleSheet 对象。
  2. 使用视觉元素的 styleSheets 属性添加 StyleSheet 对象。

例如,给定样式表在局部变量 styleSheet 中,元素在局部变量 element 中,以下示例将样式表添加到元素

element.styleSheets.Add(styleSheet);

注意:样式规则适用于视觉元素及其所有后代,但不适用于元素的父级或同级。对 USS 文件的任何更改都会自动刷新使用此样式表的 UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三种 UI 系统。 更多信息
参见 术语表

获取已解析的样式

元素上的样式值是从各种来源计算得出的,包括多个应用的类、从祖先继承以及来自 UXML 或 C# 代码的内联样式。这些值可能会在帧与帧之间发生变化。style 仅保存元素的内联样式,不反映其他来源。resolvedStyle 具有最终计算的值,考虑当前帧上的所有来源。

例如,当您使用内联样式为元素设置高度时,styleresolvedStyle 都以相同的值开始。当元素添加到层次结构中时,resolvedStyle.height 可能为 NaN,直到布局更新。如果您在类中将高度定义为百分比,则计算出的宽度依赖于父级属性,例如 border-heightpadding。虽然 style.height 可能会给出相对值(例如,对于可以更改值的转换),但 resolvedStyle.height 会给出实际渲染的高度。

要获取几何形状发生变化时的已解析样式,您可以使用 GeometryChangedEvent 事件。当 VisualElement 的布局发生变化时(包括大小和位置的变化)会触发此事件。您可以为此事件注册回调,并在回调中访问 VisualElement 的 resolvedStyle 属性以获取最终计算的样式。

以下示例创建一个自定义编辑器窗口并记录元素的已解析高度。如果调整窗口大小,则元素的高度会发生变化

using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

public class ResolvedStyles : EditorWindow
{
    [MenuItem("Window/UI Toolkit/ResolvedStyles")]
    public static void ShowExample()
    {
        GetWindow<ResolvedStyles>();
    }
    
    private void OnEnable()
    {
        titleContent = new GUIContent("Resolved Styles");
    }

    public void CreateGUI()
    {
        VisualElement root = rootVisualElement;
        
        // Element that is tracked.
        // When you resize the Editor window, the inner content is not necessarily updated
        // during the drag operation. The resolved height field is updated whenever the drag
        // operation is complete.
        var element = new VisualElement
        {
            style =
            {
                flexGrow = 1,
                backgroundColor = Color.red
            }
        };
        root.Add(element);

        // Register a callback for the GeometryChangedEvent
        element.RegisterCallback<GeometryChangedEvent>(OnGeometryChanged);
    }

    // Callback for the GeometryChangedEvent
    public void OnGeometryChanged(GeometryChangedEvent evt)
    {
        // Get the VisualElement that triggered the event
        VisualElement element = evt.target as VisualElement;

        // Get the resolved style of the VisualElement
        float height = element.resolvedStyle.height;

        // Log the resolved of the VisualElement
        Debug.Log("Resolved height: " + height);
    }
}

如果元素的几何形状没有改变,您可以添加一个调度程序来定期检查元素的已解析样式

element.schedule.Execute(() =>
{
    Debug.Log(element.resolvedStyle.height);
}).Every(100);

其他资源

在 C# 脚本中获取自定义样式
USS 的最佳实践