특정 클래스의 인스턴스가 애플리케이션 내에서 하나만 존재하도록 보장하는 패턴으로 해당 인스턴스에 대한 전역적인 접근을 제공한다. 유니티에서는 게임 생명주기 동안 단일 인스턴스로 존재해야 하는 중요 객체와 리소스를 관리하는 데 자주 활용된다.
중앙 집중식 제어 : GameManager, 플레이어 데이터, 오디오 컨트롤러 등 싱글톤 패턴을 적용해 게임의 중요 구성 요소들을 중앙에서 관리할 수 있도록 한다. 코드 중복을 피하고 게임을 효율적으로 관리할 수 있다.
전역적인 접근 : 싱글톤 객체는 어디에서나 접근 가능하기 때문에 다른 객체에서 싱글톤 객체를 편하게 사용할 수 있다.
상태 유지 : 싱글톤 객체는 게임의 라이프사이클 동안 유지된다. 씬이 전환되도 데이터를 유지할 수 있는 등 게임의 상태와 데이터를 유지할 수 있기 때문에 게임의 진행 상황을 관리하거나 데이터를 공유하는 데 유용하다.
결론: 싱글톤 패턴은 필요한 경우인지 신중히 살펴보고 적용해야한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
protected static T _instance;
public static T Instance
{
get
{
if (_instance == null)
{
_instance = FindObjectOfType<T>();
if (_instance == null)
{
GameObject obj = new GameObject();
obj.name = typeof(T).Name;
_instance = obj.AddComponent<T>();
}
}
return _instance;
}
}
// 인스턴스가 있는지 여부
public static bool HasInstance => _instance != null;
// 인스턴스가 있으면 해당 인스턴스 반환, 없으면 null
public static T TryGetInstance() => HasInstance ? _instance : null;
// 현재 인스턴스 반환
public static T Current => _instance;
// override할 경우 base.Awake()
protected virtual void Awake()
{
InitializeSingleton();
}
// 싱글톤 객체 초기화
protected virtual void InitializeSingleton()
{
_instance = this as T;
}
}
---
// 싱글톤으로 만들 클래스에 상속
public class GameManager : Singleton<GameManager>