Unity中的SendMessage方法

本文详细介绍了Unity中的 SendMessage、BroadcastMessage 和 SendMessageUpwards 方法,用于向 GameObject 发送消息执行特定功能。尽管它们使用简单,但存在效率低下和过度依赖反射等问题,可能导致性能影响和维护困难。建议在不考虑性能的中小型项目中谨慎使用,并推荐使用委托等替代方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值