using System; using System.Collections.Generic; using Cysharp.Threading.Tasks; using UnityEngine; namespace Code.Infrastructure.EventBus { public class EventBus { private Dictionary> s_Subscribers = new(); public void Subscribe(IGlobalSubscriber subscriber) { List subscriberTypes = EventBusHelper.GetSubscriberTypes(subscriber); foreach (Type t in subscriberTypes) { if (!s_Subscribers.ContainsKey(t)) { s_Subscribers[t] = new SubscribersList(); } s_Subscribers[t].Add(subscriber); } } public void Unsubscribe(IGlobalSubscriber subscriber) { List subscriberTypes = EventBusHelper.GetSubscriberTypes(subscriber); foreach (Type t in subscriberTypes) { if (s_Subscribers.ContainsKey(t)) s_Subscribers[t].Remove(subscriber); } } public void RaiseEvent(Action action) where TSubscriber : class, IGlobalSubscriber { if (!s_Subscribers.ContainsKey(typeof(TSubscriber))) return; SubscribersList subscribers = s_Subscribers[typeof(TSubscriber)]; subscribers.Executing = true; InvokeSubscribers(action, subscribers); subscribers.Executing = false; subscribers.Cleanup(); } private void InvokeSubscribers(Action action, SubscribersList subscribers) where TSubscriber : class, IGlobalSubscriber { for ( int i = 0; i < subscribers.List.Count; i++) { Debug.Log("Invoking " + typeof(TSubscriber).Name); IGlobalSubscriber subscriber = subscribers.List[i]; try { action.Invoke(subscriber as TSubscriber); } catch (Exception e) { Debug.LogError(e); } } } } }