Singleton
모든 영역에서 접근가능한 데이터를 만들어야하는 상황이 생길 수 있다.
예를 들면, 에셋을 미리 로드해서 관리하는 에셋 관리자 객체나,
데이터 테이블을 미리 생성해놓는 데이터 테이블 관리자 객체와 같은 것들이 이에 해당된다.
이처럼 어떤 위치에서도 참조가 가능하도록 해당 객체 설계하는 방법을 싱글턴 디자인 패턴이라 부른다.
하지만 유니티에서는 객체가 GameObject를 갖고 있는 경우도 있기 때문에, 싱글턴 객체를 만들기 위해서 일반적인 방법보다는 조금 더 신경써야할 부분들이 있다.
Singleton.cs
다음과 같이 Singleton 객체를 만든다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public abstract class Singleton<T> : MonoBehaviour where T : Component
{
#region Fields
/// <summary>
/// The instance.
/// </summary>
private static T instance;
#endregion
#region Properties
/// <summary>
/// Gets the instance.
/// </summary>
/// <value>The instance.</value>
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;
}
}
#endregion
#region Methods
/// <summary>
/// Use this for initialization.
/// </summary>
protected virtual void Awake()
{
if (instance == null)
{
instance = this as T;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
#endregion
}
ResourceManager.cs
이제 싱글턴 객체를 상속하여 에셋 관리 객체를 만들어보자.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ResourceManager : Singleton<ResourceManager>
{
protected override void Awake()
{
base.Awake();
Init();
}
private void Init()
{
// Load Assets here
}
public int GetData()
{
return 1111;
}
}
이제 이 객체는 어디서든 참조하여 사용할 수 있다.
var data = ResourceManager.Instance.GetData();
'게임 엔진 > Unity' 카테고리의 다른 글
[Unity] [Example] 평면 연산 방법 (Plane) (0) | 2020.07.28 |
---|---|
[Unity] [Example] Mesh (0) | 2020.07.15 |
[Unity] Hp Bar 만들기 (0) | 2020.07.13 |
[Unity] 글로벌 이벤트 관리 방법 (1) | 2020.07.06 |
[Unity] 전략게임 카메라 제작 방법 (0) | 2020.07.06 |