📗
【Unity】SingletonMonoBehaviourについて
はじめに
初めての方も、そうでない方もこんにちは!
現役ゲームプログラマーのたむぼーです。
自己紹介を載せているので、気になる方は見ていただければ嬉しいです!
今回は
SingletonMonoBehaviour
について紹介します
SingletonMonoBehaviourとは
SingletonMonoBehaviourは、シングルトンパターンを用いて1つのインスタンスのみを生成し、全シーンで共通して使用するMonoBehaviourクラス
使い方
using UnityEngine;
using Utils;
namespace Example
{
public class ExampleManager : SingletonMonoBehaviour<GameManager>
{
protected override void Initialize()
{
// 初期化処理
Debug.Log("GameManager Initialized");
}
// 他のメソッドやプロパティを追加
public void DoSomething()
{
Debug.Log("Doing something...");
}
}
}
namespace Example
{
public class ExampleClass
{
void Start()
{
ExampleManager.Instance.DoSomething();
}
}
}
スクリプト
SingletonMonoBehaviour.cs
using UnityEngine;
namespace Utils
{
public class SingletonMonoBehaviour<T> : MonoBehaviour where T : MonoBehaviour
{
static private T _instance;
static readonly private object _lockObject = new object();
static private bool _isApplicationIsQuitting = false;
/// <summary>
/// インスタンス
/// </summary>
static public T Instance
{
get
{
if (_isApplicationIsQuitting)
{
return null;
}
lock (_lockObject)
{
if (_instance == null)
{
_instance = (T)FindObjectOfType(typeof(T));
if (_instance == null)
{
return null;
}
}
return _instance;
}
}
}
/// <summary>
/// 起動時
/// </summary>
virtual protected void Awake()
{
if (_instance == null)
{
_instance = this as T;
DontDestroyOnLoad(gameObject);
Initialize();
}
else if (_instance != this)
{
Destroy(gameObject);
}
}
/// <summary>
/// 破壊時
/// </summary>
virtual protected void OnDestroy()
{
if (_instance == this)
{
_isApplicationIsQuitting = true;
}
}
/// <summary>
/// 初期化
/// </summary>
virtual protected void Initialize()
{
// 処理なし
}
}
}
Discussion