UI 시스템
관련 소스 파일
•
Scripts/Runtime/Base/GameEntry.cs
•
Scripts/Runtime/Entity/Entity.cs
•
Scripts/Runtime/Entity/EntityComponent.cs
•
Scripts/Runtime/Entity/EntityLogic.cs
•
Scripts/Runtime/Scene/SceneComponent.cs
•
Scripts/Runtime/Sound/SoundComponent.cs
•
Scripts/Runtime/UI/UIComponent.cs
•
Scripts/Runtime/UI/UIForm.cs
•
Scripts/Runtime/UI/UIFormLogic.cs
UI 시스템은 Game Framework에서 사용자 인터페이스를 관리하는 역할을 하며, UI 폼(창, 패널 등)을 그 수명주기 전반에 걸쳐 처리하기 위한 구조화된 접근 방식을 제공합니다. 이는 UI 요소를 생성, 표시, 조직, 제거하는 데 있어 적절한 리소스 관리를 갖춘 강력한 아키텍처를 제공합니다.
엔티티 관리에 대한 내용은 Entity System, 씬 관리에 대한 내용은 Scene Management를 참고하세요.
아키텍처 개요
UI 시스템은 Game Framework의 컴포넌트 기반 아키텍처를 따르며, 프레임워크 계층과 Unity 구현 간의 명확한 분리를 가지고 있습니다. UI 폼을 그룹으로 조직하고, 표시 순서, 가시성, 그리고 수명주기를 관리합니다.
출처:
•
Scripts/Runtime/UI/UIComponent.cs 22-146
•
Scripts/Runtime/Base/GameEntry.cs 16-57
핵심 컴포넌트
UIComponent
UIComponent는 UI 관련 작업에 대한 주요 진입점입니다. GameEntry에 등록되어 있으며, 다음과 같은 메서드를 제공합니다:
•
UI 폼 열기 및 닫기
•
UI 그룹 생성 및 관리
•
UI 폼 상태 확인
•
UI 폼 속성 설정
모든 UI 상호작용은 OpenUIForm(), CloseUIForm() 같은 메서드를 사용하는 이 컴포넌트를 통해 이루어져야 합니다.
UIForm
UIForm 클래스는 IUIForm 인터페이스의 Unity 구현으로, 단일 UI 창이나 패널을 나타냅니다. 각 UIForm은:
•
고유한 시리얼 ID를 가집니다
•
특정 UI 그룹에 속합니다
•
자신의 UIFormLogic 컴포넌트 참조를 가집니다
•
그룹 내에서 깊이 값(depth)을 가집니다
이 클래스는 프레임워크의 UI 관리 시스템과 Unity의 GameObject/컴포넌트 시스템 사이의 다리 역할을 합니다.
UIFormLogic
UIFormLogic은 모든 UI 전용 로직의 기본 클래스입니다. 게임 개발자는 이 클래스를 확장하여 각 UI 폼의 동작을 구현해야 합니다. 다음과 같은 수명주기 메서드를 제공합니다:
•
OnInit() : 폼이 초기화될 때 호출됨
•
OnOpen() : 폼이 열릴 때 호출됨
•
OnClose() : 폼이 닫힐 때 호출됨
•
OnRecycle() : 폼이 객체 풀로 반환될 때 호출됨
•
추가적으로 일시 정지, 커버 등의 수명주기 메서드 제공
사용자 정의 UI 로직 클래스는 UIFormLogic을 상속받아 구체적인 기능을 구현합니다.
UI 시스템 클래스 계층 구조
출처:
•
Scripts/Runtime/UI/UIComponent.cs 22-730
•
Scripts/Runtime/UI/UIForm.cs 17-304
•
Scripts/Runtime/UI/UIFormLogic.cs 15-207
UI 폼 수명주기
프레임워크의 UI 폼은 잘 정의된 수명주기를 따르며, 이를 통해 리소스와 상태를 적절하게 관리할 수 있습니다.
출처:
•
Scripts/Runtime/UI/UIFormLogic.cs 100-177
•
Scripts/Runtime/UI/UIForm.cs 106-268
각 상태는 UIFormLogic 내의 특정 메서드를 트리거합니다:
상태 | 메서드 | 설명 |
Initialized | OnInit | 폼이 처음 생성되거나 풀에서 가져올 때 호출됨 |
Opened | OnOpen | 폼이 가시화될 때 호출됨 |
Closed | OnClose | 폼이 닫힐 때 호출됨 |
Recycled | OnRecycle | 폼이 객체 풀로 반환될 때 호출됨 |
Paused | OnPause | 폼이 다른 폼에 의해 덮여 일시 정지될 때 호출됨 |
Resumed | OnResume | 일시 정지 후 다시 표시 상태로 돌아올 때 호출됨 |
Covered | OnCover | 다른 폼이 위에 나타날 때 호출됨 |
Revealed | OnReveal | 덮고 있던 폼이 제거될 때 호출됨 |
Refocused | OnRefocus | 폼이 다시 맨 앞으로 올 때 호출됨 |
UI 그룹과 깊이 관리
UI 시스템은 폼을 그룹으로 조직하며, 각 그룹은 고유한 깊이를 가집니다. 그룹 내에서 폼은 개별 깊이 값을 가져 표시 순서를 결정합니다.
출처:
•
Scripts/Runtime/UI/UIComponent.cs 73-245
•
Scripts/Runtime/UI/UIForm.cs 67-85
이 계층 구조는 다음과 같은 이점을 제공합니다:
•
높은 깊이 그룹의 폼은 항상 낮은 깊이 그룹의 폼 위에 표시됨
•
폼을 목적에 따라 조직 가능 (예: 메뉴, 대화창, HUD 요소)
•
그룹은 다른 동작을 가질 수 있음 (예: 독점 표시, 덮인 폼 일시 정지)
UI 시스템 사용하기
UI 그룹 설정하기
UI 그룹은 Unity 에디터에서 UIComponent에 정의하거나 런타임에 생성할 수 있습니다:
// 사용자 지정 깊이를 가진 새로운 UI 그룹 생성
uiComponent.AddUIGroup("Dialog", 10);
C#
복사
UI 폼 로직 생성하기
사용자 정의 UI 폼을 만들려면 UIFormLogic을 상속받아 필요한 수명주기 메서드를 구현합니다:
public class MainMenuUIForm : UIFormLogic
{
protected internal override void OnInit(object userData)
{
base.OnInit(userData);
// UI 요소 초기화 및 이벤트 바인딩
}
protected internal override void OnOpen(object userData)
{
base.OnOpen(userData);
// UI 상태 설정
}
protected internal override void OnClose(bool isShutdown, object userData)
{
// 폼 닫힐 때 정리
base.OnClose(isShutdown, userData);
}
}
C#
복사
UI 폼 열고 닫기
UI 폼은 UIComponent를 통해 열고 닫습니다:
// UI 폼 열기
int serialId = GameEntry.GetComponent<UIComponent>()
.OpenUIForm("Assets/UI/MainMenu.prefab", "Default");
// UI 폼 닫기
GameEntry.GetComponent<UIComponent>().CloseUIForm(serialId);
C#
복사
일시 정지 및 커버된 폼 다루기
폼을 열 때, 덮이는 폼을 일시 정지할지 지정할 수 있습니다:
// 아래 폼들을 일시 정지시키는 폼 열기
GameEntry.GetComponent<UIComponent>()
.OpenUIForm("Assets/UI/PauseMenu.prefab", "Dialog", true);
C#
복사
다른 시스템과의 통합
리소스 시스템
UI 폼은 리소스 시스템을 통해 에셋으로 로드됩니다.
출처: Scripts/Runtime/UI/UIComponent.cs 200-227
객체 풀 시스템
UI 시스템은 성능 향상을 위해 UI 폼 인스턴스에 객체 풀링을 사용합니다.
출처: Scripts/Runtime/UI/UIComponent.cs 209-214
구성 옵션
UIComponent는 Unity 에디터에서 설정할 수 있는 여러 구성 옵션을 제공합니다:
옵션 | 설명 |
Instance Auto Release Interval | 풀링된 UI 폼을 해제할지 확인하는 주기 |
Instance Capacity | 객체 풀에 유지할 최대 인스턴스 수 |
Instance Expire Time | 사용되지 않는 인스턴스를 해제하기 전까지 유지할 시간 |
Instance Priority | UI 폼 객체 풀의 우선순위 |
UI Form Helper | UI 폼 인스턴스 생성 및 관리용 헬퍼 |
UI Group Helper | UI 그룹 생성 및 관리용 헬퍼 |
출처: Scripts/Runtime/UI/UIComponent.cs 46-74
이벤트 시스템
UI 시스템은 UI 폼 수명주기의 다양한 시점에서 이벤트를 발생시킵니다:
•
OpenUIFormSuccessEvent
•
OpenUIFormFailureEvent
•
OpenUIFormUpdateEvent
•
OpenUIFormDependencyAssetEvent
•
CloseUIFormCompleteEvent
이 이벤트들은 EventComponent를 통해 구독할 수 있습니다.
출처:
•
Scripts/Runtime/UI/UIComponent.cs 161-181
•
Scripts/Runtime/UI/UIComponent.cs 701-728
모범 사례
•
UI 폼을 그룹으로 조직:
◦
메뉴, 대화창, HUD 등 UI 유형별로 그룹을 나눔
◦
적절한 깊이를 할당하여 레이어링을 제어
•
객체 풀 활용:
◦
성능을 위해 적절한 풀링 설정 구성
◦
OnRecycle을 적절히 구현하여 리소스를 정리
•
적절한 수명주기 메서드 구현:
◦
OnOpen/OnClose를 사용하여 가시성 변화를 처리
◦
OnPause/OnResume으로 덮였을 때 업데이트 관리
◦
OnClose에서 이벤트 리스너를 정리
•
사용자 데이터 활용:
◦
폼을 열 때 관련 데이터를 전달
◦
사용 사례에 맞게 사용자 데이터를 구조화
•
UI 성능 모니터링:
◦
과도한 UI 폼 생성 여부 확인
◦
프레임워크의 프로파일링 도구를 사용하여 UI 관련 지표 추적