Mode - View - Controller를 분리하여 코드를 구성하는 방법입니다. 이를 통해 코드의 유지 보수성과 재사용성을 향상시킬 수 있습니다.
1. Model(모델)
- 애플리케이션의 데이터와 비즈니스 로직을 처리합니다.
- 주로 데이터의 상태를 관리하고, 데이터의 변경을 감지하고 알리는 역할을 수행합니다.
- Unity에서는 주로 C# 클래스로 표현되며, 게임의 상태나 플레이어의 정보 등을 담당합니다.
2. View(뷰)
- 사용자 인터페이스를 표시하고, 모델의 데이터를 시각적으로 나타냅니다.
- Unity에서는 주로 UI 요소, 3D 모델, 텍스처 등을 통해 구현됩니다.
- 뷰는 모델의 상태 변경을 감지하고, 변경된 데이터를 반영하여 화면에 보여줍니다.
3. Controller(컨트롤러)
- 사용자 입력을 받아 이를 모델과 뷰에 전달하며, 상호 작용을 관리합니다.
- 모델의 데이터를 업데이트하거나 뷰를 갱신하는 역할을 합니다.
- Unity에서는 주로 사용자 입력 (키보드, 마우스, 터치 등)을 처리하고, 이에 따라 모델과 뷰를 조작합니다.
EX)
Model(플레이어의 점수를 관리하는 모델)
using UnityEngine;
public class PlayerModel : MonoBehaviour
{
private int score;
public int Score
{
get { return score; }
set
{
score = value;
// 점수가 변경되었음을 알리는 이벤트 발생
OnScoreChanged?.Invoke(score);
}
}
// 점수 변경 이벤트
public event System.Action<int> OnScoreChanged;
}
View(플레이어의 점수를 화면에 표시하는 뷰)
using UnityEngine;
using UnityEngine.UI;
public class PlayerView : MonoBehaviour
{
public Text scoreText;
// 모델에 대한 참조
private PlayerModel playerModel;
private void Start()
{
// PlayerModel을 찾아서 할당
playerModel = FindObjectOfType<PlayerModel>();
// 점수 변경 이벤트에 대한 리스너 등록
playerModel.OnScoreChanged += UpdateScoreText;
// 초기화
UpdateScoreText(playerModel.Score);
}
// 점수를 화면에 업데이트
private void UpdateScoreText(int score)
{
scoreText.text = "Score: " + score;
}
}
Controller(플레이어의 입력을 받아 점수를 업데이트하는 컨트롤러)
using UnityEngine;
public class PlayerController : MonoBehaviour
{
// 모델에 대한 참조
private PlayerModel playerModel;
private void Start()
{
// PlayerModel을 찾아서 할당
playerModel = FindObjectOfType<PlayerModel>();
}
private void Update()
{
// 예시로 키보드 입력을 받아서 점수 증가
if (Input.GetKeyDown(KeyCode.Space))
{
IncreaseScore();
}
}
// 점수 증가 메서드
private void IncreaseScore()
{
playerModel.Score += 10;
}
}
평소에 많이 쓰던 Input System이 이런 MVC 패턴이라는 것을 깨달았고 앞으로도 이런 식으로 구성하면 좋을 것 같다라는 생각이 든다.
'코린이 부트캠프 일상' 카테고리의 다른 글
유니티 게임 기획 / 나만의 기획 (0) | 2024.01.11 |
---|---|
유니티 제너릭 싱글톤 패턴(Generic Singleton) 및 Scene 관리 (1) | 2024.01.11 |
유니티 Dictionary 딕셔너리 (0) | 2024.01.08 |
유니티 Coroutione (0) | 2024.01.08 |
유니티 디버깅으로 오류 해결 (0) | 2024.01.04 |