강의, 책/[Unity] C#과 유니티로 만드는 MMORPG 게임 개발 시리즈

Section 1. 유니티 기초 - 매니저 만들기, 싱글톤 패턴

hye3193 2024. 1. 16. 01:21

* C# Script 생성 시에는 컴포넌트 용도로 쓸 파일과 일반적인 스크립트 파일을 구분할 것

 

static Managers s_instance;
public static Managers Instance { get { Init(); return s_instance; } }

void Start()
{
    Init();
}

static void Init()
{
    if (s_instance == null)
    {
        GameObject go = GameObject.Find("@Managers");
        if (go == null)
        {
            go = new GameObject { name = "@Managers" };
            go.AddComponent<Managers>();
        }
        DontDestoryOnLoad(go);
        s_instance = go.GetComponent<Managers>();
    }
}

요약: GameObject에 붙어있는 Managers 컴포넌트를 static 변수에 집어넣고, 이 변수의 getter를 public으로 설정하여 다른 스크립트에서 단 하나뿐인 해당 Managers를 참고할 수 있도록 만든 것

 

* s_instnace: static 형식의 지역 변수(_)

* @Managers인 이유: 그냥 지우면 안 되는 필수 요소를 구별하기 위함

 

1. static 변수로 선언하여 유일하게 만들어준 다음, 만약 해당 변수가 null일 경우 @Managers라는 이름의 GameObject를 찾아준다

2. 만약 @Managers라는 이름의 GameObject가 없을 경우 하나 새로 만들어준 다음, Managers 컴포넌트를 붙여준다

3. DontDestroyOnLoad에 해당 GameObject를 넣고, s_instance를 해당 GameObject에 붙은 Managers 컴포넌트로 지정한다

+ 프로퍼티를 사용했기 때문에 다른 스크립트에서 s_instance를 가져올 때는

void Start()
{
    Managers mg = Managers.Instance;
}

위와 같은 방식으로 가져오면 된다