View
개념
MVP 의 V에 해당하는 View.
한 화면에 하나만 작성합니다. (예외 있음)
구현 정책
ScreenSystem의 PageViewBase, ModalViewBase 를 상속받아 구현.
Lifecycle에서 Model을 받아 화면을 구축한다.
각 버튼 등의 UI 요소는 SerializeField로 참조를 가져온다.
각 버튼의 이벤트는 IObservable로 공개한다.
목록 등 동적으로 늘어나는 View의 부분은 이 View 내에서 생성한다.
즉, View가 View를 가지는 구조
이벤트도 브릿지처럼 되어버리지만, 이벤트 관리가 용이하기 때문에 허용.
다만, View의 역할을 다음 두 가지 역할로 한정함으로서 각 처리 간의 복잡성을 피할 수 있다.
Model을 받아서 화면 UI를 구축하는 것
이벤트를 발동시키는 것
UI애니메이션은 Animator나 Timeline 등의 비스크립트 데이터에 의지함으로서 스크립트 작성량을 줄인다.
애니메이션이 끝날 때까지 UniTask를 사용하여 기다린다.
1화면 1View가 원칙
위의 이유들로 View는 비대해져도 큰 문제가 되지 않기 때문.
프로젝트에 따라서는 Model을 직접 View에 전달하지 않고 인터페이스를 통해 전달할 수도 있다. (아래의 경우에 인터페이스화 함을 추천)
View나 Model이 여러 화면에서 재사용되는 경우
예시 코드
public class TestPageView : PageViewBase
{
[SerializeField] private TextMeshProUGUI _messageText;
[SerializeField] private Button _nextPageButton;
[SerializeField] private Button _nextModalButton;
// 버튼은 클릭 이벤트만 공개한다
public IObservable<Unit> OnClickPage => _nextPageButton.OnClickAsObservable();
public IObservable<Unit> OnClickModal => _nextModalButton.OnClickAsObservable();
// Model을 받아 화면 구성하기
public void SetView(TestPageModel model)
{
_messageText.SetText(model.TestMessage);
}
}
버튼의 이벤트 처리는 UniRx가 아닌 UniTask의 IUniTaskAyncEnumerable과 ForEachAwaitAsync를 사용하여 구현할 수도 있음.
UniTask로 구현할 경우 버튼이 눌렸을 때 통신 처리 등의 비동기 처리가 완료될 때 까지 다음 처리를 하지 않는 등 블로킹에 준하는 처리를 쉽게 구현 가능.
UniTask를 사용할 경우 UniTask Tracker로 디버깅이 더 쉬워지기도 함.
UniRx/UniTask 중 어느 것을 사용할 것인가는 개발자의 기술이나 지식에 따라 크게 달라짐. (편한 쪽을 선택하면 된다.)
참고: UniTask를 이용한 버튼 처리 샘플
// View
public IUniTaskAsyncEnumerable<AsyncUnit> OnClickAsync => _button.OnClickAsAsyncEnumerable();
// Presenter
_view.OnClickAsync.ForEachAwaitAsync(async _ =>
{
// 비동기 처리, 특히 통신 처리 및 화면 전환 처리
// await ~~
// 함수 내 처리가 완료될 때까지 다음 처리가 실행되지 않는다.
});
Last updated