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 //即使没有找到相应函数,也不会报错,自动忽略
- //test01.js
- function playTest(n:int)
- {
- print("test01 play!!!!!No."+n);
- }
- //testMessage.js
- var objA:GameObject;
- var n=0;
- function Update()
- {
- n++;
- objA.SendMessage("playTest",n);
- }
以上是关于Unity中的SendMessage方法的主要内容,如果未能解决你的问题,请参考以下文章