Singleton - jeongpaljack/Design-Pattern-Unity-CSharp GitHub Wiki

Singleton(์‹ฑ๊ธ€ํ†ค)

  • ์‹ฑ๊ธ€ํ†ค์˜ ๋ชฉํ‘œ๋Š” ์œ ์ผ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ
  • ํด๋ž˜์Šค๊ฐ€ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ๊ตฌํ˜„ํ–ˆ๋‹ค๋ฉด ์ดˆ๊ธฐํ™”๋œ ํ›„์—๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์˜ค์ง ํ•˜๋‚˜์˜ ์ธ์Šคํ„ฐ์Šค๋งŒ์ด ์กด์žฌํ•ด์•ผ ํ•จ
  • ์œ ๋‹ˆํ‹ฐ์—์„œ๋Š” ๊ฒŒ์ž„๋งค๋‹ˆ์ €, UI๋งค๋‹ˆ์ € ๋“ฑ ๋งค๋‹ˆ์ € ์‹œ์Šคํ…œ์— ์‚ฌ์šฉ๋จ
  • ์ „์—ญ์—์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ

์˜ˆ์ œ ์‹ฑ๊ธ€ํ†ค ์ฝ”๋“œ

using UnityEngine;

namespace Chapter.Singleton                         // Chapter ํŒŒ์ผ ์•ˆ์˜ Singleton ํŒŒ์ผ์ด๋ผ๋Š” ์˜๋ฏธ
{
    public class Singleton<T> :                     // ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค, T์˜ ์˜๋ฏธ๋Š” ๋‚˜์ค‘์— ํ˜•์‹์„ ์ง€์ •ํ•˜๊ฒ ๋‹ค๋Š” ๋œป
        MonoBehaviour where T : Component           // ์ œ๋„ค๋ฆญ์˜ ์กฐ๊ฑด, T์˜ ํƒ€์ž…์€ ๋ฐ˜๋“œ์‹œ Unity์˜ Component ํ˜น์€ ๊ทธ ํ•˜์œ„ ํƒ€์ž…์ด์–ด์•ผ ํ•จ
    {

        private static T _instance;                 // private static T ํ˜•์‹์˜ _instance ์„ ์–ธ - ํ”„๋กœ๊ทธ๋žจ์—์„œ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜์ง€๋งŒ, ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜

        public static T Instance                    // static ํ˜•์‹์˜ Instance ์„ ์–ธ         -> ํ•ด๋‹น ์‹ฑ๊ธ€ํ†ค์˜ ํƒ€์ž… ๋ฐ˜ํ™˜ ํ•จ์ˆ˜       -> ์‹ฑ๊ธ€ํ†ค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉ
        {
            get
            {
                if (_instance == null)              // Awake์—์„œ ์ €์žฅํ•œ T ํƒ€์ž…, ์ฆ‰ _instance์˜ ํ˜•์‹์ด ์—†์„ ๊ฒฝ์šฐ
                {
                    _instance = FindFirstObjectByType<T>();     // ์ด๋ฏธ T๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ ์ด๊ฒƒ์œผ๋กœ ๋Œ€์ฒด

                    if (_instance == null)                      // T๊ฐ€ ์ตœ์ข…์ ์œผ๋กœ ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ
                    {
                        GameObject obj = new GameObject();      // ์ƒˆ๋กœ์šด ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ
                        obj.name = typeof(T).Name;              // ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋ฆ„(name)์„ ํด๋ž˜์Šค์˜ ์ด๋ฆ„(Name)์œผ๋กœ ์ดˆ๊ธฐํ™”
                        _instance = obj.AddComponent<T>();      // _instance์˜ ํƒ€์ž…์„ obj์˜ T ์ด๋ฆ„์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ์ •์˜
                    }
                }

                return _instance;                               // Instance์˜ ๊ฐ’์„ _instance๋กœ ์ง€์ •
            }
        }

        public virtual void Awake()                             // ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋  ๋•Œ, ์ œ์ผ ๋จผ์ € ์‹คํ–‰    -> ์‹ฑ๊ธ€ํ†ค์ด ํ•˜๋‚˜๋งŒ ์žˆ๋„๋ก ํ•˜๋Š” ํ•จ์ˆ˜
        {
            if (_instance == null)                              // _instance๊ฐ€ ์—†์„ ๊ฒฝ์šฐ, ์ฆ‰ ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค๊ฐ€ ์—†์„ ๊ฒฝ์šฐ
            {
                _instance = this as T;                          // ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ Tํƒ€์ž…์œผ๋กœ ์บ์ŠคํŒ…ํ•˜์—ฌ ์ €์žฅ
                DontDestroyOnLoad(gameObject);                  // ์”ฌ ์ „ํ™˜ ์‹œ์—๋„ ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค๊ฐ€ ํŒŒ๊ดด๋˜์ง€ ์•Š๊ฒŒ ์œ ์ง€
            }
            else
            {
                Destroy(gameObject);                            // ์ด๋ฏธ ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ์œผ๋ฉด ์ƒˆ๋กœ์šด ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ญ์ œ์‹œํ‚ด
            }
        }
    }
}