(유니티3D)커스텀 에디터(인스펙터 창 변경)
글 작성에 앞서 저도 다른 분들의 글을 참고하며 배웠습니다
그렇기에 코드에 그 분들의 흔적이 다소 남아있으며 이 글로는 부족하다면 추가로 보는 것도 좋을 것 같습니다.
https://486boy.blogspot.kr/2014/05/unity.html
유니티는 Inspector 창을 통해 굉장히 쉽게 특정 변수에 접근이 가능하고 이를 통해 개발자는 실시간으로 특정 변수의 값을 확인하고 변경할 수 있어 눈으로 확인하면서 변화를 줄 수 있습니다.
물론 굳이 에디터 커스터마이징을 거치지 않고도 자체적으로 인스펙터 속성을 통해 배치를 하는 것도 가능합니다.
대부분의 경우는 이 속성만으로도 충분히 깔끔하게 만들 수 있습니다.
하지만 하나의 스크립트에 많은 기능을 내포하고 있는 경우 Bool이나 Enum으로 일종의 모드를 바꾸는 방식을 취하는 경우가 많은데 이 때 선택한 모드에 따라 필요한 부분과 필요 없어지는 부분이 생깁니다.
어차피 필요 없어진 부분은 어떤 값을 넣어도 영향을 주지 않겠지만 기능이 많을 수록 변수의 양도 많을테니 사용 유무의 관계없이 항상 전부 보여준다면 Inspector 창은 굉장히 지저분해 보일 것입니다.
그 때 필요한 것이 에디터 커스터마이징입니다.
이를 이용하면 자체 지원하는 속성 이외에도 더 많은 부분을 직접 건드릴 수 있습니다.
이전 글에 썼던 이미지인데 이처럼 공통적으로 필요한 부분은 놔두고 모드에 따라 특정 입력 필드만 생기게 만들 수도 있습니다.
여기서는 Bool의 값에 따라 바뀌게 했지만 Enum을 활용하여 콤보박스의 형태로 만들 수도 있습니다.
코드는 마찬가지로 이전 글에 썼던 것을 이용하겠습니다.
주석으로 상세하게 달아두긴 했는데 기존 스크립트들과는 다른 부분에 대해서만 더 짚고 가겠습니다.
가장 먼저 Editor 클래스는 Editor 폴더에 들어있어야 합니다.
꼭 Asset/Editor 의 경로일 필요는 없습니다. 저같은 경우 Asset/Script/Editor 의 경로에 넣었는데 잘 작동됩니다.
또한 Editor 폴더에 담긴 스크립트는 최종빌드에 포함되지 않는다고 하니 빌드본의 사양에는 영향을 주지 않는거 같습니다.
그리고 using UnityEditor; 를 해주셔야 에디터를 사용할 수 있습니다.
클래스 상속은 MonoBehaviour이 아닌 Editor로 해주셔야 합니다.
하나 특이한 점은 클래스 이름과 실제 파일명이 같아야 하는 기존 스크립트와 다르게 파일명이 달라도 정상 작동합니다.
위 코드를 보면 클래스명이 SimpleEditorInspector으로 되어있지만 파일명은 EditorInspector으로 되어있습니다. 하지만 아무런 문제가 없습니다.
기본 형태는 EditorGUILayout에 다 마련되어 있기 때문에 그대로 사용하면 됩니다. 대부분 이름도 굉장히 직관적입니다.
현재 사용한 형태는 툴팁을 위해 GUIContent를 사용하였는데 원래의 형태와 똑같이 쓰시려면
_editor.debugLine = EditorGUILayout.Toggle("Debug Line", _editor.debugLine);
이런식으로 사용하시면 됩니다. 저 "Debug Line" 부분엔 한글을 써도 됩니다.
단, 일반 변수처럼 알아서 맨 앞 글자를 대문자로 만들어주고 다음 대문자를 만나면 띄워주는 기능은 없으니 정확하게 입력해야 합니다.
조건부 형태변경에 대해서는 if문을 활용거나 switch를 사용해도 됩니다.
위 코드에서 UseProperty 함수는 내용은 유니티 커뮤니티에서 가져왔습니다.
거의 모든 형태를 지원하지만 EditorGUILayout가 배열은 지원해주지 않아 검색했더니 원본을 그대로 가져오는 방법을 알려주더군요.
원본은 함수 내에 있는 5줄입니다만 추후 활용하기 편하도록 함수로 만들었습니다.
최종적으로 EditorUtility.SetDirty(target); 코드가 있어야 사용자의 변경 사항이 실제로 적용됩니다. 이 코드가 없으면 인스펙터 창의 값들은 바뀌는데 실제로 스크립트에 적용되진 않은 모습을 보실 수 있습니다.
사용하기 위해선 하나의 스크립트를 더 만들 필요가 있어서 다소 번거롭지만 하나 제대로 만들어두면 해당 스크립트 활용이 훨씬 편해지니 알아두면 좋을 거 같습니다.
'정리' 카테고리의 다른 글
(유니티3D) FPS 총기 반동 구현하기 1 (1) | 2018.01.24 |
---|---|
(유니티 2D) UGUI Canvas 설정 (0) | 2017.12.28 |
(유니티 2D) 카메라 사이즈와 Pixels Per Unit (1) | 2017.12.28 |
(유니티3D)CharacterController 횡스크롤 캐릭터 (0) | 2017.12.17 |
(유니티3D)CharactorController용 움직이는 땅 (0) | 2017.12.15 |