哈嘍,歡迎來到匯寶盆,首先非常感謝作者涼鞋的筆記分享這篇文章,上一篇文章講述了如何設(shè)計(jì)C#單例的模板。也隨之拋出了問題: 如何設(shè)計(jì)接收MonoBehaviour生命周期的單例的模板? 如何設(shè)計(jì)? 先分析下需求: ??1.約束腳本實(shí)例對象的個數(shù)。 ??2.約束GameObject的個數(shù)。 ??3.接收MonoBehaviour生命周期。 ??4.銷毀單例和對應(yīng)的GameObject。 ??首先,第一點(diǎn),約束腳本實(shí)例對象的個數(shù),這個在上一篇中已經(jīng)實(shí)現(xiàn)了。 ??但是第二點(diǎn),約束GameObject的個數(shù),這個需求,還沒有思路,只好在游戲運(yùn)行時判斷有多少個GameObject已經(jīng)掛上了該腳本,然后如果個數(shù)大于1拋出錯誤即可。 ??第三點(diǎn),通過繼承MonoBehaviour實(shí)現(xiàn),只要覆寫相應(yīng)的回調(diào)方法即可。 第四點(diǎn),在腳本銷毀時,把靜態(tài)實(shí)例置空。 完整的代碼就如下所示: 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); //保證實(shí)例不會被釋放 QPrint.FrameworkLog ("Add New Singleton " + instance.name + " in Game!"); } else { QPrint.FrameworkLog ("Already exist: " + instance.name); } } return instance; } protected virtual void OnDestroy() { instance = null; } } } 總結(jié): ??目前已經(jīng)實(shí)現(xiàn)了兩種單例的模板,一種是需要接收3d素材Unity的生命周期的,一種是不需要接收生命周期的,可以配合著使用。雖然不是本人實(shí)現(xiàn)的,但是用起來可是超級爽快,2333。 看完了這篇分享,是不是對3d素材unity游戲搭建有一定的了解了呢,如果能給您帶來一些幫助,匯寶盆萬分榮幸!更多精彩可以進(jìn)群討論分享納金網(wǎng)匯寶盆交流⑤群 341024464。 本文轉(zhuǎn)載自網(wǎng)絡(luò),謝謝作者分享。
|