Unity

유니티 - CustomEditor 활용 (Inspector 꾸미기)

정글(Jungle) 2024. 7. 9. 04:00
반응형

 

유니티에서 아이템이나 무기 등의 설정값으로 ScriptableObject를 사용하면서 해당 아이템이나 무기 등의 이미지를 상단에 표시해 주는 기능을 CustomEditor를 이용해 꾸며 보겠습니다. (아래 이미지 참조)

 

우선 사용자의 ScriptableObject 가 있을 겁니다. (아래 소스 참조)

[CreateAssetMenu(menuName = "ScriptableObjects/WeaponValue")]
public class WeaponValue : ScriptableObject {
    [Header("이름")]
    public string weaponName;

    [Header("이미지")]
    public Sprite weaponImage;

    [Header("파워")]
    public float Damage;

    [Header("이미지 목록")]
    public List<Sprite> imageList;
}

 

위 ScriptableObject를 CustomEditor를 이용해 위쪽 이미지 처럼 나오게 하려면

#if UNITY_EDITOR
[CustomEditor(typeof(WeaponValue))]
public class GuiTest : Editor {
    WeaponValue value;

    private void OnEnable() {
        value = (WeaponValue)target;
    }
    
    public override void OnInspectorGUI() {
        EditorGUILayout.BeginVertical();

        EditorGUILayout.Space();
        value.weaponImage =  (Sprite)EditorGUILayout.ObjectField("이미지",
        	value.weaponImage, typeof(Sprite), true);

        EditorGUILayout.Space();
        GUILine(4);
        EditorGUILayout.Space();

        base.OnInspectorGUI();

        EditorGUILayout.EndVertical();
    }

    void GUILine( int lineHeight = 1 ) {
        EditorGUILayout.Space();
        Rect rect = EditorGUILayout.GetControlRect(false, lineHeight );
        rect.height = lineHeight;
        EditorGUI.DrawRect(rect, new Color ( 0.5f,0.5f,0.5f, 1 ) );
        EditorGUILayout.Space();
   }  
}
#endif

 

    WeaponValue value;

    private void OnEnable() {
        value = (WeaponValue)target;
    }

 

GuiTest.cs의 target이 ScriptableObject인 WeaponValue로 지정해 줍니다. 

 

EditorGUILayout.BeginVertical();

EditorGUILayout.EndVertical();

Editor의 세로 정렬의 시작과 끝을 표시 합니다.

 

EditorGUILayout.Space();

Inspector에서 한 줄의 빈칸을 만들어 간격을 만들어 줍니다.

 

value.weaponImage =  (Sprite)EditorGUILayout.ObjectField("이미지", 
	value.weaponImage, typeof(Sprite), true);

ObjectField의 타입을 스프라이트로 지정해 주고 WeaponValue의 이미지를 화면에 표시해 줍니다.

마지막 true => "allowSceneObjects" true면 Hierarchy에서 이미지를 끌어다 적용할 수 있지만 flase면 반대의 기능을 합니다.

 

    void GUILine( int lineHeight = 1 ) {
        EditorGUILayout.Space();
        Rect rect = EditorGUILayout.GetControlRect(false, lineHeight );
        rect.height = lineHeight;
        EditorGUI.DrawRect(rect, new Color ( 0.5f,0.5f,0.5f, 1 ) );
        EditorGUILayout.Space();
   }

 

한줄 라인을 그려 줍니다. 별도의 높이 값 없이 사용한다면 기본값은 1

 

base.OnInspectorGUI();

ScriptableObject인 WeaponValue 내용을 화면에 표시해 줍니다.

 

이상으로 간단하지만 CustomEditor의 활용 편이었습니다.

반응형