singleton

반응형

언제나 많이 쓰는 싱글톤.

유니티 c# 스크립트 버전도 검색하면 많이 나옴.  

그냥 그대로 써도 되긴 하지만 기본적으로 유니티는 신 전환시

신에 올라와 있는 오브젝트를 다 날려버려서 두가지 버전의 싱글톤을 사용하고 있다.

첫번째 버전은 현재 신 버전에서만 유용한 녀석. 가벼운 녀석이다.


public class Singleton<T> : MonoBehaviour where T : MonoBehaviour 

{

    protected static T instance;

 

    //Returns the instance of this singleton

    public static T Instance 

{

        get 

{

            if (instance == null) 

{

                instance = (T)FindObjectOfType(typeof(T));

                if (instance == null) 

{

                    GameObject container = new GameObject();

                    container.name = typeof(T)+"Container";

                    instance = (T)container.AddComponent(typeof(T));

                }

            }

            return instance;

        }

    }

}


두번쨰는 스레드 lock도 보장하고 프로그램 내에서 계속 유지되는 싱글톤이다.

public class ISingleton<T> : MonoBehaviour where T : MonoBehaviour

{

    private static T instance;

    private static object _lock = new object();

    public static T Instance

    {

        get

        {

            lock (_lock)

            {

                if (instance == null)

                {

                    instance = FindObjectOfType(typeof(T)) as T;


                    if (instance == null)

                    {

                        GameObject singleton = new GameObject();

                        instance = singleton.AddComponent<T>();

                        singleton.name = "(singleton) " + typeof(T).ToString();


                        // 기본적으로 scene에 등록된 object들은 삭제가 되므로 

                        // scene 이 전환될때 삭제되지 않도록 한다.

                        DontDestroyOnLoad(singleton);


                        Debug.Log(singleton.name + " Created");

                    }

                }

            }


            if (instance == null)

            {

                Debug.LogError("Singleton is null!");

            }


            return instance;

        }

    }


    public static T Initialize()

    {

        return Instance;

    }

    public static bool IsCreated()

    {

        return (instance != null);

    }

}

'Unity > Unity Study' 카테고리의 다른 글

Texture2D Alpha channel  (0) 2015.09.13
unity 에서 log보기  (0) 2015.07.07
C# keywords  (0) 2015.02.18
void OnDrawGizmos()  (0) 2013.12.18
unity - camera smooth follow  (0) 2013.11.16
TAGS.

Comments