Unity
UniRx

UniRx.MessageBroker活用術

UniRx.MessageBrokerを日々 悪用 活用してるので、便利かも!って作ったクラスを公開しておきます。

TypedMessageBroker

MessageBrokerのPublish/Subscribeに型で制限をつける。

用途

  • Brokerがたくさんあるので、送り先を間違えるのを防ぐ。

サンプル

public void Start()
{
    var broker1 = new TypedMessageBroker<IMessageType>();

    broker1.Publish(new Message1());
    // broker1.Publish(new Message2()); // IMessageTypeじゃないのでビルドエラー
}

public interface IMessageType {}
public class Message1 : IMessageType {}
public class Message2 {}

コード

https://github.com/kyubuns/UniRxSandbox/blob/master/Assets/TypedMessageBroker/TypedMessageBroker.cs

QueueAsyncMessageBroker

PublishしたMessageの処理が全て終わるまで、次のMessageのPublishを待つ。

用途

  • アニメーション処理を全部Publishしておいたら良い感じに再生される

サンプル

var broker = new QueueAsyncMessageBroker();

broker.Subscribe<Message>(x => Observable.Timer(TimeSpan.FromSeconds(x.Value)).AsUnitObservable()).AddTo(this);
broker.Subscribe<Message>(x =>
{
    Debug.Log($"{Time.time} Receive Message {x.Value}");
    return Observable.ReturnUnit();
}).AddTo(this);

broker.Publish(new Message(3));
broker.Publish(new Message(1));
broker.Publish(new Message(2));
0 Receive Message 3
3 Receive Message 1
4 Receive Message 2

コード

https://github.com/kyubuns/UniRxSandbox/blob/master/Assets/QueueMessageBroker/QueueAsyncMessageBroker.cs

欠点

  • Subscribeの中で例外吐いた時にcall stackが死んでる