unity的broadcastmessagehandlerss什么意思

unity 脚本文件间的数据交互怎么做-CSDN论坛-真格学网-IT技术综合网站
unity 脚本文件间的数据交互怎么做-CSDN论坛
来源:互联网 &责任编辑:小易 &时间: 18:15:31
unity脚本文件间的数据交互怎么做-CSDN论坛原因很简单,渠道成本高。实际上,华为系的手机售价都高,或者说,同价位手机配置都很低。1599的畅享7p配的都只是720p屏幕+骁龙435的soc。用的是公模设计,没有任何特色,不要跟小米比了,就是跟自家的荣耀比都不值得买。但我们会发现,所有华为线下店都是不卖荣耀的。一台手机在线下,渠道商提成,运营商提成,门店租金之类的成本全压在手机上,当然贵。对于厂商来说,这是合理的,因为这都是成本。但对于用户不是。对于用户来说,成本分为两部分,创造价值成本和不创造价值成本,前者如更好的屏幕,更好的soc,更精致的外观设计等,这是能明显提升用户体验的成本部分,实际上,这才是高中低端手机的根本区别;后者,如明星割双眼皮组:1、周星驰2、张家辉3、郭敬明4、金城武5、罗志祥6、甄子丹7、成龙这些仅仅只是割双眼皮的而已……娱乐圈的整容更是普遍,况且粉丝和明星的审美也在不断地提高,整容成为一种保持美丽的常态。其实,整容在娱乐圈已经不是什么秘密,甚至成为标配。想要角色?那就先整容。被要求整容的明星不在少数,曾经的颖宝因为大圆脸,过去试镜的时候,导演直接让她去垫垫下巴。《我是歌手》中爆红的黄妈也被唱片公司要求整容。而在韩国,想出道,那就先签订“整容协议书”吧。颜值不够,那就整容来凑吧。元斌小时候和成年对比照继“X档案”之后,韩国的整容医生爆出韩国明星集体整容的“丑事”。整容医生柳济圣说,元斌从高中就开始整容,本网有用户碰到这样的问题:unity 脚本文件间的数据交互怎么做-CSDN论坛,具体问题如下:
我也是一名从产后抑郁里艰难走出来的两个孩的妈妈,同时也是一名心理咨询师,现在也是一家企业的行政人事主管。我可以分享一下我是怎么从抑郁状态里面走出来的,希望能对你有点帮助和启发。我是在我哥哥自杀后,抑郁。防恶意抓取,请查看原文,,真格学网提供内容。本网根据需求用户需求,为用户寻得以下其他网友提供的解决方法,方法仅供参考,具体如下:今年暑假,大家万众期待的《战狼2》就要上映了,1的精彩让大家对2的期待很大,也确实是中国近年来少有的硬片,并且《战狼2》从拍摄到结束一直都有较高的话题度,一直保持着较高的热度。什么演员问题呀,一时间让。防恶意抓取,请查看原文,,真格学网提供内容。解决方案1:你穷的只看见了钱原创乱而且乱弹5:19国际大导演诺兰来华为新片《敦克尔克》造势,有关方面安排《战狼2》导演吴京与之进行一场“颠峰对谈”,没想到引发了一场粉丝骂战。两厢对决,如果在。防恶意抓取,请查看原文,,真格学网提供内容。
方法有很多,如单例模式或搜索对象再Get他身上的类.
狗狗在45天左右接种第一针疫苗,以后每隔21天接种一次。在狗狗完全接种完疫苗之前,不宜接触外界环境,因为狗狗的免疫系统尚未完全形成,很容易染病。虽然不宜外出走动,但是在这期间,对于狗狗来说社会化非常重。防恶意抓取,请查看原文,,真格学网提供内容。解决方案2:这是有了足够的人生阅历才能够体会到的人生智慧。美国心理学家亚伯拉罕?马斯诺曾经于1943年在其论文《人类激励理论》中提出,人类的需求从低到高可以划分为五个层次,像阶梯一样从下到上,分别是生理需求、安全。防恶意抓取,请查看原文,,真格学网提供内容。
我和楼上的想法类似。2017高考分数线已经来了,有一部分的省市率先公布!令人有些惊讶的是,这些分数线都达到了较低的水平,河北省更是创下了10年来的最低。小编先给题主看一下往年各省市的分数情况,再对今年的低分进行对比分析!。防恶意抓取,请查看原文,,真格学网提供内容。
不过,个人觉得这里应该由这4个对象自己判断自己是否移出了边界(这些对象应该属于同一个基类,基类有这个判断的函数)。朋友,一元钱叫一块钱,这是一个老习惯,以前的钱纸币非常少,大部分都是用银和铜制造成圆形的钱币,上面的图案有人像和文字,这种钱当时称呼就是块。后来这种银和铜的钱币没有了,可是人们以经习惯了叫块,所以到现。防恶意抓取,请查看原文,,真格学网提供内容。
当自身移出边界时,派发一个消息出去,告诉别人自己移出边界了。西红柿炒鸡蛋看似是几乎人人都会的简单料理,要想把它做得真正好吃,是需要认真研究窍门的。1.原料要好?要选鲜红而且纤维细腻的。?鸡蛋要用新鲜的,蛋黄比例大的更鲜美。打鸡蛋的时候稍微放点清水,想去腥可以放。防恶意抓取,请查看原文,,真格学网提供内容。
而那些需要获取对象移出边界事件的脚步里,就可以监听这些消息。第三套人民币是在我国全面确立了社会主义制度,开始了社会主义经济建设的新形势下设计、印制的,是完全依靠我们自己的力量完成的,具有独立自主、自力更生的特点。该套人民币共有七种面额,八种原版(一角券图景主题。防恶意抓取,请查看原文,,真格学网提供内容。
消息监听和派发可以用C#的委托实现,Unity也有一个SendMessage和BroadcastMessage,用委托实现可能会好一些。  近日,一则关于日本书包的消息在朋友圈被许多家长转发。据称,一些家长去日本旅游时,除了抢购马桶盖、电饭煲,顺便抢购书包。事实上,许多中国家长追捧的这款昂贵的日本小学生书包,并未从实用的角度考虑,更多。防恶意抓取,请查看原文,,真格学网提供内容。
消息派发在很多地方都会用到,不妨花点时间做一些。Unity消息派发的实现网上有很多资料,你也可以直接拿来用,以后再慢慢理解。
有没有85的,今年32岁,03到08年一直在广东工厂打工,工资元,06年结婚,同年女儿出生,09到浙江在电器商场做柜台主任干了6年,工资6000左右,去年竟然对工作没信心,辞职不干了。防恶意抓取,请查看原文,,真格学网提供内容。首先问题上提出的名词跟我们日常表述的有点不太一样,这只是一张纸币。这种好号码纸币(包括号码顺,相同号码多等),可以称之为“豹子号”等;又根据纸币编号相连相同号码位数的多寡,不及“豹子号”的又有“狮子号”等称呼。而连号钞,一般来说狭义的讲,就是好的号码在互相之间根据某种组合形式相连,比如豹子号十连号等,人民币纸币又根据所连号的纸币不同还有“大五”和“小五”等称呼;当然广义上,发行的纸币,都是号码相连的。所以这只有一张纸币,单独一张没法叫做“连号钞”。看图上这张100元纸币是第五套人民币第三版纸币也就是俗称的“土豪金”。之前1999年第五套人民币第一版和2005年第五套人民币第二版100元纸币均已我也是一名从产后抑郁里艰难走出来的两个孩的妈妈,同时也是一名心理咨询师,现在也是一家企业的行政人事主管。我可以分享一下我是怎么从抑郁状态里面走出来的,希望能对你有点帮助和启发。我是在我哥哥自杀后,抑郁初起的,当然童年里已经种下了抑郁的种子,只是在成年后遇到创伤性的事件,暴发了而已。在生完大宝后,我就开始抑郁了,不仅有心理上的郁郁寡欢,闷闷不乐,同时也有躯体性症状。中医称之为产后风,心理学称之为产后抑郁。我的主要的方法是学习心理学,同时看心理咨询师。从抑郁的根源上解决问题。
本文相关:unity 3种message消息管理使用 - CSDN博客
unity 3种message消息管理使用
在unit的Component类中,封装了3种消息发送处理机制,接下来一起看一下他们的使用方法
BroadcastMessage 广播消息
function BroadcastMessage (methodName : string, parameter : object = null, options : SendMessageOptions = SendMessageOptions.RequireReceiver) : void
在游戏物体每一个MonoBehaviour和它的全部子物体上调用名为methodName的方法。
通俗的解释:BroadcastMessage朝物体和所有子物体发送消息。
对一个物体及其所有子物体,进行消息的广播,如果其中任何子物体上贴有脚本,而脚本中有相应的处理此消息的函数,则Invoke调用之。
接受消息的此方法(函数)可以通过设置没有引用参数表来忽略传过来的消息中的参数。如果选项Option中设置成了SendMessageOptions.RequireReceiver,那么当没有任何脚本组件接受此消息时,一个相应的错误会弹出来
C# JavaScript using UnityE
using System.C
public class example : MonoBehaviour {
void ApplyDamage(float damage) {
print(damage);
public void Awake() {
BroadcastMessage("ApplyDamage", 5.0F);
BroadcastMessage ("ApplyDamage", 5.0);
function ApplyDamage (damage : float) {
print (damage);
SendMessage 发送消息
function SendMessage (methodName : string, value : object = null, options : SendMessageOptions = SendMessageOptions.RequireReceiver) : void
SendMessage朝本级别物体的多个脚本发送信息,也就是向当前对象挂载的所有脚本上面发送消息。
在游戏物体每一个MonoBehaviour上调用名为methodName的方法。
接受此消息的函数也可以没有参数。如果选项Option中设置成了SendMessageOptions.RequireReceiver,那么当没有任何脚本组件接受此消息时,一个相应的错误会弹出来
C# JavaScript using UnityE
using System.C
public class example : MonoBehaviour {
void ApplyDamage(float damage) {
print(damage);
public void Awake() {
SendMessage("ApplyDamage", 5.0F);
SendMessage ("ApplyDamage", 5.0);
function ApplyDamage (damage : float) {
print (damage);
SendMessageUpwards 向上发送消息
function SendMessageUpwards (methodName : string, value : object = null, options : SendMessageOptions = SendMessageOptions.RequireReceiver) : void
Description描述
SendMessageUpwards朝物体和上级父物体发送信息。
在游戏物体每一个MonoBehaviour和每一个behaviour的祖先上调用名为methodName的方法。
接受此消息的函数也可以没有参数。如果选项Option中设置成了SendMessageOptions.RequireReceiver,那么当没有任何脚本组件接受此消息时,一个相应的错误会弹出来
C# JavaScript using UnityE
using System.C
public class example : MonoBehaviour {
void ApplyDamage(float damage) {
print(damage);
public void Awake() {
SendMessageUpwards("ApplyDamage", 5.0F);
SendMessageUpwards ("ApplyDamage", 5.0);
function ApplyDamage (damage : float) {
print (damage);
测试方法执行
在unity中创建脚本,一个用于发送消息,一个用于接收消息
脚本1 发送消息
using UnityE
using System.C
public class xx1 : MonoBehaviour
void OnGUI()
if (GUI.Button(new Rect(10, 10, 100, 50), "发送1"))
SendMessage("myTest");
if (GUI.Button(new Rect(10, 150, 100, 50), "发送2"))
BroadcastMessage("myTest");
if (GUI.Button(new Rect(10, 200, 100, 50), "发送3"))
SendMessageUpwards("myTest");
脚本2 接收消息
using UnityE
using System.C
public class XXX : MonoBehaviour {
void Start () {
void Update () {
void OnDrag(Vector2 delta)
Debug.Log("-------OnDrag--------");
public void myTest() {
Debug.Log("this is a methord:"+gameObject.name);
发送1按钮点击,sendMessage,运行结果
this is a methord:Plane1
也就是只有plane1 收到消息
发送2按钮点击,broadCaseMessage运行结果
发送3按钮点击,SendMessageUpwards运行结果
本文已收录于以下专栏:
相关文章推荐
上周接触到了委托,这周终于在自己的项目中用到了,现在准备用委托和事件的方案替换掉之前的一些使用不足的解决方案!
在此感谢前辈们的优秀文章,我是根据在网上阅读的文章,通过自己的见解,并在自己的项目...
U3d中 SendMessage 和 BroadcastMessage 用法
1.接收函数不用public修饰
Message相关有3条指令:...
下面做个简单的demo看看BroadcastMessage如何使用的总结:
目标对象或者子孙对象上如果有接收方法,就会被执行
方法可以接收参数,也可以不接收参数
设置RequireReceive...
广播与消息
函数原型:
public void ReceiveBroadcastMessage (string methodName, object value);
public v...
在mvc模式中,消息机制被广泛使用,Unity3d自带的消息机制真心不好用,像SendMessage,需要知道响应事件的物件,还需要一个响应函数的函数名字符串作为参数,如果我们有多个物件都要响应某个事...
unity中提供了对象间消息传递的三种方法:
我们经常会遇到在运行状态下去找到一个现有对象。在这个例子中,我们需要添加新的敌人到EnemyManagerComponent中,以便于在我们的场景中可以按我们想的任何方式来控制敌人对象。由于涉及到开销...
在mvc模式中,消息机制被广泛使用,Unity3d自带的消息机制真心不好用,像SendMessage,需要知道响应事件的物件,还需要一个响应函数的函数名字符串作为参数,如果我们有多个物件都要响应某个事...
1.监听者接口using UnityE
using System.Cpublic interface IEventListener
Unity3D中所有控制脚本的基类MonoBehaviour有一些虚函数用于绘制中事件的回调,也可以直接理解为事件函数,例如大家都很清楚的Start,Update等函数,以下做个总结。
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)这两天为解决unity3d与android项目整合中出现的无法监听真机back实体键的问题找了很多资料,网上也有很多人遇到了这个问题,但是似乎都没找到有效的解决方法。 原文地址:http://www.it165.net/pro/html/5.html
实现的效果是从A_Activity跳转到UnityPlayerNativeActivity,传入参数加载对应的三维图,按返回键或home键分别返回上一个activity和返回桌面。默认情况下按home键会返回桌面,但是按back键则无法监听到,没有任何反应。 ===========UnityPlayer相关==============================
UnityPlayer里有三个类,分别是UnityPlayerProxyActivity、UnityPlayerActivity、UnityPlayerNativeActivity。
UnityPlayerProxyActivity用来判断手机的系统版本,从而确定启动UnityPlayerActivity还是UnityPlayerNativeActivity。所以UnityPlayerProxyActivity这个类自己就直接去掉不用了。
UnityPlayerNativeActivity这个类的加载速率据说会比较快,系统版本要求2.3以上,之前也一直用这个类整合使用。但是这两天在使用这个类时一直没法解决实体按键事件的问题,具体可以看下这段介绍: UnityPlayerNativeActivity同样我们可以创建UnityPlayerNativeActivity的子类,这与创建UnityPlayerActivity的子类具有相同的效果,但是会有较小的输入延迟。但是,需要明白的是,NativeActivity是在Gingerbread中引入的(即android 2.3),老的android版本没有这个特性,因为在NativeActivity中,触摸事件都是在native代码中处理的,java视图正常情况下是无法获取这些事件的,不过在unity3d中,有允许将事件传到DalvikVM的转发机制,要应用这个转发机制,必须修改manifest文件如下:view source01.&?xml version="1.0" encoding="utf-8"?&02.&manifest xmlns:android="" package="pany.product"&03.&application android:icon="@drawable/app_icon" android:label="@string/app_name"&04.&activity android:name=".OverrideExampleNative"05.android:label="@string/app_name"06.android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"&07.&meta-data android:name="android.app.lib_name" android:value="unity" /&08.&meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" /&09.&intent-filter&10.&action android:name="android.intent.action.MAIN" /&11.&category android:name="android.intent.category.LAUNCHER" /&12.&/intent-filter&13.&/activity&14.&/application&15.&/manifest&
即使按照上述的xml配置后,进入三维图的UnityPlayerNativeActivity后,除home键外,其他按键都没法监听到。 ======================在Unity中捕捉的常用按钮返回事件=============
另有一种办法是可以在jni脚本文件里监听到实体按键,可以在脚本文件里对按键事件进行处理。不过针对返回键只有一个方法可以调用,即Application.Quit();但是这个方法会退出整个application,按下返回键后,三维图页面退出了,同时其他页面也闪退了,无法返回到上一个activity的页面。view source01.#pragma
strict02.function
Start () {03.}04.function
Update () {05.if(Input.GetKey(KeyCode.Escape)){06.Application.Quit();07.}08.}09.function
OnGUI () {10.}
于是改用UnityPlayerActivity这个类进行尝试,通过测试终于发现可以直接在这个类里监听到按键,但是却无法识别按键。 view source01.//
Pass any keys not handled by (unfocused) views straight to UnityPlayer02.public boolean onKeyMultiple(int keyCode,int count,
KeyEvent event)03.{04.return mUnityPlayer.onKeyMultiple(keyCode,
count,event);05.}06.public boolean onKeyDown(int keyCode,
KeyEvent event)07.{08.return mUnityPlayer.onKeyDown(keyCode,
event);09.}10.public boolean onKeyUp(int keyCode,
KeyEvent event)11.{12.return mUnityPlayer.onKeyUp(keyCode,
event);13.}
只要有按键被按下,这三个方法都能执行,包括音量键等。但是只能监听到按键事件,却无法识别是否按下的是返回键,还是菜单键。加上KeyCode.Escape或者KeyCode.Back都无效,用onBackPressed()方法也仍然无效。网上很多一样的问题,却没有有效的答案。================继承UnityPlayerActivity获取按键事件==================================
找不到确切的解决办法,决定改变思路再尝试下。原先的UnityPlayerActivity保持不变,参数传入的接收和处理仍然在这个类里进行,自己再创建一个类来继承UnityPlayerActivity。测试后发现终于可以识别到按键了,同时正常加载UnityPlayerActivity这个视图。 view source01.public class ExtendActivityextends UnityPlayerActivity02.{03. 04.@Override05.protected void onCreate(Bundle
savedInstanceState)06.{07.super.onCreate(savedInstanceState);08.}09. 10.@Override11.public boolean onKeyDown(int keyCode,
KeyEvent event)12.{13.if(keyCode
== KeyEvent.KEYCODE_BACK)14.{15.finish();16.Log.e("key","key");17.}18.//
TODO Auto-generated method stub19.return super.onKeyDown(keyCode,
event);20.}21.}
既然可以识别到返回键,那么接下来的问题应该就好办了。按照上面的处理后,进入ExtendActivity就等于加载了UnityPlayerActivity,但是按下back键后又出现了原先的问题,三维图退出了,紧接着其他activity也退出了,就跟jni脚本文件里执行Application.Quit()方法的效果一样。(这个还没整明白具体原因)。
=======================通过mUnityPlayer.quit()退出并返回上一个activity==================
于是接着继续测试修改。为UnityPlayerActivity注册了广播接收者,在按下ExtendActivity的back键时发送广播通知UnityPlayerActivity执行finish()方法。修改后发现问题一样,还是无法返回到上一个activity。
正整得头大的时候,又看了遍UnityPlayerActivity类,发现了mUnityPlayer.quit()方法。于是尝试把finish()方法换成mUnityPlayer.quit(),通过退出unityplayer来结束UnityPlayerActivity,没想最后终于成功了。喜大普奔啊。java代码如下:ExtendActivity类view source01.public class ExtendActivityextends UnityPlayerActivity02.{03. 04.@Override05.protected void onCreate(Bundle
savedInstanceState)06.{07.super.onCreate(savedInstanceState);08.}09. 10.@Override11.public boolean onKeyDown(int keyCode,
KeyEvent event)12.{13.if(keyCode
== KeyEvent.KEYCODE_BACK)14.{15.sendBroadcast(new Intent("finish"));16.//
finish();17.Log.e("key","key");18.}19.//
TODO Auto-generated method stub20.return super.onKeyDown(keyCode,
event);21.}22.}UnityPlayerActivity类里添加的方法: view source1.//注册广播接受者2.private void registBroadcast()3.{4.BroadcastReceiver
receiver =new FinishUnityBroadcast();5.IntentFilter
filter =new IntentFilter();6.filter.addAction("finish");7.registerReceiver(receiver,
filter );8.}view source01.//关闭三维图的广播02.class FinishUnityBroadcastextends BroadcastReceiver03.{04.@Override05.public void onReceive(Context context,Intent intent)06.{07.mUnityPlayer.quit();08.}09.}
如果您想留下此文,您可以将其发送至您的邮箱(将同时以邮件内容&PDF形式发送)
相关文章推荐
(Ctrl+Enter提交) &&
已有0人在此发表见解
&在& 00:47收藏到了
&&在信息爆炸的时代,您的知识需要整理,沉淀,积累!Lai18为您提供一个简单实用的文章整理收藏工具,在这里您可以收藏对您有用的技术文章,自由分门别类,在整理的过程中,用心梳理自己的知识!相信,用不了多久,您收藏整理的文章将是您一生的知识宝库!
· 蜀ICP备号-1unity message
时间: 00:07:44
&&&& 阅读:59
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&再用unity进行开发过程中,不可避免的用到消息的传递问题,以下介绍几种消息传递的方法:
(一)拖动赋值
此方法即为最普通的方法,即把需要引用的游戏物体或者需要引用的组件拖动到相关公有变量的槽上,然后就可以引用相关变量或者方法,继而可以进行消息的传递。也可以用Find方法查找到相关游戏物体,然后获取相关组件以及组件上的方法,变量。
(二)采用unity GameObject自带的公用方法
1)public void&BroadcastMessage(string&methodName, object&parameter ,&SendMessageOptions&options)
此方法为调用其本身以及子游戏物体上名为methodName的同名方法,其中parameter 为methodName方法所需要的参数,此方法可以理解为向下发送消息,即向本身以及子游戏物体发送消息
2)public void&SendMessage(string&methodName, object&valuel,&SendMessageOptions&options)
此方法为调用其本身游戏物体上名为methodName的同名方法,其中parameter 为methodName方法所需要的参数,此方法为平行发送消息。
3)public void&SendMessageUpwards(string&methodName, object&value,&SendMessageOptions&options)
此方法为调用其本身以及父类游戏物体上名为methodName的同名方法,其中parameter 为methodName方法所需要的参数,此方法为向上发送消息。
(三)向任意位置发送消息
以上介绍的两种方法都有一定的局限性,在此介绍一种简单的方法,在此需要两个cs文件,分别为Messenger.cs与Callback.cs,相关代码会在后续中给出。通过以下方法进行调用:
Messenger.AddListener("Method1", OnClicked);//将OnClicked方法绑定到"Method1"上
Messenger.Broadcast("Method1");//通过"Method1"调用方法将OnClicked方法绑定到
Messenger.RemoveListener("Method1", OnClicked);//将OnClicked方法从"Method1"移除
泛型方法如下:
Messenger.AddListener&string&("Method1", OnClicked);//将OnClicked方法绑定到"Method1"上
Messenger.Broadcast&string&("Method1","name");//通过"Method1"调用方法将OnClicked方法绑定到
Messenger.RemoveListener&string&("Method1", OnClicked);//将OnClicked方法从"Method1"移除
不过此方法效率很低,不可滥用
(四)通过C#委托
通过C#多播委托可以实现精准消息传递,而且方便快捷,但是要求对中间细节把控较高,尤其是要在适当的位置解除方法绑定
Messenger.cs
* Advanced C# messenger by Ilya Suzdalnitski. V1.0
* Based on Rod Hyde‘s "CSharpMessenger" and Magnus Wolffelt‘s "CSharpMessenger Extended".
* Features:
* Prevents a MissingReferenceException because of a reference to a destroyed message handler.
* Option to log all messages
* Extensive error detection, preventing silent bugs
* Usage examples:
1. Messenger.AddListener&GameObject&("prop collected", PropCollected);
Messenger.Broadcast&GameObject&("prop collected", prop);
2. Messenger.AddListener&float&("speed changed", SpeedChanged);
Messenger.Broadcast&float&("speed changed", 0.5f);
* Messenger cleans up its evenTable automatically upon loading of a new level.
* Don‘t forget that the messages that should survive the cleanup, should be marked with Messenger.MarkAsPermanent(string)
//#define LOG_ALL_MESSAGES
//#define LOG_ADD_LISTENER
//#define LOG_BROADCAST_MESSAGE
#define REQUIRE_LISTENER
using System.Collections.G
using UnityE
static internal class Messenger
#region Internal variables
//Disable the unused variable warning
#pragma warning disable 0414
//Ensures that the MessengerHelper will be created automatically upon start of the game.
static private MessengerHelper messengerHelper = (new GameObject("MessengerHelper")).AddComponent&MessengerHelper&();
#pragma warning restore 0414
static public Dictionary&string, Delegate& eventTable = new Dictionary&string, Delegate&();
//Message handlers that should never be removed, regardless of calling Cleanup
static public List&string& permanentMessages = new List&string&();
#endregion
#region Helper methods
//Marks a certain message as permanent.
static public void MarkAsPermanent(string eventType)
#if LOG_ALL_MESSAGES
Debug.Log("Messenger MarkAsPermanent \t\"" + eventType + "\"");
permanentMessages.Add(eventType);
static public void Cleanup()
#if LOG_ALL_MESSAGES
Debug.Log("MESSENGER Cleanup. Make sure that none of necessary listeners are removed.");
List&string& messagesToRemove = new List&string&();
foreach (KeyValuePair&string, Delegate& pair in eventTable)
bool wasFound = false;
foreach (string message in permanentMessages)
if (pair.Key == message)
wasFound = true;
if (!wasFound)
messagesToRemove.Add(pair.Key);
foreach (string message in messagesToRemove)
eventTable.Remove(message);
static public void PrintEventTable()
Debug.Log("\t\t\t=== MESSENGER PrintEventTable ===");
foreach (KeyValuePair&string, Delegate& pair in eventTable)
Debug.Log("\t\t\t" + pair.Key + "\t\t" + pair.Value);
Debug.Log("\n");
#endregion
#region Message logging and exception throwing
static public void OnListenerAdding(string eventType, Delegate listenerBeingAdded)
#if LOG_ALL_MESSAGES || LOG_ADD_LISTENER
Debug.Log("MESSENGER OnListenerAdding \t\"" + eventType + "\"\t{" + listenerBeingAdded.Target + " -& " + listenerBeingAdded.Method + "}");
if (!eventTable.ContainsKey(eventType))
eventTable.Add(eventType, null);
Delegate d = eventTable[eventType];
if (d != null && d.GetType() != listenerBeingAdded.GetType())
throw new ListenerException(string.Format("Attempting to add listener with inconsistent signature for event type {0}. Current listeners have type {1} and listener being added has type {2}", eventType, d.GetType().Name, listenerBeingAdded.GetType().Name));
static public void OnListenerRemoving(string eventType, Delegate listenerBeingRemoved)
#if LOG_ALL_MESSAGES
Debug.Log("MESSENGER OnListenerRemoving \t\"" + eventType + "\"\t{" + listenerBeingRemoved.Target + " -& " + listenerBeingRemoved.Method + "}");
if (eventTable.ContainsKey(eventType))
Delegate d = eventTable[eventType];
if (d == null)
throw new ListenerException(string.Format("Attempting to remove listener with for event type \"{0}\" but current listener is null.", eventType));
else if (d.GetType() != listenerBeingRemoved.GetType())
throw new ListenerException(string.Format("Attempting to remove listener with inconsistent signature for event type {0}. Current listeners have type {1} and listener being removed has type {2}", eventType, d.GetType().Name, listenerBeingRemoved.GetType().Name));
throw new ListenerException(string.Format("Attempting to remove listener for type \"{0}\" but Messenger doesn‘t know about this event type.", eventType));
static public void OnListenerRemoved(string eventType)
if (eventTable[eventType] == null)
eventTable.Remove(eventType);
static public void OnBroadcasting(string eventType)
#if REQUIRE_LISTENER
if (!eventTable.ContainsKey(eventType))
throw new BroadcastException(string.Format("Broadcasting message \"{0}\" but no listener found. Try marking the message with Messenger.MarkAsPermanent.", eventType));
static public BroadcastException CreateBroadcastSignatureException(string eventType)
return new BroadcastException(string.Format("Broadcasting message \"{0}\" but listeners have a different signature than the broadcaster.", eventType));
public class BroadcastException : Exception
public BroadcastException(string msg)
: base(msg)
public class ListenerException : Exception
public ListenerException(string msg)
: base(msg)
#endregion
#region AddListener
//No parameters
static public void AddListener(string eventType, Callback handler)
OnListenerAdding(eventType, handler);
eventTable[eventType] = (Callback)eventTable[eventType] +
//Single parameter
static public void AddListener&T&(string eventType, Callback&T& handler)
OnListenerAdding(eventType, handler);
eventTable[eventType] = (Callback&T&)eventTable[eventType] +
//Two parameters
static public void AddListener&T, U&(string eventType, Callback&T, U& handler)
OnListenerAdding(eventType, handler);
eventTable[eventType] = (Callback&T, U&)eventTable[eventType] +
//Three parameters
static public void AddListener&T, U, V&(string eventType, Callback&T, U, V& handler)
OnListenerAdding(eventType, handler);
eventTable[eventType] = (Callback&T, U, V&)eventTable[eventType] +
#endregion
#region RemoveListener
//No parameters
static public void RemoveListener(string eventType, Callback handler)
OnListenerRemoving(eventType, handler);
eventTable[eventType] = (Callback)eventTable[eventType] -
OnListenerRemoved(eventType);
//Single parameter
static public void RemoveListener&T&(string eventType, Callback&T& handler)
OnListenerRemoving(eventType, handler);
eventTable[eventType] = (Callback&T&)eventTable[eventType] -
OnListenerRemoved(eventType);
//Two parameters
static public void RemoveListener&T, U&(string eventType, Callback&T, U& handler)
OnListenerRemoving(eventType, handler);
eventTable[eventType] = (Callback&T, U&)eventTable[eventType] -
OnListenerRemoved(eventType);
//Three parameters
static public void RemoveListener&T, U, V&(string eventType, Callback&T, U, V& handler)
OnListenerRemoving(eventType, handler);
eventTable[eventType] = (Callback&T, U, V&)eventTable[eventType] -
OnListenerRemoved(eventType);
#endregion
#region Broadcast
//No parameters
static public void Broadcast(string eventType)
#if LOG_ALL_MESSAGES || LOG_BROADCAST_MESSAGE
Debug.Log("MESSENGER\t" + System.DateTime.Now.ToString("hh:mm:ss.fff") + "\t\t\tInvoking \t\"" + eventType + "\"");
OnBroadcasting(eventType);
if (eventTable.TryGetValue(eventType, out d))
Callback callback = d as C
if (callback != null)
callback();
throw CreateBroadcastSignatureException(eventType);
//Single parameter
static public void Broadcast&T&(string eventType, T arg1)
#if LOG_ALL_MESSAGES || LOG_BROADCAST_MESSAGE
Debug.Log("MESSENGER\t" + System.DateTime.Now.ToString("hh:mm:ss.fff") + "\t\t\tInvoking \t\"" + eventType + "\"");
OnBroadcasting(eventType);
if (eventTable.TryGetValue(eventType, out d))
Callback&T& callback = d as Callback&T&;
if (callback != null)
callback(arg1);
throw CreateBroadcastSignatureException(eventType);
//Two parameters
static public void Broadcast&T, U&(string eventType, T arg1, U arg2)
#if LOG_ALL_MESSAGES || LOG_BROADCAST_MESSAGE
Debug.Log("MESSENGER\t" + System.DateTime.Now.ToString("hh:mm:ss.fff") + "\t\t\tInvoking \t\"" + eventType + "\"");
OnBroadcasting(eventType);
if (eventTable.TryGetValue(eventType, out d))
Callback&T, U& callback = d as Callback&T, U&;
if (callback != null)
callback(arg1, arg2);
throw CreateBroadcastSignatureException(eventType);
//Three parameters
static public void Broadcast&T, U, V&(string eventType, T arg1, U arg2, V arg3)
#if LOG_ALL_MESSAGES || LOG_BROADCAST_MESSAGE
Debug.Log("MESSENGER\t" + System.DateTime.Now.ToString("hh:mm:ss.fff") + "\t\t\tInvoking \t\"" + eventType + "\"");
OnBroadcasting(eventType);
if (eventTable.TryGetValue(eventType, out d))
Callback&T, U, V& callback = d as Callback&T, U, V&;
if (callback != null)
callback(arg1, arg2, arg3);
throw CreateBroadcastSignatureException(eventType);
#endregion
//This manager will ensure that the messenger‘s eventTable will be cleaned up upon loading of a new level.
public sealed class MessengerHelper : MonoBehaviour
void Awake()
DontDestroyOnLoad(gameObject);
//Clean up eventTable every time a new level loads.
public void OnDisable()
Messenger.Cleanup();
Callback.cs
public delegate void Callback();
public delegate void Callback&T&(T arg1);
public delegate void Callback&T, U&(T arg1, U arg2);
public delegate void Callback&T, U, V&(T arg1, U arg2, V arg3);
&标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:/llstart-new0201/p/7512612.html
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!}

我要回帖

更多关于 unity message 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信