Unity开发——SendMessage向父/子对象发送消息

一、介绍

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、直接调用方法

如果父对象是已知的,可以直接调用父对象的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值