Dev Weeks: 작업 효율을 높이기 위한 유니티 UI 제작 프로그래밍 패턴들
https://www.youtube.com/watch?v=_jW_D2vF9J8
UINavigation을 통해 레퍼런스를 받고,
var newPage = UINavigation.Push("PageName"); // 특정 UI를 엶
var previoursPage = UINavigation.Pop(); // 현재 UI를 끄고, 직전 UI를 엶
각각의 UIView는 하나의 페이지를 뜻함.
UINavigation에는 UIView의 스택이 존재
프리팹에서 인스턴스화 vs 씬에 UIView 미리배치
프리팹에서 인스턴스화
Push할 경우 UIView는 이름만으로 어드레서블에서 프리팹을 찾아서 스폰함.
UIView somePage = UIView.Get("pageName");
somePage.Show();
- Push 할 경우 마지막 UIView의 Hide 실행
- Push한 UIView의 인스턴스화 + Show 실행
- 생성한 UIView를 히스토리 스택에 Push
열었던 페이지의 중복이 발생한 경우 프리팹이 두개가 됨.
장점 : 컨텍스트 복구가 쉽다.
단점 : 플레이 버튼을 누르기 전까지는 전체 페이지를 확인 불가능하다.
페이지가 여러개 생성된다.
씬에 UIView가 미리 존재
Push할 경우 해당 타입의 UIView를 찾음.
- 해당 타입의 UIView를 찾음
- 해당 View를 스택에 추가
- 해당 View의 Show()를 실행
UIView
public VisibleState visibleStage;
public Show();
public Hide();
public ShowImmediate();
public HideImmediate();
public enum VisibleState
{
Appearing,
Appeared,
Disappearing,
Disappeared,
}
- VisibleState를 만든이유
- 트랜지션 중에는 유아이 인풋을 블로킹하기 위해
- 다른 UI가 Appearing일 때, 다른 UI가 동시에 Appear 요청이 들어온경우의 처리 등
- 팝업의 경우 Queue에 넣는 등의 처리가 필요함
UINavigation
public UIView Current;
public UIView Push(string viewName);
public UIView Pop();
public UIView PopTo(string viewName);
public UIView PopToRoot(); 첫번째 UIView까지. (한개 남을 때까지?)
사용 예시
var characterInfoPage = UINavigation.Push("Characterpage") as UICharacterInfoPage;
characterInfoPage.Setup(_characterData);
문제점
스택이 하나밖에없어서 플랫 내비게이션이 힘들다.
플랫 내비게이션의 경우에는 뷰 마다 별도로 스택을 만들어서 상태를 유지한다.
해결 방법
UINavigationController을 도입하자!
한 번에 하나의 내비게이션만 활성화한다.
스위칭 할 경우 모든 뷰 들이 Hide()가 호출됨.
팝업의 경우
- 팝업은 페이지와 달리 오버레이로 뜰 수 있음.
- 프리팹에서 인스턴스화.
Popup.GetPrefab("Default");
- 큐를 사용.
var popup = PopupManager.Enqueue(Popup.GetPrefab("Default"));
popup.SetText("messageField", message);
popup.SetButtonData(
new ButtonData{
text="No",
(button) => Debug.Log("No Button Clicked");,
new ButtonData{
text="Yes",
(button) => Debug.Log("Yes Button Clicked")
});
UIView 작업 플로우
- 마스터 캔버스 자식으로 UIView 프리팹들을 붙임
(네이밍 View - HOME, View - ALBUM 등으로 통일하면 좋다.)
- 버전 관리를 위해 씬이 아닌 프리팹 단위로 작업
'🌍 Unity 연구 > 아키텍처' 카테고리의 다른 글
Web 출신의 Unity 엔지니어의 대규모 게임의 기초 설계 (0) | 2021.09.21 |
---|---|
MVP 정리 (0) | 2021.09.20 |
MVC / MVP / MVVM 패턴 자료수집 (0) | 2021.09.17 |