R&D Singleton Pattern(Manager)

COrollaROOT·2025년 6월 20일

싱글톤 패턴이란?

Unity에서 싱글톤 매니저(Singleton Manager)패턴은

게임의 전역 상태나 기능을 관리할 때 매우 유용하다

소프트웨어 디자인 패턴에서 싱글턴 패턴(Singleton pattern)을 따르는 클래스는,
생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.
이와 같은 디자인 유형을 싱글턴 패턴이라고 한다.
주로 공통된 객체를 여러개 생성해서 사용하는 DBCP(DataBase Connection Pool)와 같은 상황에서 많이 사용된다.
출처 : wikipedia

  • 싱글톤 패턴은 게임구현에서 가장 많이 사용되는 디자인 패턴중 하나입니다.
    단일의 인스턴스와 전역적인 접근을 제공하며 이러한 특성은 장점과 동시에 단점으로 작용할 수 있기 때문에 정확한 정보와 구현 방법을 알고 사용하는것이 중요합니다.

정해져있는 관리자 객체에만 사용하도록 하자
너무 많은 책임을 주지말자
부적절한 상황에 쓰지말자
오용 하지마라

장점

  • 단일의 인스턴스전역적인 접근 을 보장하기 때문에 싱글톤을 사용해 오브젝트들이 서로를 참조하고 있는 결합도를 낮출 수 있습니다.

  • 게임 내에서 파괴되지 않기 때문에 보다 편하게 데이터를 보관할 수 있습니다.

단점

  • 전역적인 접근이 가능하기 때문에 데이터에 대한 보호수준을 주의하지 않으면, 의도치 않은 데이터 변화가 발생할 수 있습니다.

  • 객체들이 싱글톤 객체의 데이터에 의존하게 되는 현상이 발생할 수 있습니다.
    static을 사용해 정적 메모리에 할당되므로, 싱글톤 객체가 많을수록 가용 메모리가 적어집니다.

필요 R&D

GameManager

SenceManager

FileManager

AudioManager

PlayerManager

AnemyManager

UIManager

DataManager

예시

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);
        }
    }
}

GameManager 예시

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 초기화
        // 추가 초기화
    }
}
profile
"시들지 않는 꽃"

0개의 댓글