Unity 游戏框架搭建 (三) MonoBehaviour单例的模板

上一篇文章讲述了如何设计C#单例的模板。也随之抛出了 问题:
如何设计接收MonoBehaviour生命周期的单例的模板?

如何设计?
先分析下需求:
  1.约束脚本实例对象的个数。
  2.约束GameObject的个数。
  3.接收MonoBehaviour生命周期。
  4.销毁单例和对应的GameObject。

  首先,第一点,约束脚本实例对象的个数,这个在上一篇中已经实现了。
  但是第二点,约束GameObject的个数,这个需求,还没有思路,只好在游戏运行时判断有多少个GameObject已经挂上了该脚本,然后如果个数大于1抛出错误即可。
  第三点,通过继承MonoBehaviour实现,只要覆写相应的回调方法即可。 第四点,在脚本销毁时,把静态实例置空。 完整的代码就如下所示:

[C#]  纯文本查看  复制代码
?
 
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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的生命周期的,一种是不需要接收生命周期的,可以配合着使用。虽然不是本人实现的,但是用起来可是超级爽快,2333。

附:[我的框架地址]( https://github.com/liangxiegame/QFramework)

转载请注明地址:[凉鞋的笔记]( http://liangxiegame.com/)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值