[Unity6] Custom Editor (그룹정렬, Scrollview, fold …)
카테고리: Go Unity
Horizontal
, Vertical
, ScrollView
, DisabledGroup
, ChangeCheck
, Foldout
, FoldoutHeaderGroup
Begin, End
UI를 그룹으로 관리해 가로, 세로로 정렬하거나 활성, 비활성 등의 제어
Horizontal(가로), Vertical(세로), ScrollView(정렬, 스크롤 바)
DisabledGroup : 상호작용 활성/비활성화
ChangeCheck : UI가 상호작용했을 때 End 메소드가 True를 반환
Foldout : 열고 닫기
FoldoutHeaderGroup : 메뉴 작동 가능한 폴드 아웃
Horizontal, Vertical
GUILayout, EditorGUILayout제공
Rect BeginHorizontal(), void EndHorizontal()
Rect BeginVertical(), void EndVertical()
begin ~ end 사이 UI를 가로, 세로 정렬 | Rect는 해당 범위의 위치, 크기
Horizontal, Vertical
private void Horizontal(GUIStyle titleStyle)
{
EditorGUILayout.LabelField("Begin/End Horizontal", titleStyle);
var mainOptions = new GUILayoutOption[] { GUILayout.Width(256), GUILayout.Height(64) };
var subOptions = new GUILayoutOption[] { GUILayout.Width(32), GUILayout.Height(32) };
GUILayout.BeginHorizontal("", GUI.skin.box, mainOptions);
GUILayout.Button("1", subOptions);
GUILayout.Button("2", subOptions);
GUILayout.Button("3", subOptions);
GUILayout.EndHorizontal();
Rect rect = EditorGUILayout.BeginHorizontal(GUI.skin.box, mainOptions);
if ( GUILayout.Button("Rect", subOptions) ) { Debug.Log(rect); }
if ( GUILayout.Button("1", subOptions) ) { Debug.Log("Play"); }
if ( GUILayout.Button("2", subOptions) ) { Debug.Log("Pause"); }
if ( GUILayout.Button("3", subOptions) ) { Debug.Log("Stop"); }
EditorGUILayout.EndHorizontal();
}
private void Vertical(GUIStyle titleStyle)
{
EditorGUILayout.Space(EditorGUIUtility.singleLineHeight);
EditorGUILayout.LabelField("Begin/End Vertical", titleStyle);
var options = new GUILayoutOption[] { GUILayout.Width(32), GUILayout.Height(32) };
EditorGUILayout.BeginVertical();
if ( GUILayout.Button("1", options) ) { Debug.Log("Push 1"); }
if ( GUILayout.Button("2", options) ) { Debug.Log("Push 2"); }
if ( GUILayout.Button("3", options) ) { Debug.Log("Push 3"); }
EditorGUILayout.EndVertical();
}
ScrollView
GUILayout, EditorGUILayout제공
Vector2 BeginScrollView(Vector2)
void EndScrollView()
UI를 ScrollView에 세로로 정렬
ScrollView
private void ScrollView(GUIStyle titleStyle)
{
EditorGUILayout.Space(EditorGUIUtility.singleLineHeight);
EditorGUILayout.LabelField("Begin/End ScrollView", titleStyle);
var options = new GUILayoutOption[] { GUILayout.ExpandWidth(true), GUILayout.Height(100) };
scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition, true, true, options);
for ( int i = 0; i < 100; ++ i )
{
EditorGUILayout.LabelField($"{i}");
}
EditorGUILayout.EndScrollView();
}
DisabledGroup
EditorGUI제공
void BeginDisabledGroup(bool)
void EndDisabledGroup()
UI의 상호작용 활성, 비활성 설정
DisabledGroup
private void DisabledGroup(GUIStyle titleStyle)
{
EditorGUILayout.Space(EditorGUIUtility.singleLineHeight);
EditorGUILayout.LabelField("Begin/End DisabledGroup", titleStyle);
string text = isDisabled ? "ON" : "OFF";
isDisabled = EditorGUILayout.Toggle($"볼륨조절 {text}", isDisabled);
EditorGUI.BeginDisabledGroup(!isDisabled);
volume = EditorGUILayout.Slider(volume, 0f, 100f);
EditorGUI.EndDisabledGroup();
// GUI.enabled = true, false;로 설정해도 된다.
GUI.enabled = isDisabled;
volume = EditorGUILayout.Slider(volume, 0f, 100f);
GUI.enabled = true;
}
ChageCheck
EditorGUI제공
void BeginChageCheck()
void EndChageCheck()
UI가 상호작용했을 때 End 메소드가 True를 반환
ChageCheck
private void ChangeCheck(GUIStyle titleStyle)
{
EditorGUILayout.Space(EditorGUIUtility.singleLineHeight);
EditorGUILayout.LabelField("Begin/End ChangeCheck", titleStyle);
toggleValue = EditorGUILayout.Toggle("Don't Change Check", toggleValue);
EditorGUI.BeginChangeCheck();
toggleValue = EditorGUILayout.Toggle("Change Check", toggleValue);
if ( EditorGUI.EndChangeCheck() )
{
Debug.Log("Change Check Toggle키 상호작용");
}
}
Foldout
EditorGUI, EditorLayout제공
bool Foldout(bool, string, bool)
내용을 열고 닫기
Foldout
private GameObject gameObject = null;
private void Foldout(GUIStyle titleStyle)
{
EditorGUILayout.Space(EditorGUIUtility.singleLineHeight);
EditorGUILayout.LabelField("Foldout", titleStyle);
isExpanded = EditorGUILayout.Foldout(isExpanded, "오브젝트 등록 활성/비활성", true);
if ( isExpanded == true )
{
gameObject = EditorGUILayout.ObjectField(gameObject, typeof(GameObject), true) as GameObject;
}
}
FoldoutHeaderGroup
EditorGUI, EditorLayout제공
bool beginFoldoutHeaderGroup(bool, stirng, System.Action<Rect>
)
void EndFoldoutHeaderGroup()
기본 구조는 Foldout과 동일하지만 우측에 메뉴 버튼이 추가된 형태
FoldoutHeaderGroup
private void FoldoutHeaderGroup(GUIStyle titleStyle)
{
EditorGUILayout.Space(EditorGUIUtility.singleLineHeight);
EditorGUILayout.LabelField("FoldoutHeaderGroup", titleStyle);
isExpanded = EditorGUILayout.BeginFoldoutHeaderGroup(isExpanded, "아이디/비밀번호", menuAction:ShowHeaderContextMenu);
if ( isExpanded == true )
{
EditorGUILayout.BeginVertical();
id = EditorGUILayout.TextField("아이디", id);
pass = EditorGUILayout.PasswordField("패스워드", pass);
EditorGUILayout.EndVertical();
}
EditorGUILayout.EndFoldoutHeaderGroup();
}
private void ShowHeaderContextMenu(Rect position)
{
GenericMenu menu = new GenericMenu();
menu.AddItem(new GUIContent("Clear"), false, () =>
{
id = string.Empty;
pass = string.Empty;
});
menu.AddItem(new GUIContent("Default"), false, () =>
{
id = "포스트잇";
pass = "Unity";
});
menu.DropDown(position);
}
이것저것 메모
잡담, 일기?
Horizontal
, Vertical
, ScrollView
, DisabledGroup
, ChangeCheck
, Foldout
, FoldoutHeaderGroup
댓글남기기