HOW TO UNITY | ui 용 MVC, MVP, MVVM 패턴
unity 유니티 공부 2025. 11. 26. 11:41 |https://www.youtube.com/watch?v=fxlYxhhf83s
UI에 걸맞는 기법
디자인 패턴들은
잠재적 스파게티 패턴을 방지하기 위한 것임
HOW TO UNITY | ui 용 MVC, MVP, MVVM 패턴
mvc
잘 안 씀
그냥 있다는 거만 알아두기
model
데이터 (캐릭터 체력) 담는 박스
view
화면에 표시되는 ui
controller
계산 함
+
mvp
model
데이터
presenter
중간 중재자
model 과 view 를 업데이트 함
view
ui
세 개 를 분리하여 이점이 있음
확장 가능
모듈 조립 가능
재사용 가능
+

mvvm
mvp 에서 더 발전된 거
model
데이터
viewmodel
중재자
view
ui
user
사용자
view 와 viewmodel 사이 데이터 바인딩 을 씀
자동 반영 이라는 것임
동기화 라는 거임
mvvm 기법은 유니티 6.0 부터 가능하다
+
UI와 게임 로직
(전투 규칙, 유닛 상태, 턴 시스템)을 명확히 분리하고 싶을 때
유닛 정보판, 스킬창, 턴오더, 인벤토리, 대화창 구현할 때
단, 주의점!
수백개 유닛 나오는 대규모 구현엔 부적합
실 예시로 본 각 속성들
Model : hp mp 스탯, skill, ScriptableObject
ViewModel : 커맨드 명령, INotifyPropertyChanged,
View : 유닛 표시, HUD
+
유니티에서의 바인딩 방식
수동 바인딩 — View에서 ViewModel 이벤트/델리게이트를 직접 구독
Reactive(예: UniRx) — 옵저버블로 바인딩. 상태 변화가 복잡하면 추천.
+
추가 설명
게임에서 일어나는 일
ㅁ 턴이 바뀜
ㅁ 이동 가능 칸이 바뀜
ㅁ 스킬 버튼이 켜짐/꺼짐
이런 게임 로직이 있고,
그걸 화면에 보여주는 UI가 있음
이 두 개를 섞어 쓰면 코드가 난장판이 됨
이 걸 방지 하기 위해서 mvvm 을 씀
+
SRPG는 UI가 많음
ㅁ 유닛 정보창
ㅁ 턴 순서 UI
ㅁ 이동/공격 버튼
ㅁ 스킬 목록
ㅁ 범위 표시
하나의 유닛 데이터가 바뀌면
이 여러 UI가 동시에 반응해야 함
MVVM은 이걸 자동으로 연결해줌
+
추가 실 예시
플레이어가 적에게 맞아서 HP가 100 → 60 이 됨
1) Model: HP = 60 변경
2) ViewModel: "HP 변함!" 이벤트 전송
3) View(UI): 그 이벤트 듣고 체력바 업데이트
+
다른 예시
public int MP;
1) Model: 마나 데이터만 저장
public class UnitViewModel
{
public UnitModel model;
// 이 ViewModel이 사용할 데이터 저장 변수
// 실제 캐릭터 정보(HP 등)를 들고 있는 상자라고 보면 됨
public event Action OnHpChanged;
// HP가 바뀌었을 때 UI에게 알려주는 알림 이벤트
// “HP 변함! UI 업데이트 해!” 라고 호출
public UnitViewModel(UnitModel m)
// 생성자: 이 ViewModel이 어떤 Model을 쓸지 설정하는 함수
{
model = m;
// 전달받은 m(Model)을 이 ViewModel의 model 변수에 저장
// "이 ViewModel은 이제 이 모델을 다룬다"라고 연결하는 작업
}
public void SetHP(int value)
// HP 값을 바꾸는 함수 (입력으로 받은 value를 사용)
// 외부에서 "이 HP로 바꿔!"라고 숫자 전달할 때 쓰는 수정 함수
{
model.HP = value;
// 모델의 HP를 입력받은 값(value)으로 실제 변경
// 캐릭터의 실제 체력 수치를 여기서 업데이트함
OnHpChanged?.Invoke();
// 만약 누군가 이벤트를 듣고 있으면 실행 → UI 갱신
// “HP 바뀜! UI야 반응해!”라고 신호를 보내는 부분
}
public int GetHP()
// 현재 HP 값을 가져오는 함수
// 외부(UI 등)가 "지금 HP 몇이야?"라고 물을 때 쓰는 조회 함수
{
return model.HP;
// 모델에 저장된 실제 HP 숫자를 반환
// 캐릭터가 가진 HP를 그대로 돌려준다
}
}
2) ViewModel: 변화를 ui 에게 알림
hpText.text = "MP : " + vm.GetMP();
3) View(UI): ui 표시만 함
+

mvvm
유니티 에선 ui toolkit , ui builder
(기본 패키지 매니저에 있음)
을 써야 한다더라
ui builder 는
ui 위주로 작업할 수 있는 환경이 마련됨

ui toolkit 의 구성은 3개로 나뉨
Layout 위치
Styling 글꼴
Functionality 버튼기능
.uxml 은 칸 크기 조절이다
.uss 는 글자 조정이다
.cs 는 기능 연결이다
이렇게 외워두면 됨
+

ui builder 에서
우측
ㅣㅇ
이런 모양 누르면
데이터 바인딩 가능
체력이나 초상화 이런거 연결하는 거임
Update ( ) 생명 주기를 쓰지 않음
서로 연결 만 해줘서
실시간 반영으로 보이는 거임
