Unityテンプレート単例類の2つの書き方
7657 ワード
1.MonoBehaviourに継承されない通常のC#クラス
2.MonoBehaviourに継承された単例クラスは、MonoBehaviourに継承された単例が面倒になりがちです.私たちがシーンを切り替えるときにこの単例が破棄されるので、このときDontDestoryLoadメソッドを書くことができますが、他のシーンから単例スクリプトが元々マウントされていたシーンに切り替えると2つの単例が現れるので、Awakeではこのような状況を解決しました.
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);
}
}
}