MessagePipe を Unity Test で使用してみる
MessagePipeが巷で話題になってきています。
自分のプロジェクトでは自分が作成したイベント発行クラス↓
を使っていましたが、あのCyshapが作成したライブラリ!!!
使わない選択肢がないということで使ってみました。
まずは触りだけ
Unityで使用する上で
まずはパッケージをインストールします。
通常のパッケージとあわせて VContainer, Zenject を選ぶ選択肢があります。
MessagePipeはDIContainerと連携しているということで、自分のプロジェクトがVContainerかZenjectどちらを使用しているかによって追加でパッケージをインストール。
(UniTaskも必須
最少実行
using NUnit.Framework; using Zenject; using Assert = UnityEngine.Assertions.Assert; using MessagePipe; using UnityEngine; namespace { public class SimpleTest { // メッセーシを送る側 public class MessageService { // Zenjectによって自動的にInject [Inject] private IPublisher<string> _pubLisher; public void Send(string message) { _pubLisher.Publish(message); } } // メッセージを受け取る側 public class MessageHub : System.IDisposable { // Zenjectによって自動的にInject [Inject] private ISubscriber<string> _subscriber; private System.IDisposable disposable; public void Setup() { var bag = DisposableBag.CreateBuilder(); _subscriber.Subscribe(x => Debug.Log(x)).AddTo(bag); disposable = bag.Build(); } void System.IDisposable.Dispose() { disposable.Dispose(); } } private DiContainer _contaier; [SetUp] public void Setup() { _contaier = new DiContainer(); } // メッセージを送れるかテスト [Test] public void Test1() { InstallBindings(_contaier); var hub = _contaier.Instantiate<MessageHub>(); hub.Setup(); var service = _contaier.Instantiate<MessageService>(); // Testという文字列をを送る service.Send("Test"); } private void InstallBindings(DiContainer builder) { var options = builder.BindMessagePipe(); // 使用するためにはDiContainerにバインドをしなければならない builder.BindMessageBroker<string>(options); } } }
他のMessagePipeの記事を挙げられている方を参考に。
一旦このテストコードでメッセージを送られることを確認しました
処理順序は
builder.BindMessageBroker<string>(options);
で string型のメッセージを送信/受信できるようにする- MessageHub, MessageService を Zenjectから生成しBindしてもらう。
- あとは文字列を送ると MessageHub の
_subscriber.Subscribe(x => Debug.Log(x)).AddTo(bag);
Subscribeで受け取る
一旦最少コードは理解できたので次は上記コードの謎を少しずつ解消していこうと思います!