Version: 6000.3
语言: 中文
选择器优先级
USS 属性

检查控件的伪状态

版本: 6.3+

可以在 UI 工具包中检查控件的伪状态。这对于调试和确保根据控件的状态正确应用样式非常有用。

示例概述

此示例演示如何检查按钮和切换控件的伪状态。

您可以在此 GitHub 存储库中找到此示例创建的已完成文件。

先决条件

本指南适用于熟悉 Unity 编辑器、UI 工具包和 C# 脚本的开发人员。在开始之前,请熟悉以下内容:

创建UXML文件

创建一个UXML文件来定义UI结构。此文件包含一个按钮和一个切换控件,你可以与它们进行交互以检查其伪状态。

  1. 使用任何模板创建 Unity 项目。
  2. 项目窗口一个窗口,显示您的内容Assets文件夹(项目选项卡)更多信息
    术语表中查看
    ,创建一个名为ButtonAndToggle.uxml.
  3. 双击ButtonAndToggle.uxml文件以在 UI Builder 中打开它。
  4. 将 按钮(Button) 添加到 层级(Hierarchy) 面板,并将其命名为my-button.
  5. 将切换添加到“层级”面板,并将其命名为my-toggle.
  6. 保存您的更改。

完成的ButtonAndToggle.uxml文件如下所示:

<ui:UXML xmlns:ui="UnityEngine.UIElements">
    <ui:Button text="Button" name="my-button"/>
    <ui:Toggle label="Toggle" name="my-toggle"/>
</ui:UXML>

创建 C# 脚本

创建一个 C# 脚本来检查按钮和切换控件的伪状态。此脚本注册回调,以在用户与控件交互时记录伪状态。

注意:有些回调发生在伪状态更改之前,而另一些回调发生在伪状态更改之后。此时间可能会使记录的结果看起来出乎意料。例如,在FocusInEventhasFocusPseudoState 仍然是false,并且在FocusOutEvent,它仍然是true.事件结束后,属性会更新。要获取实际状态,请在下一个更新中检查该属性:

创建名为PseudoStateChecker.cs内容如下:

using UnityEngine;
using UnityEngine.UIElements;

public class PseudoStateChecker : MonoBehaviour
{
    public UIDocument uiDocument;

    void OnEnable()
    {
        var root = uiDocument.rootVisualElement;

        // Query for the elements. 
        var myButton = root.Q<Button>("my-button");
        var myToggle = root.Q<Toggle>("my-toggle");

        if (myButton == null || myToggle == null)
        {
            Debug.LogError("Button or Toggle not found in the UI Document!");
            return;
        }

        // Register callbacks to check states on a Button. 
        myButton.RegisterCallback<PointerEnterEvent>(evt =>
            Debug.Log($"Button PointerEnterEvent: hasHoverPseudoState = {myButton.hasHoverPseudoState}"));

        myButton.RegisterCallback<PointerLeaveEvent>(evt =>
            Debug.Log($"Button PointerLeaveEvent: hasHoverPseudoState = {myButton.hasHoverPseudoState}"));

        // Use TrickleDown to ensure the callback receives the event before it is stopped by the Button.
        myButton.RegisterCallback<PointerDownEvent>(
            evt => Debug.Log($"Button PointerDownEvent: hasActivePseudoState = {myButton.hasActivePseudoState}"),
            TrickleDown.TrickleDown);

        myButton.RegisterCallback<PointerUpEvent>(evt =>
            Debug.Log($"Button PointerUpEvent: hasActivePseudoState = {myButton.hasActivePseudoState}"));

        myButton.RegisterCallback<FocusInEvent>(evt =>
            Debug.Log($"Button FocusInEvent: hasFocusPseudoState = {myButton.hasFocusPseudoState}"));

        myButton.RegisterCallback<FocusOutEvent>(evt =>
            Debug.Log($"Button FocusOutEvent: hasFocusPseudoState = {myButton.hasFocusPseudoState}"));

        // Register a callback to check the state on a Toggle. 
        myToggle.RegisterValueChangedCallback(evt =>
            Debug.Log($"Toggle ValueChangedEvent: hasCheckedPseudoState = {myToggle.hasCheckedPseudoState}"));

        // Example of checking the disabled state.
        // You can un-comment this to check the disabled state after 3 seconds.
        // Invoke(nameof(DisableTheButton), 3f);
    }

    private void DisableTheButton()
    {
        var myButton = uiDocument.rootVisualElement.Q<Button>("my-button");

        if (myButton != null)
        {
            myButton.SetEnabled(false);
            Debug.Log($"Button has been disabled: hasDisabledPseudoState = {myButton.hasDisabledPseudoState}");
        }
    }
}

测试示例

您可以在 SampleScene 中测试该示例。该脚本将按钮的伪状态更改记录下来,并将控件切换到控制台窗口Unity 编辑器窗口,显示 Unity 或您自己的脚本生成的错误、警告和其他消息。更多信息
请参阅术语表
当你与他们互动时。

  1. 在 SampleScene 中,选择 + > UI 工具包> UI 文档以创建新的 UI 文档游戏对象。
  2. 分配ButtonAndToggle.uxml文件添加到UI文档的 源资产(Source Asset) 字段。
  3. 选择 添加组件 并添加PseudoStateChecker脚本。
  4. 保存场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息
    请参阅术语表
    .
  5. 进入播放模式。
  6. 单击按钮并切换切换控件以检查控制台窗口中的伪状态更改。

其他资源

选择器优先级
USS 属性