消息推送机制SendMessage

最后更新于 2022-10-29 385 次阅读


SendMessage是一种可以实现调用自身组件函数的方法,它实现的是一种伪监听者模式,利用的是反射机制。

  • 发送给自身的所有脚本 (只发给自身所有脚本)
    SendMessage("方法名称");
  • 发送给自身的所有脚本以及自身父物体,父物体的父物体等身上所有脚本 (发给自己和父物体,及父物体的父物体 往上调用)
    SendMessageUpwards("方法名称");
  • 还有发给自己和子物体,及子物体的子物体,往下调用。
    BroadcastMessage("方法名称");

扩展

  • 需要方法传值的情况(实验发现只能传单值)
void Start()
{
    SendMessage("GetMessage","kjdkaojdkaidawdaw");
}

private void GetMessage(string tmp)
{
    Debug.Log("SendMessageTest,自身脚本,private" + tmp);
}
  • 传多值的情况(使用object[] 存储方法值)
private string a = "2222dwadad";
private int b = 32323;
private double c = 2.3445;

private object[] _obj;
void Start()
{
    _obj = new object[] {a, b, c};
    
    SendMessage("GetMessage",_obj);
}

private void GetMessage(object[] objects)
{
    Debug.Log("SendMessageTest,自身脚本,private"+objects[0] + objects[1] + objects[2]);
}
  • 通过使用零参数,该接收方法可选择忽略此参数。 如果选项设置为SendMessageOptions.RequireReceiver,则在任何组件均未拾取此消息时输出错误。
SendMessage("GetMessage",SendMessageOptions.RequireReceiver);
  • 不会将消息发送到非活动对象(即,在 Editor 中或使用 SetActive 函数已停用的对象)。