사용자가 D패드를 누르거나, 조이스틱을 움직이거나, Escape, Enter, 화살표 키를 누르면 런타임 시 내비게이션 이벤트가 발생합니다. 내비게이션 이벤트는 사용자가 UI를 탐색하려는 지표이지만 키보드와 같은 특정 입력 기기에 국한되지 않습니다. 포커스 이벤트와의 차이점은 내비게이션 이벤트가 새로운__ UI__(사용자 인터페이스) 사용자가 애플리케이션과 상호 작용하도록 해 줍니다. Unity는 현재 3개의 UI 시스템을 지원합니다. 자세한 정보
See in Glossary 요소로 이동하는 데 포커스가 필요하지 않다는 점입니다.
모든 내비게이션 이벤트의 기본 클래스는 NavigationEventBase입니다.
모든 내비게이션 이벤트는 트리클다운 및 버블업이며 취소 가능하지만 버블업 전파 단계에서는 이러한 이벤트를 수신하는 것이 좋습니다. 내비게이션 이벤트는 개별 컨트롤과 상호 작용하는 데 사용할 수 있는 입력 이벤트에 의해 트리거되기 때문입니다. 예를 들어 버튼 클릭으로 Enter 키를 누르면 버튼이 반응하여 NavigationSubmitEvent가 취소됩니다. 버블업 단계에서 이러한 이벤트를 수신하면 해당 이벤트가 내비게이션 이벤트임을 확인할 수 있습니다.
| 이벤트 | 설명 | 트리클다운 | 버블업 | 취소 가능 |
|---|---|---|---|---|
| NavigationMoveEvent | 사용자가 이동 입력을 수행할 때 전송됩니다. | ✔ | ✔ | ✔ |
| NavigationCancelEvent | 사용자가 취소 입력을 수행할 때 전송됩니다. | ✔ | ✔ | ✔ |
| NavigationSubmitEvent | 사용자가 제출 입력을 수행할 때 전송됩니다. | ✔ | ✔ | ✔ |
NavigationMoveEvent는 사용자가 D패드를 누르거나, 조이스틱을 움직이거나, 화살표 키를 누를 때 전송됩니다.
일부 컨트롤은 자체 기능을 수행하는 데 화살표 키를 사용합니다. 예를 들어, ListView를 사용하면 사용자가 위쪽 화살표 키와 아래쪽 화살표 키를 사용하여 항목을 선택할 수 있습니다. 이 경우 컨트롤이 NavigationMoveEvent를 취소하고 이벤트가 버블업 단계에 들어가지 않습니다.
direction: 내비게이션 방향(None, Left, Up, Right, Down)입니다.
move: 이동 벡터입니다. 이벤트가 조이스틱과 같은 아날로그 축 입력에 의해 트리거된 경우 이 프로퍼티는 방향 벡터에 대한 액세스를 제공합니다.
NavigationCancelEvent는 사용자가 키보드의 Escape 키를 누를 때와 같이 현재 내비게이션 작업을 취소할 때 트리거됩니다. 이 이벤트는 현재 포커스가 맞춰진 요소에 영향을 주지 않으므로 취소 전에 포커스가 있었던 UI 요소가 선택된 상태로 유지됩니다.
NavigationSubmitEvent는 사용자가 키보드의 Enter 키를 누를 때와 같이 제출 버튼을 누를 때 트리거됩니다.
컨트롤이 이벤트 자체를 처리하면 이벤트를 취소하여 버블업 단계로 전환하지 못합니다. 예를 들어, TextField에 포커스가 있으면 NavigationSubmitEvent의 버블업을 차단합니다. 반면, 포커스를 맞출 수 있는 레이블 또는 이미지를 사용하면 NavigationSubmitEvent가 부모 요소까지 버블업하여 필요한 경우 이벤트를 처리할 수 있습니다.
다음 코드 예시는 런타임 UI에서 내비게이션 이벤트의 콜백을 등록하는 방법을 보여 줍니다.
using UnityEngine.UIElements;
public class MyNavigationHandler : MonoBehaviour
{
void OnEnable()
{
// Get a reference to the root visual element
var uiDocument = GetComponent<UIDocument>();
var rootVisualElement = uiDocument.rootVisualElement;
// Register for navigation events
rootVisualElement.RegisterCallback<NavigationCancelEvent>(OnNavCancelEvent);
rootVisualElement.RegisterCallback<NavigationMoveEvent>(OnNavMoveEvent);
rootVisualElement.RegisterCallback<NavigationSubmitEvent>(OnNavSubmitEvent);
}
private void OnNavSubmitEvent(NavigationSubmitEvent evt)
{
Debug.Log($"OnNavSubmitEvent {evt.propagationPhase}");
}
private void OnNavMoveEvent(NavigationMoveEvent evt)
{
Debug.Log($"OnNavMoveEvent {evt.propagationPhase} - move {evt.move} - direction {evt.direction}");
}
private void OnNavCancelEvent(NavigationCancelEvent evt)
{
Debug.Log($"OnNavCancelEvent {evt.propagationPhase}");
}
}