Unity의 Editor를 확장시켜 씬 상의 오브젝트나 인스펙터를 직접 제어 및 커스터마이징할 수 있는 기능입니다.
씬 상의 오브젝트의 컴포넌트 관련 인스펙터를 확장하거나 커스터마이징 하고 싶을 때, Editor
클래스를 상속한 스크립트를 작성합니다. 즉, 인스펙터 GUI(버튼이나 슬라이더 등)에 기능을 추가할 수 있게 됩니다.
.../Editor
폴더 내부의 모든 에디터 스크립트를 스캔합니다.CustomEditor(typeof(SomeType))]
어트리뷰트를 가진 Editor
클래스가 있다면, SomeType.cs
를 컴포넌트로 갖는 오브젝트의 인스펙터에 이 Editor
를 매핑합니다. 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
타입을 대상으로 인스펙터를 커스터마이징합니다.
스크립트를 한 줄 한 줄 설명해보겠습니다.
해당 어트리뷰트는 Unity에게 T 타입의 오브젝트가 인스펙터에 표시될 때, 이 Editor 클래스를 사용하라고 지시하는 명령어입니다.
Editor
클래스는 UnityEditor 네임스페이스에 포함되어 있으며, 에디터 전용 동작을 위한 API입니다. 그러므로 반드시 에디터 전용 폴더에 있어야 합니다. 이 때 Editor 폴더는 폴더명이 Editor
이어야 합니다. (Assets/Editor
이든, Asset/Script/Item/Editor
이든 Unity는 에디터 전용으로 처리할 수 있음)
이 메서드는 Unity 인스펙터가 특정 오브젝트를 그릴 때 호출되는 메서드입니다. 원하는 UI 요소를 자유롭게 배치할 수 있습니다. base.OnInspector()
를 호출해야 기본 인스펙터 UI도 같이 렌더링됩니다.
target
은 해당 Editor
스크립트가 편집 중인 대상 오브젝트를 설정합니다. 이 방식으로 런타임 필드 값을 가져오거나 조작할 수 있습니다.
인스펙터 상에 표시되는 버튼을 클릭함으로써 조건에 따라 수동으로 UnityEvent를 실행할 수 있는 코드를 작성했습니다. 런타임에서 값을 수정하며 결과를 바로 확인할 수 있는 기능이 필요했기 때문입니다.
using UnityEngine;
using UnityEngine.Events;
public class UnityEventInvoker : MonoBehaviour
{
public UnityEvent onClick;
}
이 스크립트는 씬 오브젝트에 부착됩니다. UnityEvent 타입은 인스펙터에서 유니티 이벤트를 지정할 수 있습니다.
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를 호출하여 실행합니다.
Asset
| - Editor
| - | - ExpandedEditor.cs
씬 상의 오브젝트에 부착하려는 스크립트가 .../Editor
폴더에 위치할 때 발생합니다. 에디터 스크립트는 일반 게임 로직 스크립트처럼 게임 오브젝트에 추가될 수 없습니다. 클래스를 나눠 작성하는 이유입니다(나누지 않아도 .../Editor
하위 폴더에 존재하지 않는다면 문제가 생기진 않습니다).