게임의 전역 상태나 기능을 관리할 때 매우 유용하다
소프트웨어 디자인 패턴에서 싱글턴 패턴(Singleton pattern)을 따르는 클래스는,
생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.
이와 같은 디자인 유형을 싱글턴 패턴이라고 한다.
주로 공통된 객체를 여러개 생성해서 사용하는 DBCP(DataBase Connection Pool)와 같은 상황에서 많이 사용된다.
출처 : wikipedia
정해져있는 관리자 객체에만 사용하도록 하자
너무 많은 책임을 주지말자
부적절한 상황에 쓰지말자
오용 하지마라
단일의 인스턴스 와 전역적인 접근 을 보장하기 때문에 싱글톤을 사용해 오브젝트들이 서로를 참조하고 있는 결합도를 낮출 수 있습니다.
게임 내에서 파괴되지 않기 때문에 보다 편하게 데이터를 보관할 수 있습니다.
전역적인 접근이 가능하기 때문에 데이터에 대한 보호수준을 주의하지 않으면, 의도치 않은 데이터 변화가 발생할 수 있습니다.
객체들이 싱글톤 객체의 데이터에 의존하게 되는 현상이 발생할 수 있습니다.
static을 사용해 정적 메모리에 할당되므로, 싱글톤 객체가 많을수록 가용 메모리가 적어집니다.
필요 R&D
public class GameManager : MonoBehaviour
{
private static GameManager instance // (GameManager static 변수로) 데이터 하나가 전역적으로 사용 되기 위해
public int score; // 점수
if (instance == null) // 만약 instance가 없었으면
{
instance = this;
}
else
{
Destroy(gameObject); /여러 게임 관리자 발생을 막기 위해
}
using UnityEngine;
public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
private static T instance;
public static T Instance
{
get
{
if (instance == null)
{
// 씬에서 찾기
instance = FindObjectOfType<T>();
if (instance == null)
{
// 없다면 새로 생성
GameObject singletonObj = new GameObject(typeof(T).Name);
instance = singletonObj.AddComponent<T>();
DontDestroyOnLoad(singletonObj);
}
}
return instance;
}
}
protected virtual void Awake() // 생성시 = Awake
{
// 중복 제거
if (instance == null)
{
instance = this as T;
DontDestroyOnLoad(gameObject);
}
else if (instance != this)
{
Destroy(gameObject);
}
}
}
using UnityEngine;
public class GameManager : Singleton<GameManager>
{
public int score;
public bool isGamePaused;
public void AddScore(int amount)
{
score += amount;
}
public void PauseGame()
{
isGamePaused = true;
Time.timeScale = 0f;
}
public void ResumeGame()
{
isGamePaused = false;
Time.timeScale = 1f;
}
protected override void Awake()
{
base.Awake(); // Singleton 초기화
// 추가 초기화
}
}