Unity Change Event 문서 해설

이 문서는 Unity의 사용자 인터페이스(UI)에서 중요한 이벤트인 ChangeEvent에 대한 설명입니다. ChangeEvent는 UI 요소의 값이 변경될 때 발생하는 이벤트로, 주로 사용자가 체크박스를 전환하는 등 UI 요소의 상태가 변경될 때 사용됩니다. 아래에서 좀 더 자세히 설명하고, 활용 예제도 제공합니다.

Change Event란?

ChangeEvent는 사용자의 입력으로 UI 요소의 값이 바뀔 때 발생하는 이벤트입니다. 이 이벤트는 다음 정보를 포함합니다:

  • previousValue: 이전 값
  • newValue: 새 값

이 이벤트는 UI 요소에 새로운 값을 할당한 후 트리거되며, 이벤트가 발생하는 것을 방지할 수는 없습니다.

ChangeEvent의 구조

  • 클래스: ChangeEvent<T>
  • 기본 클래스: EventBase
  • 사용되는 타입: INotifyValueChanged<T>

ChangeEvent 사용하는 방법

ChangeEvent를 활용하기 위해 콜백 함수를 등록할 수 있는 두 가지 방법이 있습니다.

  1. 시각적 요소에서 RegisterCallback<>() 메서드를 호출.
  2. INotifyValueChanged<T>에서 파생된 시각적 요소에서 RegisterValueChangedCallback() 호출.

이벤트 타입을 명시적으로 지정해야 하며, 이를 통해 특정 타입의 변화에 반응할 수 있습니다.

예제 1: 콜백 등록하기

// Registering the callback
rootVisualElement.RegisterCallback<ChangeEvent<bool>>(OnBoolChangedEvent);

// Event callback
private void OnBoolChangedEvent(ChangeEvent<bool> evt) 
{ 
    // Handling code
}

예제 2: Toggle과 Integer 필드를 포함해 직접 콜백 등록하기

var newToggle = new Toggle("Test Toggle");
newToggle.RegisterValueChangedCallback(OnTestToggleChanged);

private void OnTestToggleChanged(ChangeEvent<bool> evt)
{ 
    // Handling code
}

활용 예제

다음은 ChangeEvent를 사용하는 방법을 보여 주는 두 가지 예제입니다.

예제 1: 콜백 등록하여 변경 이벤트 받기

  1. ChangeEventTestWindow C# 스크립트 생성
  2. 위치: Assets/Scripts/Editor
  3. 코드 복사 후 붙여넣기
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

public class ChangeEventTestWindow : EditorWindow
{
    private Toggle m_MyToggle;

    [MenuItem("Window/UI Toolkit/Change Event Test Window")]
    public static void ShowExample()
    {
        ChangeEventTestWindow wnd = GetWindow<ChangeEventTestWindow>();
        wnd.titleContent = new GUIContent("Change Event Test Window");
    }

    public void CreateGUI()
    {
        // Create a toggle
        m_MyToggle = new Toggle("Test Toggle") { name = "My Toggle" };
        rootVisualElement.Add(m_MyToggle);

        // Register a callback on the toggle
        m_MyToggle.RegisterValueChangedCallback(OnTestToggleChanged);

        // Register a callback on the parent
        rootVisualElement.RegisterCallback<ChangeEvent<bool>>(OnBoolChangedEvent);
    }

    private void OnBoolChangedEvent(ChangeEvent<bool> evt)
    {
        Debug.Log($"Toggle changed. Old value: {evt.previousValue}, new value: {evt.newValue}");
    }

    private void OnTestToggleChanged(ChangeEvent<bool> evt)
    {
        Debug.Log($"A bool value changed. Old value: {evt.previousValue}, new value: {evt.newValue}");
    }
}

예제 2: 코드로 컨트롤 값 설정하기

using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

public class ChangeEventTestWindow : EditorWindow
{
    private Toggle m_MyToggle;

    [MenuItem("Window/UI Toolkit/Change Event Test Window")]
    public static void ShowExample()
    {
        GetWindow<ChangeEventTestWindow>().titleContent = new GUIContent("Change Event Test Window");
    }

    public void CreateGUI()
    {
        // Create a toggle and register callback 
        m_MyToggle = new Toggle("Test Toggle") { name = "My Toggle" };
        m_MyToggle.RegisterValueChangedCallback((evt) => { Debug.Log("Change Event received"); });
        rootVisualElement.Add(m_MyToggle);

        // Create button to toggle the toggle's value
        Button button01 = new Button() { text = "Toggle" };
        button01.clicked += () => 
        {
            m_MyToggle.value = !m_MyToggle.value;
        };
        rootVisualElement.Add(button01);

        // Create button to toggle the toggle's value without triggering a ChangeEvent
        Button button02 = new Button() { text = "Toggle without notification" };
        button02.clicked += () =>
        {
            m_MyToggle.SetValueWithoutNotify(!m_MyToggle.value);
        };
        rootVisualElement.Add(button02);
    }
}

결론

ChangeEvent는 Unity의 UI 요소가 변경될 때 중요한 역할을 합니다. 이를 통해 사용자 인터랙션에 따른 이벤트를 처리하고, UI의 동작을 보다 반응적으로 만들 수 있습니다. 위의 예제를 바탕으로 변경 이벤트를 처리하는 다양한 방법을 실험해 보시기 바랍니다.