一、介绍
SendMessage是Unity提供的一个方法,用于在游戏对象及其子对象之间发送消息。
允许脚本对象在不直接引用其他脚本的情况下相互通信;
1、查找方法
SendMessage会在调用它的游戏对象及其所有子对象上查找指定的方法。
2、调用方法
如果找到了指定的方法,SendMessage会调用这些方法;如果找到多个相同名称的方法,所有这些方法都会被调用; 如果传递了参数,参数会被传递给方法。
3、异常处理
如果指定了 SendMessageOptions.RequireReceiver 且没有找到方法,会抛出MissingMethodException。
如果没有指定 SendMessageOptions.RequireReceiver 且没有找到方法,不会抛出异常。
//SendMessage,向父/子对象发送消息
//[方法名,参数(可选),消息传递的行为(可选)]
SendMessage(string methodName, [object value = null], [SendMessageOptions options = SendMessageOptions.RequireReceiver]);
如:
//1、告诉父物体执行什么方法;
transform.parent.SendMessage("方法名");
//1、告诉父物体执行什么方法;2、如果没有找到方法,不抛出异常;
transform.parent.SendMessage("方法名", SendMessageOptions.DontRequireReceiver);
//1、告诉父物体执行什么方法;2、并传递方法需要的参数;
transform.parent.SendMessage("方法名",参数);
//1、告诉父物体执行什么方法;2、并传递方法需要的参数;3、如果没有找到方法,抛出异常;
transform.parent.SendMessage("方法名",参数,SendMessageOptions.RequireReceiver);
例:
//自身是GearSlot,父物体的父物体是GearPanel
protected override void ClickItemByMouseRight()
{
if(!IsEmpty()&&!inventoryMgr.IsPicked)
{
var data = item.selfData;
... ...
//GearPanel.Instance.GearPanelPutOff(data);//常规方法调用
transform.parent.parent.SendMessage("GearPanelPutOff", data);//SendMessage,向父/子对象发送消息
}
}
二、优缺点
1、优点
- 简单易用:SendMessage方法简单易用,可以快速实现消息传递。
- 灵活性:可以向父对象或子对象发送消息,适用于简单的通信需求。
2、缺点
- 性能问题:SendMessage方法在运行时查找方法,可能会带来一定的性能开销,尤其是在频繁调用的情况下。
- 可读性差:使用SendMessage可能会使代码的可读性和可维护性降低,因为方法调用关系不明确。
- 类型安全:SendMessage不是类型安全的,如果父对象没有对应的方法或参数,运行时会抛出异常。
三、改进建议
为了提高代码的性能、可读性和类型安全性,可以考虑以下替代方案
1、使用事件(Event)
使用事件可以提高代码的可读性和类型安全性。
2、使用接口(Interface)
定义一个接口,父对象实现该接口。
3、直接调用方法
如果父对象是已知的,可以直接调用父对象的方法。