Post

KDT Unity 5주차 팀 프로젝트

2024-01-30 TIL

매니저들 싱글톤으로 관리하기

유니티로 게임을 만들면서 게임 매니저를 포함한 매니저들을 많이 만드는 경우가 있다.

매니저들은 싱글톤으로 관리하는 경우가 많은데 해당 스크립트를 다 싱글톤으로 만들기란 굉장히 비효율적인 방법이다.

그래서 생각한 방법이 싱글톤을 사용하는 하나의 스크립트를 만들고 해당 스크립트에 매니저들의 객체를 생성한 후 사용하는 방법이다.

Main.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
...
private static Main _instance;
private static bool _initialized;
private static Main Instance
{
    get
    {
        if (_initialized) return _instance;
        _initialized = true;
        GameObject main = GameObject.Find("@Main");
        if (main != null) return _instance;
        main = new GameObject { name = "@Main" };
        main.AddComponent<Main>();
        DontDestroyOnLoad(main);
        _instance = main.GetComponent<Main>();
        return _instance;
    }
}

#region Fields
private readonly GameManager _gameManager = new();
private readonly DataManager _dataManager = new();
private readonly InteractionManager _interactionManager = new();
private readonly ObjectManager _objectManager = new();
private readonly PoolManager _poolManager = new();
private readonly ResourceManager _resourceManager = new();
private readonly ScenesManager _scenesManager = new();
private SoundManager _soundManager = new();
private readonly StageManager _stageManager = new();
private readonly TimeManager _timeManager = new();
private readonly UIManager _uiManager = new();
#endregion

#region Properties
public static string NextScene { get; set; }
public static bool FirstLord { get; set; } = true;
public static GameManager Game => Instance._gameManager;
public static DataManager Data => Instance._dataManager;
public static InteractionManager Interaction => Instance._interactionManager;
public static ObjectManager Object => Instance._objectManager;
public static PoolManager Pool => Instance._poolManager;
public static ResourceManager Resource => Instance._resourceManager;
public static ScenesManager Scenes => Instance._scenesManager;
public static SoundManager Sound
{
    get => Instance._soundManager;
    set => Instance._soundManager = value;
}
public static StageManager Stage => Instance._stageManager;
public static TimeManager Time => Instance._timeManager;
public static UIManager UI => Instance._uiManager;
#endregion
...

해당 스크립트로 인하여 Main에서 하나의 싱글톤을 활용하여 해당 스크립트에서 싱글톤 관리를 해야하는 모든 매니저들을 객체화 후 꺼내어 사용한다.

사운드 매니저의 경우 필요할 때 생성후 Main에 연결하는 방식을 사용하기에 프로퍼티는 접근이 가능하게 설정해놓았다.

This post is licensed under CC BY 4.0 by the author.