유니티를 사용하다보면 인스펙터를 커스텀 해서 사용해야 할 일이 생각보다 많이 있습니다.
보통 배열 형 객체관리를 위해서 다양한 인스펙터를 요구하게 되는 일이 많습니다.
[Serializable]
public struct CharacterData
{
public int Level;
public string CharacterLevel;
public GameObject Prefab;
public Texture2D Image;
}
이러한 구조체가 있고 이것을 배열로 컨트롤 해야 하는 상황입니다.
Serializable 은 선언해 주지 않는다면 구조체가 인스펙터에서 나오지 않습니다.
public class DataObject : MonoBehaviour
{
public CharacterData[] Characters;
}
구조는 매우 단순합니다.
구조체 배열을 가지고 있고 이것을 그대로 게임 오브젝트에 넣게 되면 다음과 같습니다.
Characters 라는 배열 이름이 최상단에 있고
배열 관련하여 +, - 버튼이 있고 누르면 추가 가능합니다.
그 사이에 Element 들로 내부가 채워집니다.
이제 커스텀 인스펙터를 구성합니다.
using UnityEditor;
using UnityEditorInternal;
[CustomEditor(typeof(DataObject))]
public class DataObjectInspector : Editor
{
private ReorderableList list;
private void OnEnable()
{
list = new ReorderableList(
serializedObject,
serializedObject.FindProperty("Characters"),
true,
true,
true,
true);
list.drawHeaderCallback = rect =>
{
EditorGUI.LabelField(rect, "Character Data");
};
}
public override void OnInspectorGUI()
{
serializedObject.Update();
list.DoLayoutList();
serializedObject.ApplyModifiedProperties();
}
}
가장 처음의 CustomEditor 부분은 특정 클래스의 인스펙터를 커스터 마이징 하겠다는 부분 입니다.
ReorderableList는 인스펙터 커스텀의 핵심적인 부분으로 인스펙터에서 설정된 데이터들 객체 하나하나 배열 정도로 이해 하시면 됩니다.
여기서 FindProperty("Characters") 를 하고 있는데 이 부분은 DataObject 에서 있는 변수 입니다.
Characters 라고 배열을 선언 해 두었기 때문에 이를 찾아 주는 부분 입니다.
drawHeaderCallback은 헤더를 설정하는 부분입니다.
실제 적용된 부분을 보게되면 헤더가 바뀐 것을 볼 수 있습니다.
또한 내부에 보이던 속성들이 다 없어 졌는데요 이는 커스텀 인스펙터를 적용하고 아무것도 구현 하지 않아서 입니다.
맨 마지막 OnInspectorGUI 부분은 인스펙터를 그릴때 업데이트를 하라는 부분입니다.
약간 Flush 한다 정도의 느낌입니다.
다음 포스트에 좀 더 디테일한 편집을 알아 보겠습니다.
'Unity Engine' 카테고리의 다른 글
Behavior Tree - Node Canvas (2) (0) | 2022.07.02 |
---|---|
Behavior Tree - Node Canvas (1) (0) | 2022.06.29 |
Unity - RaycastCommand, IJobParallelFor (0) | 2022.06.21 |
Custom Inspector - ReorderableList(2) (0) | 2022.06.20 |
Unity Job System - 종속성 (0) | 2022.05.11 |