Files
Infratest/Assets/Code/Infrastructure/EventBus/EventBus.cs
T
2026-01-26 13:29:35 +03:00

68 lines
2.2 KiB
C#

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