Unity Engine

Custom Inspector - ReorderableList(1)

Aostols 2022. 6. 15. 10:41
반응형

유니티를 사용하다보면 인스펙터를 커스텀 해서 사용해야 할 일이 생각보다 많이 있습니다.

보통 배열 형 객체관리를 위해서 다양한 인스펙터를 요구하게 되는 일이 많습니다.

 

[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