Unity 매뉴얼: UI 툴킷과 바인딩을 사용한 커스텀 인스펙터 만들기
개요
이 가이드는 Unity 에디터에서 UI 툴킷을 이용해 커스텀 인스펙터를 만들고, 바인딩을 통해 속성 변경을 감지하는 방법을 설명합니다. 예제에서는 무기 클래스의 기본 데미지와 어려운 모드를 위한 수치를 바인딩하여 사용자가 값을 입력할 때 경고 메시지를 제공하는 기능을 구현합니다.
요구 사항
- 이 가이드는 Unity 에디터, UI 툴킷, 그리고 C# 스크립팅에 대한 이해가 있는 개발자를 위해 작성되었습니다.
- Unity의 기본 사용법에 익숙한 상태여야 합니다.
시작하기
- 무기 클래스 작성
Weapon
클래스를 생성하고 두 개의 프로퍼티를 정의합니다:m_BaseDamage
와m_HardModeModifier
. 아래의 C# 스크립트를 사용하세요.
```csharp using UnityEngine;
namespace UIToolkitExamples { public class Weapon : MonoBehaviour { public const float maxDamage = 9999f;
[SerializeField]
float m_BaseDamage;
[SerializeField]
float m_HardModeModifier;
public float GetDamage(bool hardMode)
{
return hardMode ? m_BaseDamage * m_HardModeModifier : m_BaseDamage;
}
}
} ```
- 커스텀 인스펙터 정의
Weapon
클래스에 대한 커스텀 인스펙터를 정의합니다.TrackSerializedObjectValue()
메서드를 사용하여 프로퍼티의 변경 사항을 감지하는 코드를 아래와 같이 작성하세요.
```csharp using UnityEngine; using UnityEditor; using UnityEngine.UIElements; using UnityEditor.UIElements;
namespace UIToolkitExamples { [CustomEditor(typeof(Weapon))] public class WeaponCustomEditor : Editor { const string k_NegativeWarningText = "이 무기는 적어도 1종의 난이도에서 최종 데미지가 음수입니다."; static readonly string k_DamageCapWarningText = "이 무기의 최종 데미지가 " + Weapon.maxDamage + "로 제한됩니다.";
Label m_NegativeWarning, m_DamageCapWarning;
public override VisualElement CreateInspectorGUI()
{
VisualElement root = new();
var baseDamageField = new FloatField("기본 데미지") { bindingPath = "m_BaseDamage" };
var modifierField = new FloatField("하드 모드 수정자") { bindingPath = "m_HardModeModifier" };
root.Add(baseDamageField);
root.Add(modifierField);
var warnings = new VisualElement();
m_NegativeWarning = new(k_NegativeWarningText);
m_DamageCapWarning = new(k_DamageCapWarningText);
warnings.style.color = Color.red;
warnings.style.unityFontStyleAndWeight = FontStyle.Bold;
warnings.Add(m_NegativeWarning);
warnings.Add(m_DamageCapWarning);
root.Add(warnings);
CheckForWarnings(serializedObject);
root.TrackSerializedObjectValue(serializedObject, CheckForWarnings);
return root;
}
void CheckForWarnings(SerializedObject serializedObject)
{
var weapon = serializedObject.targetObject as Weapon;
var damages = new float[] { weapon.GetDamage(true), weapon.GetDamage(false) };
var foundNegativeDamage = false;
var foundCappedDamage = false;
foreach (var damage in damages)
{
|| |---| }
m_NegativeWarning.style.display = foundNegativeDamage ? DisplayStyle.Flex : DisplayStyle.None;
m_DamageCapWarning.style.display = foundCappedDamage ? DisplayStyle.Flex : DisplayStyle.None;
}
}
} ```
- 바인딩 테스트
- 빈 게임오브젝트를 생성한 후 선택합니다.
- 인스펙터에서
Weapon
컴포넌트를 추가합니다. Base Damage
와Hard Mode Modifier
의 값을 변경합니다.- 입력한 값이 음수이거나 9999 이상일 경우, 경고 메시지가 표시됩니다.
추가 리소스
- SerializedObject 데이터 바인딩
- 바인딩 가능한 요소
- 바인딩 데이터 타입 전환
- 구현 세부 정보
저작권 © 2022 Unity Technologies. Publication 2022.3