클래스 이름 짓기 [ 2편 ] + MVC 패턴

2024. 11. 11. 15:45·유니티(Unity)/이론 정리

 

게임 개발을 하다 보면 클래스 명명을 어떻게 해야할 지 모를 때가 많습니다. 이번 2편에서는 다소 친숙한 클래스 이름들을 살펴보고, 각 이름들이 어떤 역할을 수행하는 지 알아보도록 하겠습니다.

 


Manager

 

Manager: 특정 시스템이나 여러 관련 기능을 책임지는 관리자 클래스

 

Manager는 특정 시스템이나 기능을 총괄하기 역할을 수행합니다. 보통 전역에서 접근 가능하게 설계되어(Singleton) 다양한 클래스나 시스템 간의 중재자 역할을 수행합니다. 예를 들어, Monster 클래스 내 Dead 함수에서 죽는 소리를 출력해야할 때, Monster는 SoundManager에게 죽는 소리를 요청하는 형태가 될 수 있습니다.

 


사용 예시

  • GameManager: 게임의 주요 흐름을 관리하는 매니저입니다. 주로 게임의 시작과 종료, 씬 전환 초기화 등 게임 전체의 상태(State)를 총괄합니다.
  • UIManager: UI 요소들을 관리하며 조작합니다. 새로운 팝업을 띄우거나, 혹은 종료하여 UI를 관리합니다.
  • AudioManager: 게임의 모든 소리를 관리합니다. 주로 음악이나 효과음을 출력하거나 볼륨을 조절하는 기능을 합니다.
  • AtlasManager: 아틀라스를 관리합니다. 주로 Sprite 혹은 Texture를 저장하고 반환하여 콘텐츠를 쉽게 구현할 수 있도록 도와줍니다.
  • GameTimeManager: 시간적 흐름에 대해 이벤트를 처리합니다. 주로 1초가 지날 때마다 UI가 변경되거나, 백그라운드 전환 등이 일어났을 때 필요한 로직을 처리합니다.

 

 

GameTimeManager 예시 코드

더보기
using System;
using System.Threading;
using BackEnd;
using Cysharp.Threading.Tasks;
using UnityEngine;

namespace DevelopKit.GameManager
{
    public class GameTimeManager : SingletonMonoBehaviour<GameTimeManager>
    {
        public DateTime CurrentTime { get; private set; }

        private string _pauseTime;

        private event Action<DateTime> OnChangedSecondCallback;
        private event Action<DateTime> OnChangedDayCallback;
        private event Action<int> OnSpendSecondCallback;

        public void Initialize()
        {
            CurrentTime = DateTime.Parse(Backend.Utils.GetServerTime().GetReturnValuetoJSON()["utcTime"].ToString());

            UpdateOneSecond();
        }

        private async UniTask UpdateOneSecond()
        {
            await UniTask.Delay(1000);

            var newTime = CurrentTime.AddSeconds(1);

            // 시간에 따른 Action 처리
            if (CurrentTime.Day != newTime.Day)
                OnChangedDayCallback?.Invoke(newTime);
            OnChangedSecondCallback?.Invoke(newTime);

            // 최근 시간 데이터 저장
            CurrentTime = newTime;

            // 다음 1초 후 실행
            UpdateOneSecond().Forget();
        }

        private void OnApplicationPause(bool pause)
        {
            CurrentTime = DateTime.Parse(Backend.Utils.GetServerTime().GetReturnValuetoJSON()["utcTime"].ToString());

            if (pause)
            {
                // 게임 멈춤
                _pauseTime = Backend.Utils.GetServerTime().GetReturnValuetoJSON()["utcTime"].ToString();
                GameBackendManager.Instance.SaveUserData();
            }
            else
            {
                // 게임 재개
                if (string.IsNullOrEmpty(_pauseTime) == false)
                {
                    DateTime lastTime = DateTime.Parse(_pauseTime);
                    DateTime currentTime = CurrentTime;
                    TimeSpan timeSpan = currentTime - lastTime;
                    int spendTotalSeconds = (int)timeSpan.TotalSeconds;
                    Debug.Log("지나간 초 : " + spendTotalSeconds + " 초");

                    OnSpendSecondCallback?.Invoke(spendTotalSeconds);
                    if (currentTime.Day != lastTime.Day)
                        OnChangedDayCallback?.Invoke(currentTime);
                }
            }
        }
    }
}

 

 

 


Controller

 

Controller: 특정 요소의 행동이나 상태를 제어하고 관리하는 클래스

 

Controller는 MVC (Model-View-Controller) 패턴에서 유래된 개념으로, 게임 내에서 다양한 방식으로 활용됩니다. 특히 캐릭터, 적, 카메라 등 객체의 동작을 처리합니다. Controller는 주로 사용자의 입력을 받아 Model을 조작하고, View를 업데이트하는 역할을 합니다.

Model: 데이터와 테이터 처리 로직을 담고 있는 클래스

 


사용 예시

  • PlayerController: 플레이어 캐릭터를 제어합니다. 주로 이동 및 점프, 공격을 수행합니다.
  • CameraController: 카메라를 제어하는 역할을 합니다. 주로 플레이어를 따라다니거나, 특정 위치를 보여주는 기능을 담당합니다.

 


💡 
Manager와 Controller의 차이점

더보기

① 역할의 범위: Manager는 게임 내 전체 시스템을 관리하는 반면, Controller는 특정 오브젝트나 객체의 동작을 제어하는데 중점을 둡니다.

② 의존성: Manager는 주로 Singleton으로 존재하며 다른 클래스나 시스템의 의존성을 가지지만, Controller는 주로 특정 객체에 대한 의존성을 가지고 동작을 제어합니다.

 

 

 


Model

 

Model: 데이터와 데이터 처리 로직을 담고 있는 클래스

 

Model은 데이터를 저장하고 데이터 관련 로직을 처리할 수 있습니다. 데이터의 상태를 저장하고, 외부에서 데이터를 읽고 쓸 수 있는 로직을 제공합니다. 이때, View에서 Model 데이터 변경에 대한 이벤트를 구독한다면 유지 보수에 용이합니다. (Observer 패턴)

 


사용 예시

  • PlayerModel: 플레이어 상태를 저장합니다. 예를 들어, 체력이나 레벨, 경험치 데이터를 저장하며, 체력 감소 및 회복 등의 로직을 포함합니다.
  • InventoryModel: 플레이어의 인벤토리를 저장합니다. 현재 보유한 아이템이나 장비 데이터를 저장하며, 아이템 획득 및 삭제 등의 로직을 포함합니다.

 

 

PlayerModel 예시 코드

더보기
public class PlayerModel
{
    public int Health { get; private set; }
    public int Level { get; private set; }
    public int Experience { get; private set; }

    public PlayerModel(int initialHealth, int initialLevel)
    {
        Health = initialHealth;
        Level = initialLevel;
        Experience = 0;
    }

    public void TakeDamage(int damage)
    {
        Health = Mathf.Max(Health - damage, 0);
    }

    public void GainExperience(int amount)
    {
        Experience += amount;
        if (Experience >= 100)
        {
            LevelUp();
        }
    }

    private void LevelUp()
    {
        Level++;
        Experience = 0;
    }
}

 

 

 


View

 

View: 사용자에게 데이터를 시작적으로 표현하는 클래스

 

View는 화면에 데이터를 출력하여 보여주며, 주로 UI와 관련된 처리를 수행합니다. 이때 중요한 점은 데이터를 직접 처리하거나 변경하지 않고, 단순히 데이터(Model)의 표현에만 집중한다는 점입니다. Unity에서는 주로 SpriteRenderer, GUI가 여기에 해당합니다.

 

 

사용 예시

  • PlayerView: 플레이어 캐릭터를 시각적으로 표현합니다. 주로 SpriteRenderer가 여기에 해당합니다.
  • HPBarView: 체력을 화면에 출력합니다. 주로 HP 및 MP, 버프 아이콘 GUI 가 여기에 해당합니다.

 

 

💡 MVC 패턴 정리

더보기

Model: 데이터와 데이터 처리 로직만 존재

Controller: Model을 업데이트하고, 그 결과를 View에 반영

View: 데이터는 처리하지 않으며, 데이터 결과 출력 로직만 담당

 

 

 


정리

오늘은 게임 개발에서 Manager, Controller, View 클래스 역할과 예시를 살펴봤습니다. Manager는 전역적인 시스템 관리, Controller는 개별 객체 제어, View는 데이터를 시각적으로 표현합니다. 중간에 MVC 패턴에 대한 내용이 들어갔는데, 이 부분에 대해서 따로 공부하시면 좋습니다.

 

'유니티(Unity) > 이론 정리' 카테고리의 다른 글

코루틴(Coroutine)의 개념과 동작 원리  (4) 2024.11.13
[Unity Korea] 객체 지향 설계 원칙 (SOLID)  (0) 2024.11.12
클래스 이름 짓기 [ 1편 ]  (1) 2024.11.10
에셋 번들(Asset Bundle) 이론 정리  (1) 2024.03.27
싱글톤(Singleton) 패턴  (0) 2024.03.22
'유니티(Unity)/이론 정리' 카테고리의 다른 글
  • 코루틴(Coroutine)의 개념과 동작 원리
  • [Unity Korea] 객체 지향 설계 원칙 (SOLID)
  • 클래스 이름 짓기 [ 1편 ]
  • 에셋 번들(Asset Bundle) 이론 정리
게임을 제작하는 사람
게임을 제작하는 사람
안녕하세요, 게임 개발자 천냥입니다! 게임을 제작하는 개발자들에게 도움이 될만한 정보와 지식을 제공하는 블로그입니다 ;)
  • 게임을 제작하는 사람
    천냥의 게임 개발 일지
    게임을 제작하는 사람
  • 전체
    오늘
    어제
    • 분류 전체보기 (91) N
      • 유니티(Unity) (60) N
        • 콘텐츠 개발 (7)
        • 툴 개발 (11) N
        • 이슈 도감 (10)
        • 최적화 기법 (4)
        • 쉐이더 (3)
        • 포톤 (0)
        • 이론 정리 (15)
        • 유용한 패키지 정리 (3)
        • 패키지: Cinemachine 정리 (7)
      • C# (2)
      • IT (29)
        • 기술 정리 (2)
        • 알고리즘 (26)
        • Git (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    최적화
    코딩 테스트
    private upm
    티스토리챌린지
    oracle
    커스텀 패키지
    2d endless platform 구현
    무한 플랫포머
    코테
    addressable
    custom package
    Unity
    upm 개발
    시네머신
    에디터
    Cinemachine
    C++
    openupm
    유니티
    쉐이더
    Shader
    upm
    패키지 버전 관리
    UI
    verdaccio
    editor
    끝 없는 2d 맵
    오블완
    allin1spriteshader
    카메라
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
게임을 제작하는 사람
클래스 이름 짓기 [ 2편 ] + MVC 패턴
상단으로

티스토리툴바