[내배캠] 유니티 꾸준 실습 Week2

Sungchan Ahn(안성찬)·2024년 10월 23일

내일배움캠프

목록 보기
49/104

싱글톤 패턴 (Singleton Pattern)

특정 클래스의 인스턴스가 애플리케이션 내에서 하나만 존재하도록 보장하는 패턴으로 해당 인스턴스에 대한 전역적인 접근을 제공한다. 유니티에서는 게임 생명주기 동안 단일 인스턴스로 존재해야 하는 중요 객체와 리소스를 관리하는 데 자주 활용된다.

싱글톤을 사용하는 이유

  1. 중앙 집중식 제어 : GameManager, 플레이어 데이터, 오디오 컨트롤러 등 싱글톤 패턴을 적용해 게임의 중요 구성 요소들을 중앙에서 관리할 수 있도록 한다. 코드 중복을 피하고 게임을 효율적으로 관리할 수 있다.

  2. 전역적인 접근 : 싱글톤 객체는 어디에서나 접근 가능하기 때문에 다른 객체에서 싱글톤 객체를 편하게 사용할 수 있다.

  3. 상태 유지 : 싱글톤 객체는 게임의 라이프사이클 동안 유지된다. 씬이 전환되도 데이터를 유지할 수 있는 등 게임의 상태와 데이터를 유지할 수 있기 때문에 게임의 진행 상황을 관리하거나 데이터를 공유하는 데 유용하다.

싱글톤 패턴의 단점

  1. static은 메모리를 고정적으로 차지하기 때문에 싱글톤이 늘어날수록 메모리를 많이 잡아먹는다.
  2. 어디에서나 접근할 수 있기 때문에 잘못 사용하면 여러 코드의 결합성을 높일 수 있다. 이로 인해 유지보수, 확장성이 떨어질 수 있다.

결론: 싱글톤 패턴은 필요한 경우인지 신중히 살펴보고 적용해야한다.

싱글톤 제너릭 클래스로 확장

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>
profile
게임 개발 기록

0개의 댓글