(Unity : Basic) 2. Singleton

Posted by : at

Category : Unity


다른 컴포넌트를 받아오려면 어떻게 해야할까?

public class Player : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        GameObject go = GameObject.Find("@Managers");   // @Managers 오브젝트의
        Managers mo = go.GetComponent<Managers>();    // Managers 스크립트를 받아와 달라
    }

이걸 매번해야할까? 자주사용되는 부분이라면??
Singleton을 사용해보자

// Managers를 Singleton 선언
public class Managers : MonoBehaviour
{
    static Managers Instance;   // 유일성 보장
    static Managers GetInstances() { return Instance; }

    void Start()
    {
        Instance = this;
    }

하지만 이 방법도

그림과 같이 gameobject를 여러개 생성해 버릴시 그에 따라 Script도 여러개가 만들어지기에 Singleton이라 할 수 없다

public class Managers : MonoBehaviour
{
    static Managers Instance;   // 유일성 보장
    static Managers GetInstances() { return Instance; }

    void Start()
    {
        // 여러 Gameobject중 하나의 Gameobject만 사용한다
        GameObject go = GameObject.Find("@Managers");
        Instance = go.GetComponent<Managers>();
    }
// 사용은 이렇게
Managers ms = Managers.GetInstances();

그런데 @Managers가 없는 상황이라면?(실수로 삭제 한다든지)

public class Managers : MonoBehaviour
{
    static Managers Instance;
    static Managers GetInstances() { Init(); return Instance; }

    void Start()
    {
        Init();
    }

    static void Init()
    {
        if(Instance == null)
        {
            GameObject go = GameObject.Find("@Managers");
            if(go == null)
            {
                go = new GameObject{name = "@Managers"};
                go.AddComponent<Managers>();
            }
            DontDestroyOnLoad(go);  // 절대 삭제하지말아 달라는 의미 이후에 설명
            Instance = go.GetComponent<Managers>();
        }
    }

추가적 수정

public class Managers : MonoBehaviour
{
    static Managers s_instance;
    public static Managers Instance { get { Init(); return s_instance; } }
// 사용은 이렇게
Managers ms = Managers.Instance;

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links