包含此页的版本:
不含此页的版本:
版本: 6.3+
可以在 UI 工具包中检查控件的伪状态。这对于调试和确保根据控件的状态正确应用样式非常有用。
此示例演示如何检查按钮和切换控件的伪状态。
您可以在此 GitHub 存储库中找到此示例创建的已完成文件。
本指南适用于熟悉 Unity 编辑器、UI 工具包和 C# 脚本的开发人员。在开始之前,请熟悉以下内容:
创建一个UXML文件来定义UI结构。此文件包含一个按钮和一个切换控件,你可以与它们进行交互以检查其伪状态。
Assets文件夹(项目选项卡)更多信息ButtonAndToggle.uxml.ButtonAndToggle.uxml文件以在 UI Builder 中打开它。my-button.my-toggle.完成的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# 脚本来检查按钮和切换控件的伪状态。此脚本注册回调,以在用户与控件交互时记录伪状态。
注意:有些回调发生在伪状态更改之前,而另一些回调发生在伪状态更改之后。此时间可能会使记录的结果看起来出乎意料。例如,在FocusInEvent,hasFocusPseudoState 仍然是false,并且在FocusOutEvent,它仍然是true.事件结束后,属性会更新。要获取实际状态,请在下一个更新中检查该属性:
true仅当元素具有焦点时。true仅当指针向下并位于元素上方时。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 或您自己的脚本生成的错误、警告和其他消息。更多信息
请参阅术语表当你与他们互动时。
ButtonAndToggle.uxml文件添加到UI文档的 源资产(Source Asset) 字段。PseudoStateChecker脚本。