上一篇文章講述了如何設計C#單例的模板。也隨之拋出了問題:如何設計接收MonoBehaviour生命周期的單例的模板?
如何設計?
先分析下需求:
1.約束腳本實例對象的個數。
2.約束GameObject的個數。
3.接收MonoBehaviour生命周期。
4.銷毀單例和對應的GameObject。
首先,第一點,約束腳本實例對象的個數,這個在上一篇中已經實現了。
但是第二點,約束GameObject的個數,這個需求,還沒有思路,只好在游戲運行時判斷有多少個GameObject已經掛上了該腳本,然后如果個數大於1拋出錯誤即可。 第三點,通過繼承MonoBehaviour實現,只要覆寫相應的回調方法即可。 第四點,在腳本銷毀時,把靜態實例置空。 完整的代碼就如下所示:
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; } } }
總結:
目前已經實現了兩種單例的模板,一種是需要接收Unity的生命周期的,一種是不需要接收生命周期的,可以配合着使用。雖然不是本人實現的,但是用起來可是超級爽快,
以上都來自:http://liangxiegame.com/unity-you-xi-kuang-jia-da-jian-san-monodan-li-de-mo-ban/ 謝謝