현재 UI 구조에 문제가 있었다.
MVC 구조를 이용하는 UI 객체들이 [UI + 이름]클래스 에서 MVC구조에 맞게 초기화를 하여 작업을 하고있다.
하지만 이 초기화 할때 각 클래스별로 "하드코딩"으로 작업이 진행되고 있었다.
이렇게 되면 문제가 발생하게되는데: 해당 구조를 모르는 작업자가 해당 작업 진행시 구조를 모르기에 작업 효율이 떨어지고 가독성이 떨어지는 문제가 발생하였다.
그래서 두가지 방법이 있다.
Controller 부분에서 초기화 작업을 진행 ( Controller 파트는 이미 UIController 라는 상위 클래스로 상속받고 있는상태)
하지만 Controller에는 Monobehaviour가 상속 되어있지 않고 이미 작업을 해온게 있어 다 갈아 엎기는 문제가 있는 상태였다.
두번쨰 방법으로 현재 초기화 하는 클래스의 상위 클래스를 만들어 상속을 시켜주는 방식을 사용하는것이다.
using UnityEngine;
//Model : 해당 UI에 관련된 데이터(모델)
//View : 데이터를 유저의 눈에 보여주는 출력물(View)
//Controller : Model과 View를 중재하는 관리자
[System.Serializable]
public abstract class UIBase<M,V,C> : MonoBehaviour
where M : UIModel, new()
where V : IUIBase
where C : UIController, new()
{
protected M model;
[SerializeField] protected V[] views;
protected C controller;
public virtual void Start()
{
//Model(Data) 초기화
//model = new M();
//컨트롤러 초기화 및 View 등록
controller = new C();
for (int i = 0; i < views.Length; i++)
{
controller.Initialize(views[i], model);
}
//UI매니저에 UI 등록
UIManager.Instance.RegisterController(typeof(C).ToString(), controller);
}
}
해당 코드가 UI MVC구조를 초기화 해주는 코드이고 ,Modeldms 각각 필요한 데이터가 다르기도 하고 호출 시점도 조금씩 다르기 Model 영역은 자식클래스에서 초기화를 담당하고 있다.
public class PlayerInfo : UIBase<PlayerInfoModel,PlayerInfoView, PlayerInfoController>
{
public override void Start()
{
model = new PlayerInfoModel();
base.Start();
gameObject.SetActive(false);
}
}
사용 예시로 , 플레이어 정보창 UI 초기화를 담당하는 클래스이다.