Version: 2023.1
언어: 한국어
런타임 UI의 성능 고려 사항
텍스트로 작업

UI 툴킷을 사용한 입력 및 이벤트 시스템에 대한 FAQ

이 페이지에는 UI 툴킷을 통한 이벤트 시스템 및 입력 시스템 사용에 대해 자주 묻는 질문이 있습니다.

  1. 런타임 패널에서 마우스가 시각적 요소 위에 있는지 어떻게 알 수 있습니까?
  2. 기본 UI 동작을 다시 매핑하려면 어떻게 해야 합니까?
  3. 방향 내비게이션을 사용할 때 다음에 포커스를 맞출 요소를 변경하려면 어떻게 해야 합니까?
  4. 방향 내비게이션을 위한 WASD 입력이나 제출 동작을 위한 스페이스 바를 제거할 수 있습니까?
  5. 마우스로 아무 곳이나 클릭하지 않고 키보드 입력을 시작하려면 어떻게 해야 합니까?

런타임 패널에서 마우스가 시각적 요소 위에 있는지 어떻게 알 수 있습니까?

두 가지 방법을 통해 이를 알 수 있습니다.

첫 번째 방법

  1. com.unity.uGUI 패키지에서 게임 오브젝트 기반 UI 콘텐츠를 생성할 때와 동일한 방법으로 Event System 컴포넌트를 씬에 추가합니다.

  2. EventSystem.current.IsPointerOverGameObject 메서드를 사용합니다. 이는 포인터가 uGUI 또는 UI 툴킷의 UI 콘텐츠 위에 있으면 true를 반환합니다.

  3. EventSystem.current.RaycastAll 메서드를 사용하여 마우스 아래에 어떤 시각적 요소가 있는지 확인합니다.

  4. 교차된 UI 툴킷 패널은 게임 오브젝트를 통해 이벤트 시스템의 환경에 나타납니다.

    • 게임 오브젝트의 이름은 해당 PanelSettings와 일치합니다.
    • 게임 오브젝트의 부모는 현재 Event System 컴포넌트를 보유한 게임 오브젝트입니다.
    • 게임 오브젝트에는 두 개의 컴포넌트(PanelRaycasterPanelEventHandler)가 있습니다.두 컴포넌트에는 타겟이 되는 Ipanel을 반환하는 panel 프로퍼티가 있습니다.

포인터 아래에서 패널을 찾고 나면 panel.Pick 메서드를 호출하여 어떤 시각적 요소가 포인터 위치에 있는지 찾습니다.

RuntimePanelUtils.ScreenToPanel 메서드를 사용하여 포인터의 화면 좌표를 패널 좌표로 변환합니다.

uGUI의 화면 좌표 시스템은 왼쪽 하단 원점을 사용하는 반면, UI 툴킷 화면 좌표는 왼쪽 상단에서 표현됩니다.두 시스템 간에 전환하려면 yTopLeft = Screen.height - yBottomLeft로 Y 좌표를 미러링해야 하며, 그 반대의 경우도 마찬가지입니다.

두 번째 방법

  1. 사용된 별개의 PanelSettings당 하나의 UIDocument에서 UIDocument.rootVisualElement 프로퍼티를 사용하여 포인터 아래에 있을 수 있는 모든 런타임 패널 리스트를 가져올 수 있으며, 이를 수집할 수 있습니다.
  2. 패널을 뎁스 순서대로 수동으로 살펴보고 시각적 요소를 반환하는 패널을 찾을 때까지 각 패널에 대해 panel.Pick을 연속적으로 호출합니다.

기본 UI 동작을 다시 매핑하려면 어떻게 해야 합니까?

기본 UI 동작을 다시 매핑하려면 다음과 같이 하십시오.

  1. com.unity.uGUI 패키지에서 게임 오브젝트 기반 UI 콘텐츠를 생성할 때와 동일한 방법으로 Event System 컴포넌트를 씬에 추가합니다.
  2. 인스펙터(Inspector) 창에서 Stand alone Input Module 또는 Input System UI Input Module 필드를 설정하여 각 동작에 매핑할 입력을 컨트롤합니다.

참고:Tab 및 Shift+Tab 입력에 매핑된 동작은 Event System 입력 모듈을 통해 노출되지 않으므로 다시 매핑할 수 없습니다.

방향 내비게이션을 사용할 때 다음에 포커스를 맞출 요소를 변경하려면 어떻게 해야 합니까?

방향 내비게이션을 설정하여 기본 타겟이 아닌 다른 타겟을 지정할 수 있습니다.

다음 코드 예시를 사용하면 요소 A가 위, 아래, 왼쪽, 오른쪽으로 각각 탐색할 때 U, D, L, R 요소로 탐색할 수 있습니다.

A.RegisterCallback <NavigationMoveEvent>(e =>
{
    switch(e.direction)
    {
        case NavigationMoveEvent.Direction.Up:U.Focus(); break;
        case NavigationMoveEvent.Direction.Down:D.Focus(); break;
        case NavigationMoveEvent.Direction.Left:L.Focus(); break;
        case NavigationMoveEvent.Direction.Right:R.Focus(); break;
    }
    e.PreventDefault();
});

방향 내비게이션을 위한 WASD 입력이나 제출 동작을 위한 스페이스 바를 제거할 수 있습니까?

네. 인스펙터 창에서 EventSystem의 StandaloneInputModule 또는 InputSystemUIInputModule 필드를 사용하여 각 동작에 매핑되는 입력을 제어할 수 있습니다. 그러나 이러한 동작은 uGUI 입력과 공유되므로 uGUI 컨트롤도 변경됩니다.

uGUI 컨트롤에 영향을 미치지 않고 UI 툴킷 입력을 다시 매핑하려면 UI 툴킷의 런타임 이벤트 처리를 비활성화하고 모든 이벤트를 수동으로 패널에 전송합니다. 이렇게 하려면 현재 EventSystem의 시작 메서드(예: 씬 컴포넌트의 Awake 메서드)가 실행되기 전에 EventSystem.SetUITookitEventSystemOverride(null, true, false);를 호출하면 됩니다. 이 uGUI 메서드에 대한 자세한 내용은 SetUITookitEventSystemOverride를 참조하십시오.

마우스로 아무 곳이나 클릭하지 않고 키보드 입력을 시작하려면 어떻게 해야 합니까?

게임 씬을 처음 로드할 때와 같이 특정 시점에 초점이 맞춰진 요소나 패널이 없을 수 있습니다. 이 경우 키보드 내비게이션은 예측 가능한 첫 번째 요소에서 시작되지 않습니다. 이는 마우스 없이 플레이하는 게임에서 문제가 될 수 있습니다.

처음부터 예측 가능한 내비게이션 동작이 가능하도록 C# 스크립트를 추가하고, 초기 포커스를 가져오도록 선택한 요소를 담당하는 UIDocument와 동일한 게임 오브젝트에 스크립트를 연결합니다.

스크립트의 이름이 FirstFocus이고 포커스를 맞춘 첫 요소의 이름이 first-focused라고 가정합니다. 스크립트의 Start() 메서드에 다음과 같이 해당 요소에 포커스를 맞추는 줄을 추가합니다.

public class FirstFocus :MonoBehaviour
{
    void Start()
    {
        FocusFirstElement();
    }

    public void FocusFirstElement()
    {
        GetComponent<UIDocument>().rootVisualElement.
            Q<VisualElement>("first-focused").Focus();
    }
}

참고: UIDocument의 게임 오브젝트를 비활성화하면 모든 기본 계층 구조가 처음부터 다시 생성됩니다. 따라서 게임 오브젝트를 다시 활성화한 후 커스텀 FocusFirstElement() 메서드를 다시 실행해야 합니다.

추가 리소스

런타임 UI의 성능 고려 사항
텍스트로 작업