반응형
MVVM이란?
MVVM (Model-View-ViewModel) 디자인 패턴은 Unity와 같은 게임 엔진에서도 활용할 수 있는 구조적 패턴입니다.
이 패턴은 UI 코드와 비즈니스 로직을 분리하여 코드의 유지보수성과 확장성을 높이는 데 유용합니다.
각 구성 요소는 다음과 같은 역할을 합니다.
MVVM 구성 요소
- Model: 데이터와 비즈니스 로직을 포함하는 계층입니다. 게임의 상태, 데이터 구조, 데이터베이스와의 상호 작용 등을 담당합니다.
- View: 사용자 인터페이스(UI)를 나타냅니다. 유니티의 경우, Canvas, Button, Text와 같은 UI 요소들이 여기에 해당합니다.
- ViewModel: Model과 View 사이의 인터페이스 역할을 합니다. View와 Model 간의 데이터 바인딩, 이벤트 핸들링 등을 담당합니다. ViewModel은 View에 대한 참조를 가지지 않고, 주로 프로퍼티와 커맨드를 통해 상호 작용합니다.
MVVM의 주요 개념
- 데이터 바인딩: ViewModel의 데이터를 View에 자동으로 반영하는 기법입니다. Unity에서는 INotifyPropertyChanged 인터페이스를 사용하여 이 기능을 구현할 수 있습니다.
- 커맨드: View의 이벤트를 ViewModel에 전달하는 방식입니다. Unity에서는 버튼 클릭 이벤트 등을 커맨드로 처리할 수 있습니다.
모델
// 모델 클래스 - 게임 내 데이터를 나타냅니다.
public class PlayerModel
{
public string Name { get; set; }
public int Health { get; set; }
}
뷰 모델
using System.ComponentModel;
using UnityEngine;
public class PlayerViewModel : INotifyPropertyChanged
{
private PlayerModel playerModel;
public PlayerViewModel(PlayerModel model)
{
playerModel = model;
}
public string Name
{
get { return playerModel.Name; }
set
{
if (playerModel.Name != value)
{
playerModel.Name = value;
OnPropertyChanged("Name");
}
}
}
public int Health
{
get { return playerModel.Health; }
set
{
if (playerModel.Health != value)
{
playerModel.Health = value;
OnPropertyChanged("Health");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
뷰
using UnityEngine;
using UnityEngine.UI;
public class PlayerView : MonoBehaviour
{
public Text playerNameText;
public Text playerHealthText;
private PlayerViewModel playerViewModel;
void Start()
{
PlayerModel playerModel = new PlayerModel { Name = "Player1", Health = 100 };
playerViewModel = new PlayerViewModel(playerModel);
// 초기 UI 설정
UpdateUI();
// ViewModel의 PropertyChanged 이벤트에 대한 핸들러 설정
playerViewModel.PropertyChanged += OnPlayerViewModelPropertyChanged;
}
private void OnPlayerViewModelPropertyChanged(object sender, PropertyChangedEventArgs e)
{
// 변경된 속성에 따라 UI 업데이트
if (e.PropertyName == "Name")
{
playerNameText.text = playerViewModel.Name;
}
else if (e.PropertyName == "Health")
{
playerHealthText.text = playerViewModel.Health.ToString();
}
}
private void UpdateUI()
{
playerNameText.text = playerViewModel.Name;
playerHealthText.text = playerViewModel.Health.ToString();
}
}
반응형