SendMessage,需要知道响应事件的物件,还需要一个响应函数的函数名字符串作为参数,如果我们有多个物件都要响应某个事件怎么办呢,或者我们不知道有哪些物件要响应事件怎么办呢,在NEGUI的工具类NGUITools中有个函数NGUITools是这么实现的
[C#编程] 鉴于普通 副本
1. 静态 公共 无效 广播(字符串 了funcName)
2. {
3. typeof运算(游戏对象)) 为 游戏对象[];
4. 对于 (整数 I = 0,IMAX = gos.Length;我<IMAX; + I)GOS [I] SendMessage函数(了funcName,SendMessageOptions.DontRequireReceiver);
5. }
6.
7. / / /公升; summarygt
8. / / /调用在场景中的所有对象指定的函数。
9. / / / </摘要>
10.
11. 静态 公共 无效 广播(字符串 了funcName, 对象 参数)
12. {
13. typeof运算(游戏对象)) 为 游戏对象[];
14. 对于 (整数 I = 0,IMAX = gos.Length;我<IMAX; + + i)条。GOS [I] SendMessage函数(了funcName,参数,SendMessageOptions.DontRequireReceiver);
15. }
这似乎也满足我们的需求,但是,但是,如果我们的项目有一定的规模,GameObject有成千上万个,那么再遍历向所有的GameObject SendMessage函数就不那么现实了,所以我们需要新的实现方式。
本想自己写一个,但是百度了一下,发现早就有人实现了,所以在这里分享一下,原本地址点击这里,代码如下:
[C#编程] 鉴于普通 副本
1. 使用 UnityEngine;
2. 使用 System.Collections;
3. 使用 System.Collections.Generic;
4. 使用 系统;
5.
6. / / NotificationCenter用于处理游戏物体之间的消息。
7. / /游戏物体可以注册以接收特定的通知。当另一个对象发送该类型的通知,所有注册并落实相应的消息游戏物体将收到通知。
8. / /五合一游戏物体必须注册才能获得与addObserver的功能的通知,并通过他们的自我,以及通知的名称。观察游戏物体也可以注销自己与RemoveObserver功能。游戏物体必须要求按类型基础上接收和删除一个类型的通知类型。
9. / /发布通知是通过创建一个Notification对象并将它传递给PostNotification完成。所有接收游戏物体将接受通知的对象。通知对象包含发送者,通知类型名称,并包含数据的选项哈希表。
10. / /要使用NotificationCenter,无论是创建和管理地方它唯一的实例,或者使用静态NotificationCenter。
11.
12. / /我们需要一个静态方法的对象能够获得默认的通知中心。
13. / /这个默认的中心是所有的对象都将使用什么最通知。我们当然可以创建自己的独立NotificationCenter的实例,但这是静态的由所有。
14. 公共 类 NotificationCenter:MonoBehaviour
15. {
16. 私有 静态 NotificationCenter defaultCenter;
17. 公共 静态 NotificationCenter DefaultCenter(){
18. / /如果defaultCenter不存在,我们需要创建它
19. 如果 (!defaultCenter){
20. / /因为NotificationCenter是一个组件,我们必须创建一个游戏物体将其附加到。
21. 新的 游戏物体(“违约通知中心” );
22. / /添加NotificationCenter组件,并将其设置为defaultCenter
23. defaultCenter = notificationObject.AddComponent <NotificationCenter>();
24. DontDestroyOnLoad(defaultCenter);
25. }
26.
27. 返回 defaultCenter;
28. }
29.
30. / /我们的散列表包含了所有的通知。在哈希表中的每个通知是包含所有的观察员该通知的ArrayList。
31. 新 的Hashtable();
32.
33. / / addObserver的包括版本,其中观察者可以从一个特定的对象要求只接收通知。我们还没有实现那个还,所以发送方的价值被忽略了。
34. 公共 无效 的addObserver(组件观察员,字符串名称){的addObserver(观察员,名称, 空); }
35. 公共 无效 的addObserver(组件观察员,字符串名称, 对象 发件人){
36. / /如果名字不好,然后抛出一个错误并返回。
37. 如果 (名称== 空 | |名== “” ){DEBUG.LOG( “ 通知中的addObserver指定空名称” ); 返回; }
38. / /如果存在这个特定的通知还没有好好尝试一下,然后创建它。
39. 如果 (!notifications.ContainsKey(名称)){
40. 新 名单的<component>();
41. }
42. / /如果(!通知[名]){
43. / /通知[名称] =新名单的<component>();
44. / /}
45.
46. 名单的<component> notifyList =(列表的<component>)的通知[名称];
47.
48. / /如果观察员名单尚未包含了一个的注册,然后将其添加。
49. 如果 {notifyList.Add(观察员)(notifyList.Contains(观察者)!); }
50. }
51.
52. / / RemoveObserver删除观察者从通知列表中指定通知类型
53. 公共 无效 RemoveObserver(组件观察员,字符串名称){
54. / /改变从原来的
55.
56. / /假设这是一个有效的通知类型,从列表中删除观察者。
57. / /如果观察员名单现在是空的,然后从通知散列删除通知类型。这是看家的目的。
58. 如果 (notifyList!= 空){
59. 如果 (notifyList.Contains(观察者)){notifyList.Remove(观察者); }
60. 如果 (notifyList.Count == 0){notifications.Remove(名); }
61. }
62. }
63.
64. / / PostNotification发送一个通知对象到已请求接收此类通知的所有对象。
65. / /一个通知可以是贴有一个通知对象或只发送单个组件。
66. 公共 无效 PostNotification(组件aSender,弦乐ANAME){PostNotification(aSender,ANAME, 空); }
67. 公共 无效 PostNotification(组件aSender,弦乐ANAME, 反对 ADATA){PostNotification(新 通知(aSender,ANAME,ADATA)); }
68. 公共 无效 PostNotification(通知aNotification){
69. / /首先确保该通知的名称是有效的。
70. 如果 (aNotification.name == 空 | | aNotification.name == “” ){DEBUG.LOG( “ 空名称发送到PostNotification”。); 回报; }
71. / /获取通知列表,并确保它是有效的,以及
72. / /改变从原来的
73. 如果 (notifyList == 空){DEBUG.LOG( “ 通知中PostNotification没有发现清单”。); 回报; }
74.
75. / /克隆列表中,所以不会有一个问题,如果一个观察者添加或删除,同时通知被发送
76. 新 名单的<component>(notifyList);
77.
78. / /创建一个数组来保存我们需要删除无效的观察员轨道
79. 新 名单的<component>(); / /改变从原来的
80.
81. / / Itterate通过所有已签署了该类型的通知被通知的对象。
82. 的foreach (组件观察员 在 notifyList){
83. / /如果观察者是无效的,然后跟踪它,所以我们以后可以将其删除。
84. / /我们无法将其删除,现在,还是会乱for循环起来。
85. 如果 (观察员){observersToRemove.Add(观察者);
86. 否则 {
87. / /如果观察者是有效的,然后发送该通知。这是发送的消息是通知的名称。
88. observer.SendMessage(aNotification.name,aNotification,SendMessageOptions.DontRequireReceiver);
89. }
90. }
91.
92. / /删除所有无效的观察者
93. 的foreach (组件观察员 在 observersToRemove){
94. notifyList.Remove(观察者);
95. }
96. }
97. }
98.
99. / /通知类是发送到接收通知类型的对象的对象。
100. / /这个类包含发送游戏物体,该通知的名称,以及任选的含有哈希表的数据。
101. 公共 类 {通知
102. 公共 组件发送者;
103. 公共 字符串名称;
104. 公共 对象 数据;
105.
106. 公共 通知(组件aSender,弦乐ANAME){发件人= aSender; 名称= ANAME; 数据= 零; }
107. 公共 通知(组件aSender,弦乐ANAME, 反对 ADATA){发件人= aSender; 名称= ANAME; 数据= ADATA; }
108. }
看完这段代码,相信你已经知道该怎么用了!