Unity 사용자 매뉴얼: 사용자 인터페이스(UI) 생성
즉시 모드 GUI(IMGUI)
IMGUI로 에디터 확장
커스텀 에디터
Unity 에디터를 확장할 때 UI Toolkit을 사용하는 것이 권장됩니다. 이는 IMGUI보다 더 유연하고 확장 가능한 솔루션을 제공합니다. 자주 사용하는 컴포넌트에 대한 커스텀 에디터를 만들면 애플리케이션 개발이 더 빠르게 진행됩니다. 이 문서에서는 게임 오브젝트가 항상 특정 지점을 바라보도록 하는 간단한 스크립트를 생성하는 방법을 설명합니다.
LookAtPoint 스크립트 생성
- C# 스크립트를 만들고 이름을 “LookAtPoint”로 지정합니다.
- 스크립트를 열고 내용을 다음 코드로 교체합니다.
using UnityEngine;
public class LookAtPoint : MonoBehaviour
{
public Vector3 lookAtPoint = Vector3.zero;
void Update()
{
transform.LookAt(lookAtPoint);
}
}
- 작성한 스크립트를 씬의 게임 오브젝트에 연결합니다.
이제 Play 모드를 시작하면 스크립트를 연결한 게임 오브젝트가 “Look At Point” 프로퍼티로 설정한 좌표를 향하게 됩니다.
편집 모드에서 스크립트 실행
애플리케이션이 실행되지 않을 때 편집 모드에서도 스크립트가 실행되도록 만들고 싶다면, 클래스에 ExecuteInEditMode
속성을 추가합니다.
using UnityEngine;
[ExecuteInEditMode]
public class LookAtPoint : MonoBehaviour
{
public Vector3 lookAtPoint = Vector3.zero;
void Update()
{
transform.LookAt(lookAtPoint);
}
}
이제 에디터에서 게임 오브젝트를 이동하거나 인스펙터에서 “Look At Point” 값을 변경하면, 게임 오브젝트가 자동으로 회전을 업데이트하여 월드 공간의 타겟 지점을 바라보게 됩니다.
커스텀 에디터 생성
이전 예제에서는 편집 모드 중에 간단한 스크립트가 실행되도록 했지만, 에디터 툴을 직접 만들기 위해서는 커스텀 에디터를 만들어야 합니다. Unity에서 스크립트를 작성할 때 기본적으로 MonoBehaviour
에서 상속되며, 이 컴포넌트를 게임 오브젝트에 연결할 수 있습니다.
LookAtPointEditor 스크립트 생성
- 새로운 C# 스크립트를 만들고 이름을 “LookAtPointEditor”로 지정합니다.
- 스크립트를 열고 내용을 다음 코드로 교체합니다.
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(LookAtPoint))]
[CanEditMultipleObjects]
public class LookAtPointEditor : Editor
{
SerializedProperty lookAtPoint;
void OnEnable()
{
lookAtPoint = serializedObject.FindProperty("lookAtPoint");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(lookAtPoint);
serializedObject.ApplyModifiedProperties();
}
}
커스텀 에디터의 구조
CustomEditor
속성은 어떤 컴포넌트를 위한 에디터로 동작하는지를 Unity에 알립니다.CanEditMultipleObjects
속성은 여러 오브젝트를 선택하고 동시에 변경할 수 있음을 알립니다.
인스펙터에 에디터를 표시할 때마다 OnInspectorGUI
의 코드를 실행합니다. 기본적으로는 LookAtPoint 컴포넌트의 인스펙터는 다음과 같은 모습입니다.
구분 | 내용 |
---|---|
인스펙터 구조 | 기본 인스펙터가 제공하는 UI |
커스텀 에디터 | 기본 레이아웃을 대체하는 사용자 정의 UI |
에디터 스크립트 확장
간단한 메시지를 추가하여 타겟 포인트가 게임 오브젝트 위 또는 아래에 있는지를 표시하는 방법을 보여줍니다.
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(LookAtPoint))]
[CanEditMultipleObjects]
public class LookAtPointEditor : Editor
{
SerializedProperty lookAtPoint;
void OnEnable()
{
lookAtPoint = serializedObject.FindProperty("lookAtPoint");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(lookAtPoint);
serializedObject.ApplyModifiedProperties();
if (lookAtPoint.vector3Value.y > (target as LookAtPoint).transform.position.y)
{
EditorGUILayout.LabelField("(Above this object)");
}
if (lookAtPoint.vector3Value.y < (target as LookAtPoint).transform.position.y)
{
EditorGUILayout.LabelField("(Below this object)");
}
}
}
이제 LookAtPoint 컴포넌트의 인스펙터에는 메시지가 추가되어, 타겟 지점이 게임 오브젝트의 위 또는 아래에 있다는 정보를 표시합니다.
씬 뷰 추가
씬 뷰에서 사용자 정의 수정 기능을 추가하기 위해 OnSceneGUI
메서드를 사용합니다. 이 메서드는 씬 뷰에서 실행됩니다.
public void OnSceneGUI()
{
var t = (target as LookAtPoint);
EditorGUI.BeginChangeCheck();
Vector3 pos = Handles.PositionHandle(t.lookAtPoint, Quaternion.identity);
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObject(target, "Move point");
t.lookAtPoint = pos;
t.Update();
}
}
이 구조를 통해 사용자는 게임 오브젝트 주변에서 타겟 포인트를 자유롭게 이동할 수 있습니다. 2D GUI 오브젝트를 추가하려면, Handles.BeginGUI()
및 Handles.EndGUI()
를 사용하여 원하는 GUI를 추가할 수 있습니다.
결론
이 문서에서는 Unity의 IMGUI를 사용하여 간단한 커스텀 에디터를 만드는 방법과 편집 모드에서 스크립트를 실행하는 방법을 배웠습니다. 이러한 기법을 통해 개인화된 사용자 인터페이스를 구축하여 에디터 사용 경험을 더욱 풍부하게 할 수 있습니다.