上一篇文章讲述了如何设计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/)