Unity 6.3
0 онлайн 54 гостей 3 в системе
Вход

Проверка pseudo-state контроля

Версия: 6.3+

Вы можете проверить псевдосостояния элемента управления в UI Toolkit. Это полезно для отладки и для проверки того, что ваши стили применяются правильно в зависимости от состояния элемента управления.

Примерный обзор

В этом примере показано, как проверить псевдо-state кнопки и переключателя.

Вы можете найти завершенные файлы, созданные этим примером, в хранилище GitHub.

Предварительные условия

Это руководство предназначено для разработчиков, знакомых со скриптами Unity Editor, UI Toolkit и C#. Перед началом работы ознакомьтесь со следующим:

Создать файл UXML

Создайте файл UXML для определения структуры UI. Этот файл содержит кнопку и переключатель, с которыми вы можете взаимодействовать, чтобы проверить их псевдо-состояния.

  1. Создайте проект Unity с любым шаблоном.
  2. В окне Project создайте файл UXML с именем ButtonAndToggle.uxml.
  3. Дважды щелкните файл ButtonAndToggle.uxml, чтобы открыть его в UI Builder.
  4. Добавить кнопку на панели Hierarchy и назвать её my-button.
  5. Добавить переключатель в панели Hierarchy и назвать его 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# для проверки псевдо-состояний кнопки и переключателя управления. Этот скрипт регистрирует обратные вызова для регистрации псевдо-состояний, когда пользователь взаимодействует с контроллерами.

Примечание: Некоторые обратные вызова происходят до изменения псевдо-state, в то время как другие происходят после. Это время может сделать зарегистрированные результаты неожиданными. Например, во время FocusInEvent, hasFocusPseudoState все еще является false, и во время FocusOutEvent, он все еще является true. Свойства обновляются после завершения события. Чтобы получить фактическое состояние, проверьте свойство в следующем Update:

  • hasFocusPseudoState является true только тогда, когда элемент имеет фокус.
  • hasActivePseudoState является true только тогда, когда указатель находится вниз и над элементом.
  • hasHoverPseudoState является true только тогда, когда указатель находится над элементом.

Создайте скрипт C# с именем 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. Скрипт регистрирует псевдо-state изменения кнопки и переключает управление на окно Консоли при взаимодействии с ними.

  1. В SampleScene выберите + > UI Toolkit > UI Документ для создания нового UI Документа GameObject.
  2. Назначьте файл ButtonAndToggle.uxml в поле Source Asset Документа UI.
  3. Выберите Добавить компонент и добавьте скрипт PseudoStateChecker.
  4. Сохранить сцену.
  5. Введите режим воспроизведения.
  6. Нажмите кнопку и переключите переключатель, чтобы проверить изменения pseudo-state в окне Консоли.

Дополнительные ресурсы