UI 개발의 복잡성 증가: 과거 단순했던 UI는 이제 인게임 스토어, 런처, 친구/인벤토리 관리 등 훨씬 더 많은 기능을 담당하며 복잡성이 기하급수적으로 증가했습니다. 📈
UI 스케일 문제: 깊이 vs. 너비: UI 스케일 문제는 개별 요소의 복잡성(깊이)과 생성해야 할 화면의 수(너비)로 나뉘는데, 'Midnight Suns' 사례에서는 너비(약 150개 화면)가 깊이보다 훨씬 더 큰 문제였습니다. ↔️
개발 목표: 개발자 시간 최적화 및 상용구 코드 감소: UI 개발 간소화, 효율적인 워크플로우 제공, 반복적인 상용구 코드(boilerplate)를 줄여 유지보수 비용을 절감하고 개발자 시간을 최적화하는 것이 핵심 목표였습니다. ⏱️
협업 증진: 게임플레이 및 디자인 팀의 기여: 초기 UI 엔지니어 부족 문제를 해결하기 위해 게임플레이 및 디자인 팀이 화면을 빠르게 구성하여 기능 테스트를 돕도록 지원하는 것이 중요했습니다. 🤝
핵심 아키텍처 결정: 컴포지션 방식 채택: 전통적인 상속(inheritance) 대신 레고 블록처럼 기능을 분리하여 조합하는 컴포지션(compositional) 접근 방식을 채택하여 유연성과 확장성을 확보했습니다. 🧱
UICS (User Interface Component System) 도입: 화면(Screen), 위젯(Widget), 컨트롤(Control), 화면 컴포넌트(Screen Component)를 정의하고, 에디터에서 컴포넌트를 추가하여 화면 기능을 구성하는 시스템을 구축했습니다. 🛠️
데이터 처리 컴포넌트: Data Screen Component: 데이터 검색(DataProvider), 필터링, 변환(Transforms) 기능을 담당하며, 다양한 데이터 요구사항에 유연하게 대응할 수 있도록 설계되었습니다. 📊
시각화 및 이벤트 처리 컴포넌트: View Screen Component: 위젯 생성/캐싱, 컨테이너에 추가, 데이터 전달, 위젯 이벤트(클릭/호버)에 대한 델리게이트 제공을 통해 시각적 요소와 사용자 상호작용을 관리합니다. 🖼️
액션 처리 컴포넌트: Action Screen Component: 특정 액션(예: 화면 열기, 아이템 드롭)에 필요한 데이터를 수집하고, 액션 실행 가능 여부를 쿼리하며, 최종적으로 액션을 실행하는 역할을 수행합니다. ▶️
컴포넌트 간 통신 방식: GetScreenComponent 함수, 델리게이트(이벤트 발생 시 알림), 에디터에서 특정 컴포넌트를 선택할 수 있는 Component Selectors를 통해 컴포넌트 간 효율적인 통신을 구현했습니다. 📡