Game Programming/Game Engine

Unity3D :: Singleton (싱글톤)

VallistA2015. 3. 28. 14:31

유니티에서는 GameObject 단위로 오브젝트들을 관리를 하기 때문에 C#에서 쓰는 평범한 방법으로는 구현을 하지 못한다.

하지만 유니티에서 객체단위의 필요한 오브젝트들을 관리하기 위해서는 꼭 필요한 것이 Singleton 인데, 구현을 어찌 해야하는가? 에 대한 의문이들어 조금 삽질을 해보았다.


여러가지 방법이 있는데 그 중에서 확답은 못하지만 내가 사용하는 방법에 대해 나눠보고자 한다.


1.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Singleton : MonoBehaviour
{
    static Singleton instance = null;
    public static Singleton GetInstance
    {
            if (instance == null)
            {
                instance = FindObjectOfType(typeof(Singleton);
 
                if (instance == null)
                {
                    Debug.Log("Nothing" + instance.ToString());
                    return null;
                }
            }
            return instance;
        }
    }
}


상당히 일반적인 방법이다. MonoBahaviour 에서 지원해주는 FindObjectOfType의 방법으로 사용하게 된다.

FindObjectOfType을 사용하여, 게임내에서 오브젝트 타입을 검출하여 얻는 오브젝트를 반환해준다. 만약 오브젝트가 없으면 반환을 null로 하며, Debug로 실패했다고 메시지를 준다.


2.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Singleton : MonoBehaviour
{
    static Singleton instance = null;
    public static Singleton GetInstance
    {
            get
            {
                  if (instance == null)
                 {
                       instance = FindObjectOfType(typeof(Singleton);
 
                       if (instance == null)
                      {
                           Debug.Log("Nothing" + instance.ToString());
                           return null;
                      }
                }
                return instance;
            }
        }
    }
}


좀 더 안전하게 가져올려면 이 방법을 쓰면 될 듯하다.

Singleton을 Generic으로 빼서 재사용성을 극대화 시키는 방법도 존재한다.


3.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Singleton<t> : MonoBehaviour where T : MonoBehaviour
{
    protected static T instance = null;
    public static T GetInstance
    {
        get
        {
            if (instance == null)
            {
                instance = FindObjectOfType(typeof(T)) as T;
 
                if (instance == null)
                {
                    Debug.Log("Nothing" + instance.ToString());
                    return null;
                }
            }
            return instance;
        }
    }
}


이렇게 써주면 극대화 된 제너릭 싱글톤이 완성된다.

댓글

VallistA

병특이 끝나서 게임에서 웹으로 스위칭한 프로그래머.
프로그래밍 정보등을 공유합니다.
현재는 이 블로그를 운영하지 않습니다.
vallista.kr 로 와주시면 감사하겠습니다!

자고 싶습니다. ㅠㅠ

Github      :: 링크

궁금한점 문의 주시면 답변드리도록 하겠습니다

VISITED

Today :

Total :

SNS

  • 페이스북아이콘
  • 카카오톡아이콘
  • 트위터아이콘

Lately Post

Lately Comment