using UnityEngine;

public sealed class Managers : MonoBehaviour
{
    private static Managers instance;

    // 필요한 매니저 프로퍼티들을 여기에 추가
    public static GameManager Game { get { return instance.gameManager; } }
    public static UIManager UI { get { return instance.uiManager; } }
    public static DataManager Data { get { return instance.dataManager; } }

    // 매니저 인스턴스들
    private GameManager gameManager;
    private UIManager uiManager;
    private DataManager dataManager;
	// 씬이 로드되기 전에 Init을 호출하여 초기화 작업업
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    static void Init()
    {
        GameObject go = new GameObject("@Managers");
        instance = go.AddComponent<Managers>();
        DontDestroyOnLoad(go);

        // 매니저들 초기화
        instance.gameManager = CreateManager<GameManager>(go.transform);
        instance.uiManager = CreateManager<UIManager>(go.transform);
        instance.dataManager = CreateManager<DataManager>(go.transform);
    }

    private static T CreateManager<T>(Transform parent) where T : Component, IManager
    {
        GameObject go = new GameObject(typeof(T).Name);
        go.transform.SetParent(parent);
        return go.AddComponent<T>();
    }
}

// 아래는 모두 예제입니다.
public interface IManager
{
    void Init();
}

// GameManager.cs - 예제 매니저
public class GameManager : MonoBehaviour, IManager
{
    public void Init()
    {
        Debug.Log("GameManager 초기화");
    }
}

// UIManager.cs - 예제 매니저
public class UIManager : MonoBehaviour, IManager
{
    public void Init()
    {
        Debug.Log("UIManager 초기화");
    }
}

// DataManager.cs - 예제 매니저
public class DataManager : MonoBehaviour, IManager
{
    public void Init()
    {
        Debug.Log("DataManager 초기화");
    }
}

 

이 프레임워크의 주요 특징과 사용 방법

 

1. 구조설명:

Managers 클래스는 싱글톤 패턴을 사용하여 모든 매니저들을 관리합니다.

IManager 인터페이스는 모든 매니저가 Init() 메서드를 구현하도록 보장합니다.

 

2. 매니저 추가 방법:

// 1. Managers 클래스에 프로퍼티 추가
public static NewManager New { get { return instance.newManager; } }

// 2. private 필드 추가
private NewManager newManager;

// 3. Init() 메서드에서 매니저 생성
instance.newManager = CreateManager<NewManager>(go.transform);

 

3. 매니저 사용 예시:

// 어느 스크립트에서든 다음과 같이 사용 가능
void Start()
{
    // 게임 매니저 사용
    Managers.Game.StartGame();

    // UI 매니저 사용
    Managers.UI.ShowMainMenu();

    // 데이터 매니저 사용
    Managers.Data.SaveData();
}

 

4. 주요 장점:

명확한 초기화 순서 - 씬이 로드되기 전에 Managers에서 원하는 순서대로 초기화를 진행합니다.