using System; using System.Reactive.Subjects; using UnityEngine; namespace Chernobyl.Unity.Event { /// /// An asset that acts as a source of events. /// public interface IEventSource { /// /// The event to be triggered. /// IObservable Observable { get; } } /// /// Interface for subject of events. /// public interface IEventSubject { /// /// The subject of the events. /// ISubject Subject { get; } } /// /// An asset that acts as a source of events. /// public abstract class BaseEventSource : ScriptableObject, IEventSource, IEventSubject { /// protected BaseEventSource() : this(new Subject()) {} /// protected BaseEventSource(ISubject subject) => Subject = subject; /// /// The event to be triggered. /// public IObservable Observable => Subject; /// /// The subject of the events. /// public ISubject Subject { get; } } }