EveryDay.DevUp

[Unity] Singletone 본문

Unity

[Unity] Singletone

EveryDay.DevUp 2020. 4. 29. 23:12

Unity Singletone은 Unity Scene Load와 Destory에 상관없이 별도의 삭제 코드가 없다면 앱의 종료시 까지 남아있는 GameObject로, 전역적인 접근과 하나의 인스턴스만 생성되는 개념

Unity Singletone을 직접 구현할 수도 있지만, 템플릿으로 구현된 다음의 코드를 복사해서 사용할 수 도 있음

http://wiki.unity3d.com/index.php/Singleton

 

Singleton - Unify Community Wiki

Alternatives Scriptable Objects One excellent alternative to the singleton pattern in Unity is the use of ScriptableObjects as a type of global variable. Ryan Hipple from Schell Games gave a presentation at Unite Austin 2017 titled Game Architecture with S

wiki.unity3d.com

▶ Scene에 이미 싱글톤 객체가 있을 경우 초기 설정이 되지 않는 문제가 있어 해당 부분 수정

using UnityEngine;

public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
	private static bool m_ShuttingDown = false;
	private static object m_Lock = new object();
	private static T m_Instance;

	public static T Instance
	{
		get
		{
			if( m_ShuttingDown )
			{
				return null;
			}

			lock( m_Lock )
			{
				if( m_Instance == null )
				{
					m_Instance = (T)FindObjectOfType( typeof( T ) );

					GameObject singletonObject = null;
					if( m_Instance == null )
					{
						singletonObject = new GameObject();
						m_Instance = singletonObject.AddComponent<T>();
					}
					else
					{
						singletonObject = m_Instance.gameObject;
					}

					DontDestroyOnLoad( singletonObject );
					singletonObject.name = typeof( T ).ToString() + " (Singleton)";
				}

				return m_Instance;
			}
		}
	}

	private void OnApplicationQuit()
	{
		m_ShuttingDown = true;
	}

	private void OnDestroy()
	{
		m_ShuttingDown = true;
	}
}

▶ Sington 사용 코드 예제

public class Game : Singleton<Game>
{
    public void OnScreenUpdate()
    {
    }
}

public class ScreenManager : MonoBehaviour
{
    void Start()
    {
        Game.Instance.OnScreenUpdate();
    }
}

 

● 싱글톤 사용에 있어서의 유의점

▶ 여기저기 데이터를 끌어다 쓰기 편하기 때문에 싱글톤이 남용되는 경향이 있음. 게임에서는 전역적으로 관리가 필요한 것들이 존재하지만 쓰기 쉽다는 이유로 그런것들을 모두 싱글톤으로 만든다면 

1. 코드를 유지보수 할 때, 해당 싱글톤을 사용하는 모든 부분에 대한 체크가 필요해짐

2. 싱글톤 간의 데이터의 연결, 다른 클래스와의 데이터 연결 등 다양한 데이터의 종속성이 생겨 디버깅이 어려워지고 오류가 발생할 가능성이 커짐

3. Unity는 GC에 의해 메모리가 관리되는데, 이미 객체가 파괴되었지만 싱글톤에서 객체를 잡고 있는 경우가 발생하여 메모리 릭이 생길 수 있음

▶ 싱글톤을 여러개 만들기보다는 하나의 싱글톤에 전역적으로 필요한 클래스를 결합해서 사용