코린이 부트캠프 일상

유니티 MVC(Model - View- Controller) 패턴

게발인개발자 2024. 1. 9. 20:40

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 패턴이라는 것을 깨달았고 앞으로도 이런 식으로 구성하면 좋을 것 같다라는 생각이 든다.