게임 개발을 하다 보면 클래스 명명을 어떻게 해야할 지 모를 때가 많습니다. 이번 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 |