標籤:空間 array style abstract com bin not found oftype text
c#:使用泛型實現單例
using System; using System.Collections.Generic; using System.Text; using System.Reflection; /// <summary> /// 1.泛型 /// 2.反射 /// 3.抽象類別 /// 4.命名空間 /// </summary> namespace QFramework { public abstract class QSingleton<T> where T : QSingleton<T> { protected static T instance = null; protected QSingleton() { } public static T Instance() { if (instance == null) { // 先擷取所有非public的構造方法 ConstructorInfo[] ctors = typeof(T).GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic); // 從ctors中擷取無參的構造方法 ConstructorInfo ctor = Array.Find(ctors, c => c.GetParameters().Length == 0); if (ctor == null) throw new Exception("Non-public ctor() not found!"); // 調用構造方法 instance = ctor.Invoke(null) as T; } return instance; } } }
unity實現MonoBehaviour 單例,約束GameObject的個數,這個需求,還沒有思路,只好在遊戲運行時判斷有多少個GameObject已經掛上了該指令碼,然後如果個數大於1拋出錯誤即可。在指令碼銷毀時,把靜態執行個體置空。
using UnityEngine; /// <summary> /// 需要使用Unity生命週期的單例模式 /// </summary> namespace QFramework{ public abstract class QMonoSingleton<T> : MonoBehaviour where T : QMonoSingleton<T> { protected static T instance = null; public static T Instance() { if (instance == null) { instance = FindObjectOfType<T>(); if (FindObjectsOfType<T>().Length > 1) { QPrint.FrameworkError ("More than 1!"); return instance; } if (instance == null) { string instanceName = typeof(T).Name; QPrint.FrameworkLog ("Instance Name: " + instanceName); GameObject instanceGO = GameObject.Find(instanceName); if (instanceGO == null) instanceGO = new GameObject(instanceName); instance = instanceGO.AddComponent<T>(); DontDestroyOnLoad(instanceGO); //保證執行個體不會被釋放 QPrint.FrameworkLog ("Add New Singleton " + instance.name + " in Game!"); } else { QPrint.FrameworkLog ("Already exist: " + instance.name); } } return instance; } protected virtual void OnDestroy()
{ instance = null; } }
c#及unity單例模板