上一篇文章講述了如何設計C#單例的模板。也隨之拋出了問題:
如何設計接收MonoBehaviour生命周期的單例的模板?
如何設計?
先分析下需求:
1.約束腳本實例對象的個數。
2.約束GameObject的個數。
3.接收MonoBehaviour生命周期。
4.銷毀單例和對應的GameObject。
首先,第一點,約束腳本實例對象的個數,這個在上一篇中已經實現(xiàn)了。
但是第二點,約束GameObject的個數,這個需求,還沒有思路,只好在游戲運行時判斷有多少個GameObject已經掛上了該腳本,然后如果個數大于1拋出錯誤即可。
第三點,通過繼承MonoBehaviour實現(xiàn),只要覆寫相應的回調方法即可。 第四點,在腳本銷毀時,把靜態(tài)實例置空。 完整的代碼就如下所示
usingUnityEngine;
///
/// 需要使用Unity生命周期的單例模式
///
namespaceQFramework {
publicabstractclassQMonoSingleton : MonoBehaviour where T : QMonoSingleton
{
protectedstaticT instance =null;
publicstaticT Instance()
{
if(instance ==null)
{
instance = FindObjectOfType();
if(FindObjectsOfType().Length > 1)
{
QPrint.FrameworkError ("More than 1!");
returninstance;
}
if(instance ==null)
{
stringinstanceName =typeof(T).Name;
QPrint.FrameworkLog ("Instance Name: "+ instanceName);
GameObject instanceGO = GameObject.Find(instanceName);
if(instanceGO ==null)
instanceGO =newGameObject(instanceName);
instance = instanceGO.AddComponent();
DontDestroyOnLoad(instanceGO);//保證實例不會被釋放
QPrint.FrameworkLog ("Add New Singleton "+ instance.name +" in Game!");
}
else
{
QPrint.FrameworkLog ("Already exist: "+ instance.name);
}
}
returninstance;
}
protectedvirtualvoidOnDestroy()
{
instance =null;
}
}
}
總結:
目前已經實現(xiàn)了兩種單例的模板,一種是需要接收Unity的生命周期的,一種是不需要接收生命周期的,可以配合著使用。雖然不是本人實現(xiàn)的,但是用起來可是超級爽快,2333。
附:[我的框架地址](https://github.com/liangxiegame/QFramework)
轉載地址:[涼鞋的筆記](http://liangxiegame.com/)