using System; using Cysharp.Threading.Tasks; using Extensions; using UnityEngine; public class MessageTest : MonoBehaviour { public void Start() => Test().Forget(); private async UniTask Test() { var messageBroker = new TaskMessageBroker(); messageBroker.Subscribe<TestMessage>(x => { Debug.Log("Receive TestMessage"); return UniTask.CompletedTask; }); messageBroker.Subscribe<ITestMessageInterface>(x => { Debug.Log("Receive ITestMessageInterface"); // こっちが呼ばれる return UniTask.CompletedTask; }); ITestMessageInterface a = new TestMessage(); await messageBroker.PublishAsync(a); } } public interface ITestMessageInterface { } public class TestMessage : ITestMessageInterface { }
こうするとITestMessageInterfaceの方が呼ばれてしまいます。
using System; using Cysharp.Threading.Tasks; using Extensions; using UnityEngine; public class MessageTest : MonoBehaviour { public void Start() => Test().Forget(); private async UniTask Test() { var messageBroker = new TaskMessageBroker(); messageBroker.Subscribe<TestMessage, ITestMessageInterface>(x => { Debug.Log("Receive TestMessage"); return UniTask.CompletedTask; }); ITestMessageInterface a = new TestMessage(); await messageBroker.PublishAsync(a); } } public static class TaskMessageBrokerExtensions { public static IDisposable Subscribe<T1, T2>(this TaskMessageBroker self, Func<T1, UniTask> asyncMessageReceiver) where T1 : T2 { return self.Subscribe<T2>(x => { if (x is T1 t) return asyncMessageReceiver(t); return UniTask.CompletedTask; }); } } public interface ITestMessageInterface { } public class TestMessage : ITestMessageInterface { }
こんな感じのExtensionを書いてSubscribe側で工夫してあげましょう。