티스토리 뷰
유니티의 강점이라고 한다면 무엇이 있을까.
사실 다양한 내용이 나올 수 있다고 생각하지만, 이번에는 그 중에서 인스펙터를 지목 해 볼까 한다.
물론, 다른 게임 제작 툴이라고 해서 유니티의 인스펙터 같은 내부 변수 편집 도구가 없는 것은 아니지만, 유니티의 인스펙터는 다른 툴들의 그것을 압도하는 '직관성'이 매우 편리하게 다가오는 편이다.
실제로 최근 들어서 '코딩을 하지 않는 게임 제작 툴'이 꽤나 많이 나온 상황인데, 이러한 요소들도 다들 아이콘에 파묻혀서 우왕좌왕 하기 딱 좋은 경우가 대다수다.
[본인은 이렇지 않은 경우를 닌텐도의 '차근 차근 게임 코딩' 하나 밖에 보질 못했다.]
물론, 쉽기로는 유명한 RPGMaker도 게임 제작 툴이기는 하나, 이쪽은 특정 형태가 아니면 만들기가 제법 껄끄러운 데다가, 제대로 각 잡고 만들려면 Ruby라는 프로그래밍 언어를 익혀야 한다.
[최근에는 Unity 에셋 버전으로도 나왔지만, 솔직히 유니티도 강점이 '쉽고 간편하다'라서 딱히 메리트는 없는 편이다.]
이렇듯, 유니티의 인스펙터는 이래저래 상당히 우수한 도구다.
하지만, 이 인스펙터가 과연 완벽한 도구일까, 라고 한다면 단연코 '아니다'라고 할 수 밖에 없다.
2차원 이상의 배열은 표시를 못하는 데다가, 딕셔너리도 표시되지 않는다.
때문에 이 둘을 초기 상태 부터 초기화 하려고 한다면 다른 요소를 추가해서 우회 구현해야 한다는 꽤나 낭비적인 방법을 사용해야 한다.
그렇다면, 이러한 불편함을 그대로 안고 가야하는 걸까.
그걸 막기 위해서 존재하는 기능이 바로 '커스텀 에디터'다.
커스텀 에디터란?
간단하게 말하자면, '인스펙터로는 할 수 없는 변수 조작이나 기능 시행을 개발자가 추가 구현을 통하여 가능하도록 구성하는 기능'이라고 정리할 수 있다.
상술한 문제점을 해결할 수 있는 좋은 수단.
다만, 본인도 이는 아직 공부 중인 사항이라서 이번에는 '어떤 요소들이 있는 가' 만 정리하고, 상세 설명은 추후 조금 더 공부하고 진행을 해 볼 까 한다.
[사실, 본문의 내용 만으로도 어지간한 요소들은 다 적용 가능하다. 상술한 2차원 배열이나 딕셔너리 표현이 문제일 뿐...]
IMGUI
MonoBehaviour 클래스를 대상으로, 해당 클래스의 외부 클래스로 작성하여 해당 클래스의 내부 표시 UI를 작성하는 기능.
상술한 Inspector의 허점을 메울 수 있으면서 더 나아가 유용한 기능을 추가할 수 있는 기능.
에디터 창(EditorWindow)와 인스펙터 커스텀 에디터(Inspector Custom Editor) 2 종류가 존재한다.
참고 URL: https://docs.unity3d.com/kr/2022.3/Manual/ExtendingTheEditor.html
[사실, Documentation에서는 IMGUI 보다는 최신 기능인 UI Toolkit을 사용하는 것을 권장하고 있긴 하다.]
EditorWindow
유니티 상에서 게임 실행 '도중에' 게임 화면 위에 띄워지는 방식의 커스텀 에디터.
EditorWindow를 상속받아서 작성해야 하며, 이후 [MenuItem(string)]으로 현재 GUI를 지정한다.
이후 public static void ShowWindow() 함수에서 EditorWindow.GetWindow() 함수로 GUI를 펼친다.
마지막으로, EditorWindow.GetWindow()를 통해서 에디터 창을 연 다음 OnGUI() 함수에서 각 UI를 배치하는 구조다.
이렇게 구성한 GUI를 목표 클래스에서 OnGUI() 함수에서 GUILayout 내부 함수들을 이용해서 각 변수와 연결하거나 수치를 조정하는 방식으로 사용된다.
하나의 EditorWindow 스크립트로 복수 GUI를 형성할 수 있으나, UI를 겹치면 제일 위의 GUI 하나만 반응하니 주의.
다만, '게임 실행 중'에만 수정 가능한 데다가, 화면을 가리기 때문에 자주 사용되지는 않는다고 한다.
InspectorCustomEditor
인스펙터를 뜯어고쳐서 표시하거나 제어할 수 있는 기능의 폭을 넓히는 방식의 커스텀 에디터.
Editor를 상속받아서 작성하며, 클래스 선언 전에 [CustomEditor(typeof(class))]로 에디터 적용 대상을 명시해야 한다.
이후에 OnInspectorGUI() 함수에서 인스펙터 내부 내용을 작성하면 된다.
EditorWindow와는 달리 대상 파일에서는 따로 진행해야 하는 작업은 없고, Editor를 상속받은 클래스에서 해당 인스펙터 변화를 적용할 대상을 명시하는 방식이므로, 일반적인 파일을 작성한 다음에 추가 작업으로 진행으로 작업해도 원래 작성했던 대상 파일은 그다지 수정할 필요가 없어 용이하게 진행이 가능하다.
커스텀 에디터라고 한다면 보통 이쪽을 말한다.
인스펙터를 변경하는 방식이기 때문에 평소와 비슷한 감각으로 작성하다가 필요에 따라서 추가하기에도 편한 편이고, 무엇보다 게임 화면을 가리지 않아서 커스텀 에디터가 필요하면 보통은 이 쪽으로 구성하는 편이다.
오늘은 커스텀 인스펙터의 기본적인 사용법에 대해서 알아보았다.
물론, 실질적으로 이를 유효하게 활용하기 위해서는 상세한 구성법을 더욱 알아봐야 할 것 같다.
특히 상술한 2건(다차원 배열, 딕셔너리)은 인스펙터에 보이고 안보이고 차이가 꽤 있을 가능성이 있어서, 언제 한 번 시간 내서 다시 정리해 볼 것 같다.
'스파르타 내일배움캠프 > Today I Learned' 카테고리의 다른 글
Today I Learned - Day 52 [abstract - 상속을 상속받기] (0) | 2024.11.26 |
---|---|
Today I Learned - Day 51 [기획의 노하우? 본인의 기획법] (0) | 2024.11.25 |
Today I Learned - Day49 [SceneManager] (0) | 2024.11.21 |
Today I Learned - Day 48 [씬을 관리하는 효율적인 방법] (1) | 2024.11.20 |
Today I Learned - Day 47 [UI 클릭을 구현하는 다양한 방법] (0) | 2024.11.19 |