키워드 = 커스텀 에디터, 커스텀 인스펙터, GUILayout, EditorGUILayout
기본적으로 GUILayout과 EditorGUILayout의 차이는 후자의 에디터가 붙은 레이아웃은 오로지 유니티 에디터상에서만 볼 수 있다는 점. 따라서 인게임 UI를 GUILayout코드로 설정 할 때는 잘봐야함.
기본 GUI그룹과 EditorGUI그룹은 제공하는 래퍼런스가 살짝 차이가 있어서 섞어쓰게 되는 경우도 있음.
유니티 공식 레이아웃 메뉴얼
https://docs.unity3d.com/kr/2020.3/Manual/gui-Layout.html
IMGUI 레이아웃 모드 - Unity 매뉴얼
IMGUI 시스템을 사용할 때 UI를 정렬하고 구성하는 데 사용할 수 있는 고정 및 자동의 두 가지 모드가 있습니다. 지금까지 이 가이드에 제공된 모든 IMGUI 예제에는 고정 레이아웃이 사용되었습니다
docs.unity3d.com
EditorGUILayout 래퍼런스
https://docs.unity3d.com/kr/530/ScriptReference/EditorGUILayout.html
UnityEditor.EditorGUILayout - Unity 스크립팅 API
Auto-layouted version of EditorGUI.
docs.unity3d.com
GUILayout 래퍼런스
https://docs.unity3d.com/kr/530/ScriptReference/GUILayout.html
UnityEngine.GUILayout - Unity 스크립팅 API
The GUILayout class is the interface for Unity gui with automatic layout.
docs.unity3d.com
필요한 기능이 있으면 직접 찾아서 쓸것
아래는 자주사용했던 기능 위주로 소개
[CustomEditor(typeof(T))]
public class Test : Editor
{
T value;
private void OnEnable() // 초기설정이 필요하면 여기서
{
value = (T)target;
}
public override void OnInspectorGUI() // Inspector창에 나타낼 정보들
{
// 자주 써먹을만한것들 위주로
// 수직 정렬그룹. Begin과 End사이에 들어가 있는 GUI들은 전부 수직정렬됨.
EditorGUILayout.BeginVertical();
EditorGUILayout.EndVertical();
// 수평 정렬그룹.
EditorGUILayout.BeginHorizontal();
EditorGUILayout.EndHorizontal();
// 여백추가
GUILayout.Space(float);
// 공백추가(빈공간을 삭제해줌 - 버튼같은거에 앞뒤에 넣어주면 가운데정렬가능
GUILayout.FlexibleSpace();
// 각종 필드추가
EditorGUILayout.IntField(int);
EditorGUILayout.FloatField(float);
EditorGUILayout.TextField(string);
EditorGUILayout.TextArea(string);
EditorGUILayout.ObjectField("Label", object, typeof(object), true);
// 필드에 T의 특정값을 실제로 넣을 땐 대충 아래의 형태가 됨.
// 만약 T에 있는 mySprite라는 이름의 스프라이트 이미지를 표시할 경우
value.mySprite = EditorGUILayout.ObjectField("이미지이름", value.mySprite, typeof(Sprite), true);
// 버튼추가
if (GUILayout.Button(String or Image))
{
// 버튼 누를시 실행될 작업
}
}
}
위에 래퍼런스중에 ObjectField는 공식문서에 Obsolete로 되있는데 왜그런진 모르겠다.
'allowSceneObjects'
키워드를 참고하라는데 쳐봐도 나오는게 없고 편집기에선 Obsolete붙어있지도 않음. 그냥 써도될듯.
아무튼 위에 커스텀 에디터 래퍼런스랑 ScriptableObject와 결합하면 아주 보기좋은 형태의 자신만의 에디터를 만들 수 있음.
래퍼런스함수 대부분의 매개변수에 params 타입으로 되있는 GUILayoutOption[] 을 넣을 수 있음.
이건 그냥 옵션배열인데 매개변수에 직접 넣어도 되고 따로 옵션을 만들어서 넣어도 됨
GUILayout.Button("버튼", GUILayout.Width(30), GUILayout.Height(30))
// 이런식으로 옵션을 직접 넣어도 되고
GUILayoutOption[] style = { GUILayout.MinHeight(50), GUILayout.MinWidth(50)};
GUILayout.Button("버튼", style)
// 이런식으로 직접 style을 만들어서 넣어도 됨
추가로 적을만한게 생기면 아래에 추가
Inspector 같은 창의 넓이를 구하는 방법 (사이즈 크기 조절할때나 가운데 정렬하고싶을 때 쓰면 좋음)
EditorGUIUtility.currentViewWidth
인스펙터에서 수정한 내용대로 실제 값을 변경하고싶은 경우
if (GUI.changed) EditorUtility.SetDirty(target);
만약 상속받은 객체에서도 사용하고싶을 경우
[CustomEditor(typeof(T))] 를 [CustomEditor(typeof(T), true)] 로 하면 된다고함.
https://docs.unity3d.com/ScriptReference/CustomEditor-isFallback.html
관련내용은 위 링크. 뭐 isFallback이라는 값을 true로 바꿔주는거라는데 상속 허용 뭐 그런건가봄.
'Study > 유니티' 카테고리의 다른 글
유니티 관련 잡다지식 기록용 (0) | 2023.02.18 |
---|---|
유니티 리치 텍스트 / Unity Rich Text (0) | 2023.02.16 |
C# 인터페이스, 추상클래스, 상속 (0) | 2020.03.18 |
Text Mesh Pro (텍스트 매쉬 프로) 사용법 (0) | 2020.03.05 |
유니티 파티클 간단정리 (0) | 2020.02.14 |