Unity (5.x) 学习笔记 - 广播消息

ps: 这种方式在实践中得知,效率太低,简单项目可以考虑使用单例存储或读取数据,复杂项目可以考虑使用 UniRx(github)。

Unity 中广播消息的方法有三个,SendMessageBroadcastMessageSendMessageUpwards。学习一下用法和区别。

区别

先假设有这样一个游戏对象结构,Root 上挂载了 n 个组件。他子级的游戏对象都挂载 1 个组件。所有组件都含有一个名为 Foo 的方法。

- Root

    - Middle0
    
        - Child0
        - Child1
        
    - Middle1
    
        - Child0
void Foo (string message) {
    Debug.Log(message);
}

ps: 如何在 Root 中添加一个 Middle0 游戏对象?

// 创建游戏对象
GameObject middle0 = new GameObject("Middle0");

// 添加组件
middle0.AddComponent();

// 放到 Root 中
middle0.transform.parent = transform;

SendMessage

游戏对象为自己身上不同组件发送消息

当 Root 上某一个组件调用了 SendMessage("Foo", "Root Send Message") 时,所有 n 个组件中的 Foo 函数都会被调用。


BroadcastMessage

向子级广播消息

Middle0 使用此方法时,Middle0 和它子级 Child0,Child1 中的 Foo 会被触发。触发3个函数;

Root 使用该方法则触发 n + 6 个函数。


SendMessageUpwards

向父级发送消息

Middle1 中的 Child0 使用该方法时,Middle1-Child0 和父级 Middle1,Root 上所有组件上的 Foo 函数都会被触发。共触发 n + 2 次;


参数

这三个方法拥有同样形式的参数,用 SendMessage 举例。

// 两个参数
public void SendMessage(
    string methodName, 
    SendMessageOptions options
);

// 三个参数
public void SendMessage (
    string methodName, 
    object parameter = null, 
    SendMessageOptions options = SendMessageOptions.RequireReceiver
);
参数 类型
methodName string 被触发方法名,"Foo"
parameter object 被触发函数接收的参数,"Root Send Message"
options SendMessageOptions 包含两个静态属性,
- 设置为 SendMessageOptions.RequireReceiver(既默认情况),当没有 Foo 函数被触发时,Unity 会报错

- 设置为 SendMessageOptions.DontRequireReceiver,没有 Foo 函数被触发不会报错

注意

写方法名的时候不要嫌长,要不然会被莫名其妙地触发。前面可以加个类似 receive 前缀啥的。

你可能感兴趣的:(Unity (5.x) 学习笔记 - 广播消息)