[Unity] Editor 클래스로 Inspector 기능 확장하기 / Inspector에 커스텀한 버튼 달기

지즈·2025년 6월 22일
0

Unity

목록 보기
17/17

Editor Customize

Unity의 Editor를 확장시켜 씬 상의 오브젝트나 인스펙터를 직접 제어 및 커스터마이징할 수 있는 기능입니다.

에디터 커스터마이징이란?

씬 상의 오브젝트의 컴포넌트 관련 인스펙터를 확장하거나 커스터마이징 하고 싶을 때, Editor 클래스를 상속한 스크립트를 작성합니다. 즉, 인스펙터 GUI(버튼이나 슬라이더 등)에 기능을 추가할 수 있게 됩니다.

간단한 동작 원리

  1. Unity는 에디터 실행 시, .../Editor 폴더 내부의 모든 에디터 스크립트를 스캔합니다.
  2. CustomEditor(typeof(SomeType))] 어트리뷰트를 가진 Editor 클래스가 있다면, SomeType.cs 를 컴포넌트로 갖는 오브젝트의 인스펙터에 이 Editor 를 매핑합니다.
  3. 이후 Unity는 Editor.OnInspectorGUI() 를 자동으로 호출하여 GUI를 그립니다.

스크립트 구성

씬 상에 부착할, 기능을 확장하고 싶은 Monobehaviour를 상속받는 스크립트

public class Object : Monobehaviour
{
	public int v;
}

이 클래스는 Unity 씬의 GameObject에 부착되며, 인스펙터에 v 값이 표시됩니다.

확장할 기능을 구현한, Editor 클래스를 상속한 스크립트

using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(Object))] // 어트리뷰트 설정 
public class ExpandedEditor : Editor // Editor 클래스 상속 
{
	public override void OnInspectorGUI() // GUI 요소 렌더링
	{
		base.OnInspectorGUI();
		
		int v = ((Object)target).v; // 타겟 설정
	}
}

이 클래스는 Object 타입을 대상으로 인스펙터를 커스터마이징합니다.

스크립트를 한 줄 한 줄 설명해보겠습니다.

[customEditor(typeof(T))]

해당 어트리뷰트는 Unity에게 T 타입의 오브젝트가 인스펙터에 표시될 때, 이 Editor 클래스를 사용하라고 지시하는 명령어입니다.

Editor 클래스를 상속

Editor 클래스는 UnityEditor 네임스페이스에 포함되어 있으며, 에디터 전용 동작을 위한 API입니다. 그러므로 반드시 에디터 전용 폴더에 있어야 합니다. 이 때 Editor 폴더는 폴더명이 Editor이어야 합니다. (Assets/Editor이든, Asset/Script/Item/Editor이든 Unity는 에디터 전용으로 처리할 수 있음)

public override void OnInspectorGUI() 역할과 동작 원리

이 메서드는 Unity 인스펙터가 특정 오브젝트를 그릴 때 호출되는 메서드입니다. 원하는 UI 요소를 자유롭게 배치할 수 있습니다. base.OnInspector()를 호출해야 기본 인스펙터 UI도 같이 렌더링됩니다.

target 설정

target은 해당 Editor 스크립트가 편집 중인 대상 오브젝트를 설정합니다. 이 방식으로 런타임 필드 값을 가져오거나 조작할 수 있습니다.


예제 코드


인스펙터 상에 표시되는 버튼을 클릭함으로써 조건에 따라 수동으로 UnityEvent를 실행할 수 있는 코드를 작성했습니다. 런타임에서 값을 수정하며 결과를 바로 확인할 수 있는 기능이 필요했기 때문입니다.

UnityEventInvoker.cs

using UnityEngine;
using UnityEngine.Events;

public class UnityEventInvoker : MonoBehaviour
{
    public UnityEvent onClick;
}

이 스크립트는 씬 오브젝트에 부착됩니다. UnityEvent 타입은 인스펙터에서 유니티 이벤트를 지정할 수 있습니다.

UnityEventInvokerEditor.cs

using UnityEngine;
using UnityEngine.Events;

#if UNITY_EDITOR
using UnityEditor;

[CustomEditor(typeof(UnityEventInvoker))]
public class UnityEventInvokerEditor : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        UnityEvent onClick = ((UnityEventInvoker)target).onClick;

        if (Application.isPlaying)
        {
            if (GUILayout.Button("Excute!"))
            {
                onClick?.Invoke();
            }
        }
    }
}
#endif

Editor 스크립트는 Play 모드일 때만 버튼을 보여주며, 클릭 시 UnityEvent를 호출하여 실행합니다.


발생할 수 있는 오류

this script is an editor script.

Asset
| - Editor
| - | - ExpandedEditor.cs

씬 상의 오브젝트에 부착하려는 스크립트가 .../Editor 폴더에 위치할 때 발생합니다. 에디터 스크립트는 일반 게임 로직 스크립트처럼 게임 오브젝트에 추가될 수 없습니다. 클래스를 나눠 작성하는 이유입니다(나누지 않아도 .../Editor 하위 폴더에 존재하지 않는다면 문제가 생기진 않습니다).

profile
클라이언트 개발자가 되는 그 날까지 킵 고잉

0개의 댓글