Unityテンプレート単例類の2つの書き方

7657 ワード

1.MonoBehaviourに継承されない通常のC#クラス
using System.Collections.Generic;
using UnityEngine;

public class NormalSingleton<T> where T : class,new()
{
    private static T instance;

    public static T Instance
    {
        get
        {
            if(instance == null)
            {
                T t = new T();
                if (t is MonoBehaviour)
                {
                    Debug.LogError(" , MonoSingleton");
                    return null;
                }
                instance = t;
            }
            return instance;
        }
    }
}

2.MonoBehaviourに継承された単例クラスは、MonoBehaviourに継承された単例が面倒になりがちです.私たちがシーンを切り替えるときにこの単例が破棄されるので、このときDontDestoryLoadメソッドを書くことができますが、他のシーンから単例スクリプトが元々マウントされていたシーンに切り替えると2つの単例が現れるので、Awakeではこのような状況を解決しました.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MonoSingleton<T> : MonoBehaviour where T :  MonoBehaviour
{
    private static T instance;

    public static T Instance
    {
        get
        {
            if(instance == null)
            {
                instance = FindObjectOfType<T>();
                if (instance == null)
                {
                    Debug.LogError(" , :" + typeof(T).Name);
                    return null;
                }

            }
            return instance;
        }
    }

    private void Awake()
    {
        if (instance == null)
        {
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(instance);
        }
            
    }

}