유니티 디자인 패턴 MVVM 간단 설명 및 간단 구현 Unity Design Pattern

반응형

MVVM이란?


MVVM (Model-View-ViewModel) 디자인 패턴은 Unity와 같은 게임 엔진에서도 활용할 수 있는 구조적 패턴입니다.

이 패턴은 UI 코드와 비즈니스 로직을 분리하여 코드의 유지보수성과 확장성을 높이는 데 유용합니다.

각 구성 요소는 다음과 같은 역할을 합니다.

MVVM 구성 요소

  1. Model: 데이터와 비즈니스 로직을 포함하는 계층입니다. 게임의 상태, 데이터 구조, 데이터베이스와의 상호 작용 등을 담당합니다.
  2. View: 사용자 인터페이스(UI)를 나타냅니다. 유니티의 경우, Canvas, Button, Text와 같은 UI 요소들이 여기에 해당합니다.
  3. 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();
    }
}
반응형