티스토리 뷰

Unity/Study

[Unity] Singleton 패턴

Kim2558 2018. 6. 15. 04:09

싱글톤 패턴은 하나의 인스턴스에 전역적인 접근을 시키며 보통 호출될 때 인스턴스화 되므로 사용하지 않는다면 생성되지도 않습니다.

유니티에서 싱글톤 패턴은 매니저 클래스와 같이 여러 클래스에서 같은 인스턴스에 접근이 가능해야 하는 경우에 사용됩니다.

어디서나 접근할 수 있다는 매우 편리한 장점이 있지만 이 장점 덕분에 결합도가 높아지는 결과가 생길 수 있으므로 주의하면서 사용해야 됩니다.

유니티에서의 싱글톤 패턴의 구현은 매우 다향한 방법이 있어 자신에게 맞는 방법을 택하면 좋을 것 같습니다. 아래에 몇 가지 구현 방법을 적어놓았습니다. 


1. Awake 에서 초기화 하는 방법 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using UnityEngine;
 
public class SingletonAwake : MonoBehaviour
{
    #region Singleton
    public static SingletonAwake Instance;
    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
        }
    }
    #endregion
}
 
cs

Awake 함수에서 Instance를 초기화 합니다. 이 방법은 매우 간단하게 구현이 가능하다는 장점이 있지만 코드가 조금 지분해지고 재사용 가능하지 않다는 단점이 있습니다.


2. MonoBehaviour를 상속 받고 제네릭을 사용한 방법


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using UnityEngine;
 
public class SingletonMono<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T instance = null;
    public static T Instance
    {
        get
        {
            if(instance == null)
            {
                instance = FindObjectOfType(typeof(T)) as T;
            }
 
            if (instance == null)
            {
                instance = new GameObject("Singleton").AddComponent<T>();
            }
 
            return instance;
        }
    }
}
cs

제네릭을 이용한 방법으로 이 클래스를 상속받아 싱글톤 패턴을 구현합니다. FindObjectOfType(typeof(T))현재 활성화된 게임오브젝트의 컴포넌트 중 T(입력한 클래스) 타입을 찾아 Object형식으로 반환합니다. 만약 FindObjectOfType 에서 찾지 못한다면 새로 만들어 싱글톤 클래스를 추가를 해주기 때문에 편리합니다. MonoBehaviour를 상속받아 인스펙터에서 값을 조절하거나 관찰할 수 있다는 장점이 있습니다. 


3. MonoBehaviour를 상속받지 않고 제네릭을 사용한 방법


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class SingletonCSharp <T> where T : new()
{
 
    private static T instance;
    public static T Instance
    {
        get
        {
            if(instance == null)
            {
                instance = new T();
                return instance;
            }
            else
            {
                return instance;
            }
        }
    }
    
}
 
cs


위와 마찬가지로 제네릭을 이용하여 편하게 상속받아 사용하면 싱글톤 패턴이 구현이됩니다. MonoBehaviour를 상속받지 않아 new 를 사용할 수 있습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/01   »
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
글 보관함