查看: 1971|回復(fù): 0
打印 上一主題 下一主題

[教程] 3d素材unity游戲框架搭建 (三) MonoBehaviour單例的模板

[復(fù)制鏈接]

Rank: 2

納金幣
48
精華
0
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2016-8-19 18:42:40 |只看該作者 |倒序?yàn)g覽
哈嘍,歡迎來到匯寶盆,首先非常感謝作者涼鞋的筆記分享這篇文章,上一篇文章講述了如何設(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ò),謝謝作者分享。

本帖被以下淘專輯推薦:

  • · 教程|主題: 5, 訂閱: 1
分享到: QQ好友和群QQ好友和群 騰訊微博騰訊微博 騰訊朋友騰訊朋友 微信微信
轉(zhuǎn)播轉(zhuǎn)播0 分享淘帖1 收藏收藏1 支持支持0 反對反對0
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

手機(jī)版|納金網(wǎng) ( 閩ICP備2021016425號-2/3

GMT+8, 2024-10-23 15:27 , Processed in 0.200454 second(s), 32 queries .

Powered by Discuz!-創(chuàng)意設(shè)計(jì) X2.5

© 2008-2019 Narkii Inc.

回頂部