현재 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 초기화를 담당하는 클래스이다. 

+ Recent posts