unity消息机制实现

在mvc模式中,消息机制被广泛使用,Unity3d自带的消息机制真心不好用,像SendMessage,需要知道响应事件的物件,还需要一个响应函数的函数名字符串作为参数,如果我们有多个物件都要响应某个事件怎么办呢,或者我们不知道有哪些物件要响应事件怎么办呢,在NEGUI的工具类NGUITools中有个函数NGUITools是这么实现的

[C#编程]   鉴于普通 副本
  1. 静态 公共 无效 广播(字符串 了funcName)  
  2. {  
  3.     游戏对象[] GOS = GameObject.FindObjectsOfType(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.     游戏对象[] GOS = GameObject.FindObjectsOfType(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.             游戏物体notificationObject =  新的 游戏物体(“违约通知中心” );  
  22.             / /添加NotificationCenter组件,并将其设置为defaultCenter  
  23.             defaultCenter = notificationObject.AddComponent <NotificationCenter>();  
  24.         DontDestroyOnLoad(defaultCenter);  
  25.         }  
  26.    
  27.         返回 defaultCenter;  
  28.     }  
  29.    
  30.     / /我们的散列表包含了所有的通知。在哈希表中的每个通知是包含所有的观察员该通知的ArrayList。  
  31.     Hashtable的通知=   的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.         名单的<component> notifyList =(列表的<component>)的通知[名称]  / /改变从原来的  
  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.         名单的<component> notifyList =(列表的<component>)的通知[aNotification.name]  / /改变从原来的  
  73.         如果 (notifyList ==  ){DEBUG.LOG( “ 通知中PostNotification没有发现清单”。);  回报; }  
  74.    
  75.         / /克隆列表中,所以不会有一个问题,如果一个观察者添加或删除,同时通知被发送  
  76.         notifyList =   名单的<component>(notifyList);  
  77.    
  78.         / /创建一个数组来保存我们需要删除无效的观察员轨道  
  79.         名单的<component> observersToRemove =   名单的<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. }  
看完这段代码,相信你已经知道该怎么用了!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值