MonoBehaviour的实例池

unity的开发中难免会遇到一些公共变量的共享,通常的做法就是在场景中放一个空GameObject,然后挂上若干个脚本,需要调用时,通过Find或者神马的得到这些脚本。

其实更简便的方式应该是用单例类(Singleton),在需要调用的时候再实例化这个类然后进行调用,不过众所周知,继承自MonoBehaviour的脚本都是不能new的,那么这也意味着单例类的“调用时再实例化”就不是那么直接就可以实现的了。

当然,世事无绝对,先上代码:
[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
using System.Collections.Generic;
using UnityEngine;
 
abstract public class MonoInstancePool
{
         private static Dictionary< string , Component> sInstancePool = new Dictionary< string , Component>();
 
         public static T getInstance<T>( bool bDestroy = true , string sGameObjectName = null )
                 where T : Component
         {
                 string sFullName;
                 if (sGameObjectName != null )
                 {
                         sFullName = sGameObjectName;
                 }
                 else
                 {
                         sFullName = typeof (T).FullName;
                 }
 
                 if (sInstancePool.ContainsKey(sFullName) && sInstancePool[sFullName] == null )
                 {
                         sInstancePool.Remove(sFullName);
                 }
 
                 if (!sInstancePool.ContainsKey(sFullName))
                 {
                         GameObject go = new GameObject();
                         go.name = sFullName;
                         sInstancePool.Add(sFullName,go.AddComponent<T>() as T);
 
                         if (bDestroy)
                         {
                                 GameObject.DontDestroyOnLoad(go);
                         }
                 }
                 return sInstancePool[sFullName] as T;
         }
}


通过在运行时创建GameObject,然后再AddComponent,这样就可以实现单例模式的“调用时实例化”了。
例如:
[C#] 纯文本查看 复制代码
?
1
MonoInstancePool.getInstance<EventTicker>().startToTick();


当然这样做有一个小小的弊端,在编辑器里绑好的脚本可以预先拖放一些Prefab之类,而本文的上述方法就不太适用了(因为是在运行时实例化的),上述实例池适用的是UIManager之类的运行时的管理类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值