내일배움캠프/Unity Final Projcet

[Unity] GameManager 만들기 - 매니저 총괄 시스템

danpat77 2025. 4. 9. 21:25

이번에는 Unity 프로젝트에서 GameManager를 만들어, 게임에 필요한 다양한 매니저들을 하나로 관리하는 시스템을 구축해봤습니다.


개요

게임을 만들다 보면 DataManager, BattleManager, EnemyManager 같은 다양한 매니저 객체들이 필요합니다.
초반에는 매니저마다 따로 만들고 따로 관리해도 괜찮지만, 규모가 커질수록 매니저끼리 의존성이 생기고, 초기화 순서가 꼬이기 시작합니다.

이 문제를 해결하기 위해, 모든 매니저를 하나의 GameManager를 통해 초기화하고 관리하는 시스템을 만들었습니다.


코드

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : Singleton<GameManager>
{
    public DataManager DataManager { get; private set; }
    public TowerManager TowerManager { get; private set; }
    public TileManager TileManager { get; private set; }
    public BattleManager BattleManager { get; private set; }
    public StageManager StageManager { get; private set; }
    public EnemyManager EnemyManager { get; private set; }
    public Player Player { get; private set; }

    protected override void Awake()
    {
        Init();
    }

    private void Init()
    {
        DataManager = new DataManager();
        TowerManager = FindObjectOfType<TowerManager>();
        TileManager = FindObjectOfType<TileManager>();
        BattleManager = FindObjectOfType<BattleManager>();
        StageManager = FindObjectOfType<StageManager>();
        EnemyManager = FindObjectOfType<EnemyManager>();
        Player = new Player();

        DataManager.Initialize();
        TowerManager.Initialize();
        TileManager.Initialize();
        BattleManager.Initialize();
        StageManager.Initialize();
        EnemyManager.Initialize();
        Player.Initialize();
    }
}

 

  • GameManager는 Singleton 패턴을 상속받아 하나만 존재하게 했습니다.
  • 각 매니저들을 public 프로퍼티로 가져와서 다른 스크립트에서도 쉽게 접근할 수 있도록 했습니다.
  • Init() 함수에서 각 매니저들을 초기화하고 준비시킵니다.

주의할 점

  • FindObjectOfType<>()로 찾는 매니저들은 씬에 미리 배치되어 있어야 합니다.
  • DataManager처럼 직접 new로 생성하는 경우도 있습니다.

"왜 new를 쓰고 왜 FindObjectOfType을 쓰는 이유

 

  • new로 만드는 매니저 → 그냥 C# 객체. Unity Scene에 존재할 필요 없음. (데이터/로직 관리용)
  • FindObjectOfType로 찾는 매니저 → Unity GameObject 컴포넌트. Scene에 존재해야 함. (시각/게임플레이 관리용)

 


사용하는 방법

다른 스크립트에서는 이렇게 사용하면 됩니다:

 

 
GameManager.Instance.BattleManager.StartBattle();
GameManager.Instance.DataManager.LoadData();

GameManager 하나만 있으면 나머지 매니저들에 접근이 가능해지니까, 관리가 훨씬 편해집니다.


마무리

아직 완성형은 아니지만, 기본 골격은 갖췄습니다.
필요한 매니저가 추가될 때마다 GameManager에 연결만 해주면 되고, 초반 프로젝트 구조를 안정적으로 잡는 데 도움이 될 것 같습니다.