Unity 사용자 매뉴얼: 커스텀 데이터 타입에 커스텀 컨트롤 바인딩하기
이 문서는 Unity UI 툴킷을 활용하여 커스텀 데이터 타입과 커스텀 컨트롤을 바인딩하는 방법을 설명합니다. 이 예제에서는 온도 변환 기능을 가진 커스텀 프로퍼티 드로어를 만듭니다.
개요
이 예제는 세 가지 기본 UI 컨트롤을 사용하여 온도(섭씨 및 화씨) 변환을 위한 커스텀 데이터 타입과 컨트롤을 생성합니다.
선행 조건
이 가이드는 Unity 에디터, UI 툴킷 및 C# 스크립팅에 익숙한 개발자를 위한 것입니다. 작업을 시작하기 전, 다음을 준비하십시오:
- UXML
- PropertyField
- 커스텀 데이터 타입 생성
커스텀 데이터 타입 생성
- Unity 프로젝트를 생성합니다.
bind-custom-data-type
이라는 폴더를 만들어 모든 파일을 저장합니다.Temperature.cs
라는 이름의 C# 스크립트를 만들고 다음 코드를 추가합니다:
using System;
namespace UIToolkitExamples
{
public enum TemperatureUnit
{
Celsius,
Fahrenheit
}
[Serializable]
public struct Temperature
{
public double value;
public TemperatureUnit unit;
}
}
PlanetScript.cs 작성
PlanetScript.cs
라는 이름의 C# 스크립트를 만들고 다음 코드를 추가합니다:
using UnityEngine;
namespace UIToolkitExamples
{
public class PlanetScript : MonoBehaviour
{
public Temperature coreTemperature;
}
}
커스텀 컨트롤 만들기
Editor
라는 이름의 폴더를 만듭니다.PlanetEditor.cs
라는 C# 스크립트를 생성하고 다음 코드를 추가합니다:
using UnityEditor;
using UnityEngine.UIElements;
using UnityEditor.UIElements;
namespace UIToolkitExamples
{
[CustomEditor(typeof(PlanetScript))]
public class PlanetEditor : Editor
{
public override VisualElement CreateInspectorGUI()
{
return new PropertyField(serializedObject.FindProperty("coreTemperature"));
}
}
}
TemperatureDrawer.cs
라는 C# 스크립트를 생성하고 다음 코드를 추가합니다:
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
namespace UIToolkitExamples
{
[CustomPropertyDrawer(typeof(Temperature))]
public class TemperatureDrawer : PropertyDrawer
{
public override VisualElement CreatePropertyGUI(SerializedProperty property)
{
var asset = Resources.Load<VisualTreeAsset>("temperature_drawer");
var drawer = asset.Instantiate(property.propertyPath);
drawer.Q<Label>().text = property.displayName;
if (!property.serializedObject.isEditingMultipleObjects)
{
drawer.Q<Button>().RegisterCallback<ClickEvent, SerializedProperty>(Convert, property);
}
return drawer;
}
static void Convert(ClickEvent evt, SerializedProperty property)
{
var valueProperty = property.FindPropertyRelative("value");
var unitProperty = property.FindPropertyRelative("unit");
if (unitProperty.enumValueIndex == (int)TemperatureUnit.Fahrenheit)
{
valueProperty.doubleValue -= 32;
valueProperty.doubleValue *= 5.0d / 9.0d;
unitProperty.enumValueIndex = (int)TemperatureUnit.Celsius;
}
else
{
valueProperty.doubleValue *= 9.0d / 5.0d;
valueProperty.doubleValue += 32;
unitProperty.enumValueIndex = (int)TemperatureUnit.Fahrenheit;
}
property.serializedObject.ApplyModifiedProperties();
}
}
}
UXML 파일 만들기
Editor
폴더 아래에Resources
라는 폴더를 만듭니다.temperature_drawer.uxml
라는 이름의 UXML 파일을 생성하고 다음 콘텐츠를 추가합니다:
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements">
<ui:VisualElement class="unity-base-field">
<ui:Label class="unity-base-field__label" />
<ui:VisualElement class="unity-base-field__input" style="flex-direction: row;">
<uie:DoubleField binding-path="value" />
<uie:EnumField binding-path="unit" />
<ui:Button text="Convert" />
</ui:VisualElement>
</ui:VisualElement>
</ui:UXML>
바인딩 테스트
- 새 게임 오브젝트를 생성합니다.
- 게임 오브젝트를 선택한 후
PlanetScript.cs
를 인스펙터에 드래그합니다. - Temperature 필드에 숫자를 입력하고 단위를 선택합니다.
- Convert 버튼을 클릭하여 단위 간 전환을 테스트합니다.
추가 리소스
이 문서는 Unity의 커스텀 컨트롤 및 데이터 타입 바인딩을 통해 확장성을 높이고 사용자 인터페이스의 품질을 향상시키는 데 유용합니다.