Unity中的SendMessage方法

Posted Peter_Gao_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity中的SendMessage方法相关的知识,希望对你有一定的参考价值。

 本质就是调用那个GameObject里面的Script里面的函数,可以跨语言的,例如javascript可以调用C#的函数。
如果GameObject本身有两个脚本,例如“Move1.c#”和“Move2.js”,两个脚本内有同名函数例如“DoMove()”,会两个函数都执行一次。

方法名:需要接收消息gameobject挂载脚本上的方法名,无视访问权限, 能够调用private的方法

参数:object类型,单值,多值传数组,同理接收方参数列表页应为数组。
//参数注意事项:就算没有对应参数列表的方法,还是会调用同名的方法,所以SendMessage不是寻找函数签名,只是寻找函数名提示信息为枚举类型:
 

SendMessage还有两个同类型方法
BroadcastMessage,SendMessageUpwards。
用法相同只是作用范围不同

BroadcastMessage自身脚本以及子物体挂载的脚本。
SendMessageUpwards自身脚本以及父物体挂载的脚本。

一、功能:用于向某个GameObject发送一条信息,让它完成特定功能。

1、执行GameObject自身的Script中“函数名”的函数
SendMessage ("函数名",参数,SendMessageOptions) 

2、执行自身和子节点GamgeObject的Script中“函数名”的函数
BroadcastMessage ("函数名",参数,SendMessageOptions) 

3、自身和父节点GamgeObject的Script中“函数名”的函数
SendMessageUpwards ("函数名",参数,SendMessageOptions) 

 
二、SendMessageOptions参数:

 

提示信息可以省略不写,默认为RequireReceiver。

1、如果没有脚本接收,没有找到相应函数,会报错(默认是这个状态), 抛出异常
SendMessageOptions.RequireReceiver 

2、即使没有找到相应函数,也不会报错,自动忽略
SendMessageOptions.DontRequireReceiver 

SendMessage系列用起来都比较简单,但是效率低下(见https://www.cnblogs.com/chenliyang/p/6558680.html)所以基本很少看到有人用。对于各种架构类型SendMessage基本都比不上委托等用法,对于一些中小型不需要考虑性能的程序可以考虑使用(作为一个小型的MVC事件收发),在此不做深入研究,总体上食之无味弃之不可惜,建议小伙伴们不要使用。

缺点如下(参考https://www.cnblogs.com/FudgeBear/p/10367495.html):
  过于依赖反射机制(reflection)来查找消息对应的被调用函数
  1. 频繁使用反射会影响性能
  2. 更会大大增加代码的维护成本 -- 字符串标识对应方法
  3. 无视访问权限, 能够调用private的方法 -- 若有一个是有方法在声明的类中没有被使用,那正常情况下都会把它认为是废代码从而删除,这时隐患就出现了

Unity3d中SendMessage 用法

Message相关有3条指令:
SendMessage ("函数名",参数,SendMessageOptions) //GameObject自身的Script
BroadcastMessage ("函数名",参数,SendMessageOptions)  //自身和子Object的Script
SendMessageUpwards ("函数名",参数,SendMessageOptions)  //自身和父Object的Script
用于向某个GameObject发送一条信息,让它完成特定功能。
其实本质是调用那个GameObject里面的Script里面的函数,可以跨语言的,例如Javascript可以调用C#的函数,我已实验成功。
☆另外,如果GameObject本身有两个脚本,例如“move1”和“move2”,两个脚本内有同名函数例如“moveMe()”,会两个函数都执行一次。

第三个参数使用:
SendMessageOptions.RequireReceiver //如果没有找到相应函数,会报错(默认是这个状态)
SendMessageOptions.DontRequireReceiver //即使没有找到相应函数,也不会报错,自动忽略

  1. //test01.js
  2. function playTest(n:int)
  3. {
  4. print("test01 play!!!!!No."+n);
  5. }

 

  1. //testMessage.js 
  2. var objA:GameObject;
  3. var n=0;
  4. function Update()
  5. {
  6. n++;
  7. objA.SendMessage("playTest",n);
  8. }

以上是关于Unity中的SendMessage方法的主要内容,如果未能解决你的问题,请参考以下文章

unity 中 SendMessage用法

Unity 关于SendMessage的用法

Unity3d中SendMessage 用法

Unity,WebGL, 页面JS调用Unity方法

unity —脚本优化— 消息处理系统

unity中三种调用其他脚本函数的方法