스크립트를 Model, View, Controller 로 역할을 나누는 아키텍처(구조)
Model
View
Model의 정보를 UI로 시각화Controller
Model의 데이터 변경public class PlayerModel
{
private int hp = 100;
public PlayerView view;
public int Hp
{
get => hp;
set
{
hp = Mathf.Clamp(value, 0, 100);
view?.UpdateHp(hp);
}
}
}
Model의 프로퍼티에 값을 할당하면 View 스크립트의 함수를 실행해서 UI를 변경한다.
스크립트를 Model, View, Presenter 로 역할을 나누는 아키텍처(구조)
Model
View
Model의 정보를 UI로 시각화Presenter
Model과 View를 연결해주는 중계자 역할public class PlayerModel
{
private int hp = 100;
public int Hp
{
get => hp;
set
{
hp = Mathf.Clamp(value, 0, 100);
OnHpChanged?.Invoke(hp);
}
}
public event System.Action<int> OnHpChanged;
}
public class PlayerPresenter : MonoBehaviour
{
private PlayerModel model = new PlayerModel();
[SerializeField] PlayerView view;
private void OnEnable()
{
model.OnHpChanged += view.UpdateHp;
}
private void OnDisable()
{
model.OnHpChanged -= view.UpdateHp;
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
model.Hp -= 10;
}
}
}
View의 함수를 Model의 이벤트에 추가 및 제거를
중계자인 Presenter에서 하는 것이 MVP 패턴이다.
public int MaxHp
{
set
{
maxHp = Math.Clamp(value, 0, maxHp);
OnMaxHpChanged?.Invoke(maxHp);
OnHpChanged?.Invoke(curHp, maxHp);
}
get
{
return maxHp;
}
}
프로퍼티의 값을 할당할 때 값만 바꾸는게 아니라
다른 코드를 추가할 수 있는게 뭔가 마음에 든다.