Проверка pseudo-state контроля
Версия: 6.3+
Вы можете проверить псевдосостояния элемента управления в UI Toolkit. Это полезно для отладки и для проверки того, что ваши стили применяются правильно в зависимости от состояния элемента управления.
Примерный обзор
В этом примере показано, как проверить псевдо-state кнопки и переключателя.
Вы можете найти завершенные файлы, созданные этим примером, в хранилище GitHub.
Предварительные условия
Это руководство предназначено для разработчиков, знакомых со скриптами Unity Editor, UI Toolkit и C#. Перед началом работы ознакомьтесь со следующим:
- события указателя
- Основные мероприятия
- hasHoverPseudoState
- hasActivePseudoState
- hasFocusPseudoState
- hasCheckedPseudoState
- hasDisabledPseudoState
Создать файл UXML
Создайте файл UXML для определения структуры UI. Этот файл содержит кнопку и переключатель, с которыми вы можете взаимодействовать, чтобы проверить их псевдо-состояния.
- Создайте проект Unity с любым шаблоном.
- В окне Project создайте файл UXML с именем
ButtonAndToggle.uxml. - Дважды щелкните файл
ButtonAndToggle.uxml, чтобы открыть его в UI Builder. - Добавить кнопку на панели Hierarchy и назвать её
my-button. - Добавить переключатель в панели Hierarchy и назвать его
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#
Создайте скрипт 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 изменения кнопки и переключает управление на окно Консоли при взаимодействии с ними.
- В SampleScene выберите + > UI Toolkit > UI Документ для создания нового UI Документа GameObject.
- Назначьте файл
ButtonAndToggle.uxmlв поле Source Asset Документа UI. - Выберите Добавить компонент и добавьте скрипт
PseudoStateChecker. - Сохранить сцену.
- Введите режим воспроизведения.
- Нажмите кнопку и переключите переключатель, чтобы проверить изменения pseudo-state в окне Консоли.