Unity - Singleton

김도현·2023년 10월 16일
0

TIL

목록 보기
48/76

Singleton 필요 이유

클래스 구조를 짜다보면 다른 클래스의 함수나 메서드를 사용해야 할 수도 있고, 전체 클래스들이 공유하는 전역변수가 필요할 수도 있다.
규모가 작은 게임에서는 public 변수를 만듬 다음 유니티 Inspector에서 드래그 앤 드롭으로 의존관계를 만들수도 있지만 게임이 점점 복잡해진다면 다른 클래스를 참조하는 변수가 너무 많이 만들어져도 문제이다.

클래스 구조에서 공통적으로 사용하는 전역변수나 리소스, 데이터 아니면 게임 전체를 관장하는 매니저 클래스는 싱글톤으로 따로 빼는게 도움이 될 수도 있다.

싱글톤을 사용하는 방법

유니티에서 싱글톤을 사용하는 방법은 크게 2가지가 있다.
1. 이 싱글톤 클래스가 여느 유니티 C#스크립트처럼 Monobehaviour를 상속받아서 Hierarchy에 존재하게 하는 것.
2. Monobehaviour을 상속받지 않고 Hierarchy에 존재하지 않게 하는 것.

1. Monobehaviour를 상속받는 것

private static GameManager instance;
public static GameManager Instance
{
	get
	{
		if (instance == null)
		{
			instance = this;
            DontDestroyOnLoad(this.gameObject); //파괴 방지 (선택)
		}
		return instance;
	}
}

번외

private static GameManager instance;
public static GameManager instance
{
    get
    {
        if (instance == null)
        {
            GameObject go = new GameObject("GameManager");
            instance = go.AddComponent<GameManager>();
            DontDestroyOnLoad(instance);
        }
        return instance;
    }
}

이렇게 작성하면 시작 시 Hierarchy에 없다가 필요에 의해 GameManager를 호출한 순간 생성되는 방식이다.

2. Monobehaviour를 상속받지 않는 것

private static GameManager instance;
public static GameManager Instance
{
	get
	{
		if (instance == null)
		{
			instance = new GameManager();
		}
		return instance;
	}
}

public GameManager()
{

}

3. 제너럴 방식

(1) Monobehaviour를 상속받는 것

public class Singletone<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T _instance;
    public static T instance
    {
        get
        {
            if (_instance == null)
            {
                GameObject go = new GameObject(typeof(T).ToString());
                _instance = go.AddComponent<T>();
                DontDestroyOnLoad(_instance);
            }
            return _instance;
        }
    }
    //Singleton으로 사용하는 것 중에서 공통되는 부분은 여기에 작성해도 됨
}

public class GameManager : Singletone<GameManager>
{
	//내용
}

(2) Monobehaviour를 상속받지 않는 것

public class Singletone<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T _instance;
    public static T instance
    {
        get
        {
            if (_instance == null)
            {
				_instance = new GameManager();
            }
            return _instance;
        }
    }
    //Singleton으로 사용하는 것 중에서 공통되는 부분은 여기에 작성해도 됨
}

public class GameManager : Singletone<GameManager>
{
	//내용
}

0개의 댓글