• 싱글턴 패턴의 기본
  • 유니티에서 재사용 가능한 싱글턴 클래스 작성하기
  • 전역적으로 접근할 수 있는 GameManager 구현

요구사항

C# 기본지식

싱글턴패턴 이해하기

이름에서 알 수 있듯이 싱글턴 패턴의 주요 목표는ㄴ 유일성을 보장하는 것이다. 클래스가 싱글턴 패턴을 제대로 구현했다면 초기화된 후에는 런타임 동안 메모리에 는 오직 하나의 인스턴스만 존재해야 한다. 이 메커니즘은 일관되고 유일한 진입점에서 전역적으로 접근할 수 있는 시스템을 관리하는 클래스가 있을 때 도움이 된다.

 

디자인

싱글턴의 디자인은 매우 단순하다.

유일성을 보장해야하기 때문에 자기 자신과 같은 유형의 개체 인스턴스를 발견하면 즉시 없앤다. 예외는 없다.

싱글턴 패턴에서 가장 중요한 점은 오직 하나만 존재해야한다는 점으로 그렇지 않다면 목적달성에 실패한 것이다.

장단점

장점

  1. 전역접근가능 : 싱글턴 패턴을 사용하여 리소스나 서비스의 전역 접근점을 만들 수 있다.
  2. 동시성 제어 : 공유 자원에 동시 접근을 제한하고자 사용할 수 있다.

단점

  1. 유닛 테스트 : 과도하게 사용하면 유닛 단위의 테스트가 어려워진다. 싱글턴 오브젝트가 다른 싱글턴에 종속될 수도 있다. 하나가 누락되면 종속성이 끊어져 문제가 생긴다.
  2. 잘못된 습관 : 싱글턴은 사용하기 쉬워 잘못된 프로그래밍 습관이 생길 수 있다. 싱글턴으로 어디서나 모든 것에 쉽게 접근하게 만들 수 있기 때문에, 코드 작성 시 보다 정교하게 접근하여 테스트하는 것이 귀찮게 느껴질 수 있다.

게임 매니저 디자인

게임매니저는 게임 전체의 수명동안 살아있어야 한다. 메모리내에서 유일해야한다.

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Singleton <T> : MonoBehaviour where T:Component
{
    private 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 virtual void Awake()
    {
        if (instance == null)
        {
            instance = this as T;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }
}

 

using UnityEngine;
using System;
using UnityEngine.SceneManagement;

public class GameManager : Singleton<GameManager>
{
    private DateTime sessionStartTime;
    private DateTime sessionEndTime;

    private void Start()
    {
        sessionStartTime = DateTime.Now;
        Debug.Log("Game session start @: " + sessionStartTime);
    }
    private void OnApplicationQuit()
    {
        sessionEndTime = DateTime.Now;
        TimeSpan timeDifference = sessionEndTime.Subtract(sessionStartTime);
        Debug.Log("Game session end @: " + sessionEndTime);
        Debug.Log("Game session duration: " + timeDifference);
    }
    
}

 

'Unity' 카테고리의 다른 글

Unity - 데이터 저장  (2) 2024.12.14
Serialization depth limit 7 exceeded Issue  (1) 2024.12.14
디펜스 게임 만들기 - 그리드 타일 시스템  (0) 2024.02.05

+ Recent posts