본문 바로가기

유니티 스파르타 캠프 8주차

250526 유니티 스크립트패턴 MVC, MVVP 어떤 걸 써야할까?

발단

유니티에서 Text, Button 등을 스크립트로 제작할 때, Data를 텍스트 쪽에서 가지고 있는 것이 불편했습니다. 그래서 2개로 나누자니 Data에서 값이 바뀔 때 UI 쪽 값을 가져와야하니, Data 쪽 스크립트가 더러워지는 거 같았습니다. 그래서 찾은게 MVC 패턴, Model(Data), View(UI), Controller(중간 관리자) 역할로 데이터는 오직 데이터, 각종 메서드와 정보 등은 Controller에서 값을 바꿔주며 그 값을 View에 옮겨주면 좋겠다는 생각이 들었습니다.

전개

그리고 MVC, MVVM 그리고 매니저 구조를 추천해줬습니다.

1. MVC (Model-View-Controller)

Unity에서 순수하게 쓰이진 않지만, 개념은 자주 활용됨

  • Model: 순수 데이터 (예: PlayerData, InventoryData)
  • View: UI (Text, Image, Button 등 UnityEngine.UI 기반)
  • Controller: 유저 입력 받고, Model 바꾸고, View 갱신

2. MVVM (Model-View-ViewModel)

UniRx, BindableProperty 등을 쓰면 활용 가능
복잡한 UI에 적합, 코드량은 많아짐

  • ViewModel이 데이터 상태를 감지하고 View에 반영함

3. Manager 또는 Mediator 클래스 구조

게임 전역 또는 Scene 단위로 중재하는 방식
실무에서 UIManager, GameManager, BattleController 등이 자주 등장

내용을 보면 ViewModel이 되게 애매하다고 느껴졌습니다.

public class PlayerViewModel {
    public ReactiveProperty<int> Health = new ReactiveProperty<int>(100);
}

public class PlayerUI : MonoBehaviour {
    public Text healthText;
    public PlayerViewModel viewModel;

    void Start() {
        viewModel.Health.Subscribe(value => {
            healthText.text = $"HP: {value}";
        });
    }
}

 이런 구조를 쓰는거면 그냥 Data를 쓰는 거랑 다를 게 없다는 생각도 들었습니다.

그에 반면 MVC 패턴은 한눈에 이해하기 쉽고 Controller의 역할도 제대로 들어났습니다.

public class PlayerData {
    public int Health;
}

public class PlayerUI : MonoBehaviour {
    public Text healthText;
    
    public void UpdateHealth(int value) {
        healthText.text = $"HP: {value}";
    }
}

public class PlayerController : MonoBehaviour {
    public PlayerData data;
    public PlayerUI ui;

    void TakeDamage(int damage) {
        data.Health -= damage;
        ui.UpdateHealth(data.Health);
    }
}

결론

이외에도 많은 질문을 ChatGPT한테 던져봤으나, MVVM은 위 내용과 같이 RX가 없으면 많이 불편하다 였습니다.

다들 UI랑 DATA 혼합하면 내용이 너무 많아지는데 MVC 패턴 써보는거 어떤가요!