경일게임아카데미 멀티 디바이스 메타버스 플랫폼 개발자 양성과정 20221018 개인 공부 2022/04/04~2022/12/14

Jinho Lee·2022년 10월 18일
0

2022.10.18 개인 학습 - 유니티(Unity)에서 사용가능한 5가지 싱글톤

유니티에서 활용 가능한 싱글톤 패턴 5가지

1. 일반적인 싱글톤

  • 구현
using UnityEngine;

public class SingletonPattern
{
    private SingletonPattern() { }
    private static SingletonPattern instance = null;
    public static SingletonPattern GetInstance()
    {
        if (instance == null)
        {
            instance = new SingletonPattern();
        }

        return instance;
    }

    public void Use()
    {
        Debug.Log("Singleton");
    }
}
  • 사용
SingletonPattern.GetInstance().Use();

2. MonoBehaviour를 사용한 싱글톤

  • 구현
using UnityEngine;

public class SingletonPattern_Mono : MonoBehaviour
{
    private SingletonPattern_Mono() { }
    private static SingletonPattern_Mono instance = null;
    public static SingletonPattern_Mono GetInstance()
    {
        if (instance == null)
        {
            instance = FindObjectOfType(SingletonPattern_Mono);
            DontDestroyOnLoad(_instance.gameObject);
        }

        return instance;
    }

    public void Awake()
    {
        instance = this;
    }

    public void Use()
    {
        Debug.Log("MonoBehaviourSingleton");
    }
}
  • 사용
SingletonPattern_Mono.GetInstance().Use();
  • 주의 : 해당 GameObject가 Hierarchy에 존재해야 함.

3. 프로퍼티를 사용한 싱글톤

  • 구현
using UnityEngine;

public class SingletonPattern_Property
{
    private SingletonPattern_Property() { }

    private static SingletonPattern_Property instance = null;
    public static SingletonPattern_Property Instance
    {
        get
        {
            if (instance == null)
                instance = new SingletonPattern_Property();
            return instance;
        }
        private set
        {
            instance = value;
        }
    }

    public void Use()
    {
        Debug.Log("PropertySingleton");
    }
}
  • 사용
SingletonPattern_Property.Instance.Use();

4. 제네릭을 활용한 싱글톤

4-1. MonoBehaviour를 사용하지 않는 싱글톤

  • 구현
using System;

public class SingletonPattern_NonMono<T> where T : class
{
    private static T instance = null;
    public static T Instnace
    {
        get
        {
            if (instance == null)
            {
                instance = Activator.CreateInstance(typeof(T)) as T;
            }
            return instance;
        }
    }
}
  • 상속 예제
using UnityEngine;

public class ItemManager : SingletonPattern_NonMono<ItemManager>
{ 
    public void Use()
    {
        Debug.Log("NonMonoSingleton");
    }
}
  • 사용
ItemManager.Instnace.Use();

4-2. MonoBehaviour를 사용한 싱글톤

  • 구현
using UnityEngine;

public class SingletonPattern_Mono<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T instance = null;
    public static T Insatnce
    {
        get
        {
            instance = FindObjectOfType(typeof(T)) as T;

            if (instance == null)
            {
                instance = new GameObject(typeof(T).ToString(), typeof(T)).AddComponent<T>();
            }
            return instance;
        }
    }
}
  • 상속 예제
using UnityEngine;

public class SkillManager : SingletonPattern_Mono<SkillManager>
{
    public void Use()
    {
        Debug.Log("MonoSingleton");
    }
}
  • 사용
SkillManager.Insatnce.Use();

정리

  • 이와 같이 다양한 싱글톤 패턴을 어떤 상황에서 사용할지 고민할 필요가 있다.

0개의 댓글