오늘은 커스텀 에디터가 무엇인지 알아보고 직접 사용해보려고 한다.
Unity의 에디터의 UI를 확장하거나 수정해서 사용자 정의 인터페이스를 만들 수 있는 기능이다. 예를 들어 특정 기능을 수행하는 버튼을 만들어서 개발자가 쉽게 작업하도록 도움을 줄 수 있다.
커스텀 에디터를 사용하기 전에 먼저 Unity의 에디터 코드가 동작하는 레벨에 대해 알아두면 좋다. 우리가 작성한 대부분의 C# 스크립트는 모든 레벨에서 이용된다. 즉, 에디터에서도 동작하고 빌드된 디바이스에서도 동작한다는 뜻이다. 하지만 에디터 코드는 에디터에서는 동작하지만 빌드된 디바이스에는 아예 포함되지 않아야한다. 왜냐하면 에디터와 관련된 코드들은 실제 게임에는 필요없기 때문이다.
따라서 "Editor" 폴더에 에디터와 관련된 코드들을 관리해야한다. Editor 폴더는 다른 폴더들과 달리 빌드 시 내부 코드들을 포함하지 않는다.
자주 사용하는 커스텀 에디터의 종류는 크게 3가지가 존재한다.
첫번째 방법은 Unity Editor의 Game View에서만 보이는 버튼을 만들어 바로 눌러서 사용할 수 있도록 만드는 방법이다.
#if UNITY_EDITOR void OnGUI() { GUIStyle labelStyle = new GUIStyle(EditorStyles.boldLabel); labelStyle.fontSize = 50; GUIStyle buttonStyle = new GUIStyle(GUI.skin.button); buttonStyle.fontSize = 50; GUILayout.Label("스테이지 설정", labelStyle); if (GUILayout.Button("랜덤 맵 생성", buttonStyle, GUILayout.Width(500), GUILayout.Height(200))) { Debug.Log("스테이지 초기화"); } } #endif
이런식으로 스크립트에 추가해주면 아래와 같이 Game View에서 버튼을 눌러 사용할 수 있다.

두번째 방법은 인스펙터 창을 수정하거나 확장하는 방법이다. 이 방법은 이전에 구글스프레드 시트에서 데이터를 불러오는 것을 구현할 때 사용했던 방법이다.
#if UNITY_EDITOR [CustomEditor(typeof(Character))] public class CharacterCustomInspector : Editor { public override void OnInspectorGUI() { base.OnInspectorGUI(); GUILayout.Label("\n\n테스트 도구"); if (GUILayout.Button("공격력 증가")) { Debug.Log("공격력 증가"); } } } #endif
이렇게 코드를 짜면 아래 이미지와 같이 인스펙터 창에 버튼이 추가되고 버튼을 눌러 쉽게 작업을 수행할 수 있다.
주의할 점은 override한 OnInspectorGUI()의 base.OnInspectorGUI()를 호출하지 않으면 원래 인스펙터창에 표기되어야할 정보들이 전부 표기되지 않는다는 부분이다.
그리고 당연하지만 전처리문을 사용해서 Unity Editor에서만 작동되도록 하거나 Editor폴더에서 관리하지 않으면 빌드시 에러가 발생한다.

마지막은 커스텀 에디터 윈도우를 만드는 것이다. 사실 커스텀 에디터를 사용한다고 하면 이것을 가장 많이 사용할 것 같다.
이전까지 소개한 Game View와 인스펙터 창은 공부용으로 간단하게 만들었지만 이번 커스텀 에디터 윈도우는 직접 사용하기 위해서 만들었다.
커스텀 에디터 윈도우는 개발 도구가 모인 창을 만든다고 생각하면 될 것 같다.
using UnityEngine; using UnityEditor; public class TestEditorWindow : EditorWindow { private Character player; private UIInventory uiInventory; float amount = 0; [MenuItem("Window/Test Editor")] public static void ShowWindow() { GetWindow<TestEditorWindow>("Test Editor"); } private void OnGUI() { GUILayout.Label("플레이어 테스트 도구", EditorStyles.boldLabel); player = (Character)EditorGUILayout.ObjectField("Player", player, typeof(Character), true); if (player != null) { amount = EditorGUILayout.FloatField("증가량", amount); if (GUILayout.Button("공격력 증가")) { player.UpAttackPower(amount); } if (GUILayout.Button("방어력 증가")) { player.UpDefensePower(amount); } if (GUILayout.Button("체력 증가")) { player.UpHealth(amount); } if (GUILayout.Button("크리티컬 증가")) { player.UpCritical(amount); } if (GUILayout.Button("골드 획득")) { player.GainGold((int)amount); } if (GUILayout.Button("경험치 획득")) { player.GainExp((int)amount); } } GUILayout.Space(20); GUILayout.Label("인벤토리 테스트 도구", EditorStyles.boldLabel); uiInventory = (UIInventory)EditorGUILayout.ObjectField("UIInventory", uiInventory, typeof(UIInventory), true); if(uiInventory != null) { if (GUILayout.Button("랜덤 아이템 획득")) { uiInventory.AddItem(); } } } }
이렇게 만든 커스텀 에디터 윈도우는 ShowWindow() 함수 위에 정의 했던 경로에서 켤수 있다.
주의할 점은 ShowWindow() 함수는 반드시 static으로 만들어야한다.
| 커스텀 에디터 윈도우 |
|---|
![]() |
![]() |
이렇게 테스트에 사용할 도구를 모아서 하나의 창에서 관리하면 개발 작업을 하며 여러가지 테스트를 진행할 때 정말 많은 도움이 된다.
