Unity Change Event 문서 해설
이 문서는 Unity의 사용자 인터페이스(UI)에서 중요한 이벤트인 ChangeEvent
에 대한 설명입니다. ChangeEvent
는 UI 요소의 값이 변경될 때 발생하는 이벤트로, 주로 사용자가 체크박스를 전환하는 등 UI 요소의 상태가 변경될 때 사용됩니다. 아래에서 좀 더 자세히 설명하고, 활용 예제도 제공합니다.
Change Event란?
ChangeEvent
는 사용자의 입력으로 UI 요소의 값이 바뀔 때 발생하는 이벤트입니다. 이 이벤트는 다음 정보를 포함합니다:
- previousValue: 이전 값
- newValue: 새 값
이 이벤트는 UI 요소에 새로운 값을 할당한 후 트리거되며, 이벤트가 발생하는 것을 방지할 수는 없습니다.
ChangeEvent의 구조
- 클래스:
ChangeEvent<T>
- 기본 클래스:
EventBase
- 사용되는 타입:
INotifyValueChanged<T>
ChangeEvent 사용하는 방법
ChangeEvent
를 활용하기 위해 콜백 함수를 등록할 수 있는 두 가지 방법이 있습니다.
- 시각적 요소에서
RegisterCallback<>()
메서드를 호출. 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: 콜백 등록하여 변경 이벤트 받기
- ChangeEventTestWindow C# 스크립트 생성
- 위치:
Assets/Scripts/Editor
- 코드 복사 후 붙여넣기
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의 동작을 보다 반응적으로 만들 수 있습니다. 위의 예제를 바탕으로 변경 이벤트를 처리하는 다양한 방법을 실험해 보시기 바랍니다.