Unity5의 GUI 클래스에 추가된 Scope에 대해서
Scope?
Unity에 내장된 GUI를 이용하는 코드(주로 에디터 관련)를 작성한 적 있다면 GUILayout 클래스의 BeginHorizontal(), EndHorizontal()의 늪을 꼭 한 번쯤 경험했을 것이라 생각한다. Horizontal을 시작하고 끝내는 것, 그래 좋다. 엔진에선 Horizontal이나 Vertical 같은 것이 언제 시작하고 언제 끝나는지 알아야 할 필요가 있다고 생각한다.
그런데 왜 Begin을 하고 End로 꼭 끝을 내줘야 할까? 가끔 Begin을 하고 End를 하지 않아서 콘솔창에 경고가 가득 뜨는 경험을 한 번 해봤다면, 정말 불편하기 짝이 없는 구조라 느낄 것이다.
그 때문인지, 놀랍게도 (유니티에서 홍보를 안했기 때문에 거의 대부분은 모르지만) Unity5에는 GUI 클래스에 Scope라는 기능이 추가되었다.
사용법
지금까지는 위와 같은 GUI를 표시하기 위해선 아래와 같은 코드를 작성해야 했다.
void OnGUI()
{
EditorGUILayout.BeginHorizontal("Button"))
if (GUI.Button (h.rect, GUIContent.none))
Debug.Log ("Go here");
GUILayout.Label ("I'm inside the button");
GUILayout.Label ("So am I");
EditorGUILayout.EndHorizontal();
}
정말 불편한 사용법이다. 복잡한 GUI 구조라면 언제 Begin되고 언제 End가 되는지 알기 위해선 코드를 한참 들여다 보아야 하며, Begin을 해놓고 End를 하지 않게 되는 실수도 발생할 수 있다.
그러나 Unity5부터 아래와 같이 사용할 수 있게 됐다.
void OnGUI()
{
using (var h = new EditorGUILayout.HorizontalScope("Button"))
{
if (GUI.Button (h.rect, GUIContent.none))
Debug.Log ("Go here");
GUILayout.Label ("I'm inside the button");
GUILayout.Label ("So am I");
}
}
아주 심플하다!
using 구문 안에서 자동으로 Begin Horizontal이 시작되며, 구문이 끝나면 자동으로 End Horizontal으로 끝나게 된다. 가독성도 상승할 뿐더러, EndHorizontal()을 까먹고 호출하지 않게 되는 실수도 줄일 수 있다.
좀 더 자세히 알아보기
작성중…