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的方法 -- 若有一个是有方法在声明的类中没有被使用,那正常情况下都会把它认为是废代码从而删除,这时隐患就出现了

猜你喜欢

转载自blog.csdn.net/qq_42672770/article/details/124172827
今日推荐