using System; using System.Collections.Generic; using UnityEngine.Events; namespace OmiLAXR.TrackingBehaviours { public interface ITrackingBehaviourEvent { void UnbindAll(); void ClearActions(); void Dispose(); void Mute(); bool IsDisabled { get; set; } } public class TrackingBehaviourEvent : ITrackingBehaviourEvent { public readonly List Actions = new List(); public event TrackingBehaviourAction Action; private Dictionary _unityBinds = new Dictionary(); public bool IsDisabled { get; set; } = false; public void AddHandler(TrackingBehaviourAction action) { Action += action; Actions.Add(action); } public void Invoke(ITrackingBehaviour owner) { if (IsDisabled) return; Action?.Invoke(owner); } public void ClearActions() { foreach (var a in Actions) { Action -= a; } Actions.Clear(); } public void Dispose() { UnbindAll(); ClearActions(); } public void Mute() { IsDisabled = true; } public void Unmute() { IsDisabled = false; } public void Bind(UnityEvent unityEvent, ITrackingBehaviour owner) => Bind(unityEvent, () => Invoke(owner)); public void Bind(UnityEvent unityEvent, UnityAction invoker) { #if UNITY_2020 || UNITY_2019 if (!_unityBinds.ContainsKey(unityEvent)) _unityBinds.Add(unityEvent, invoker); #else if (!_unityBinds.TryAdd(unityEvent, invoker)) return; #endif unityEvent.AddListener(invoker); } public void Unbind(UnityEvent unityEvent) { unityEvent.RemoveListener(_unityBinds[unityEvent]); _unityBinds.Remove(unityEvent); } public void UnbindAll() { foreach (var ev in _unityBinds.Keys) { ev.RemoveListener(_unityBinds[ev]); } _unityBinds.Clear(); } } public class TrackingBehaviourEvent : ITrackingBehaviourEvent { public readonly List> Actions = new List>(); public event TrackingBehaviourAction Action; private Dictionary _unityBinds = new Dictionary(); public bool IsDisabled { get; set; } = false; public void AddHandler(TrackingBehaviourAction action) { Action += action; Actions.Add(action); } public void Invoke(ITrackingBehaviour owner, T arg) { if (IsDisabled) return; Action?.Invoke(owner, arg); } public void ClearActions() { foreach (var a in Actions) { Action -= a; } Actions.Clear(); } public void Dispose() { ClearActions(); UnbindAll(); } public void Bind(UnityEvent unityEvent, ITrackingBehaviour owner, T arg) => Bind(unityEvent, () => Invoke(owner, arg)); public void Bind(UnityEvent unityEvent, UnityAction invoker) { #if UNITY_2020 || UNITY_2019 if (!_unityBinds.ContainsKey(unityEvent)) _unityBinds.Add(unityEvent, invoker); #else if (!_unityBinds.TryAdd(unityEvent, invoker)) return; #endif unityEvent.AddListener(invoker); } public void Unbind(UnityEvent unityEvent) { unityEvent.RemoveListener(_unityBinds[unityEvent]); _unityBinds.Remove(unityEvent); } public void Mute() { IsDisabled = true; } public void Unmute() { IsDisabled = false; } public void UnbindAll() { foreach (var ev in _unityBinds.Keys) { ev.RemoveListener(_unityBinds[ev]); } _unityBinds.Clear(); } } public class TrackingBehaviourEvent : ITrackingBehaviourEvent { public readonly List> Actions = new List>(); public event TrackingBehaviourAction Action; private Dictionary, UnityAction> _unityBinds = new Dictionary, UnityAction>(); private Dictionary, Action> _actionBinds = new Dictionary, Action>(); public bool IsDisabled { get; set; } = false; public int HandlerCount => Actions.Count; public void AddHandler(TrackingBehaviourAction action) { Action += action; Actions.Add(action); } public void Invoke(ITrackingBehaviour owner, TSender sender, TValue value) { if (IsDisabled) return; Action?.Invoke(owner, sender, value); } public void Mute() { IsDisabled = true; } public void Unmute() { IsDisabled = false; } public void ClearActions() { foreach (var a in Actions) { Action -= a; } Actions.Clear(); } public void Dispose() { UnbindAll(); ClearActions(); } public void Bind(UnityEvent unityEvent, UnityAction invoker) { #if !UNITY_2021_1_OR_NEWER if (!_unityBinds.ContainsKey(unityEvent)) _unityBinds.Add(unityEvent, invoker); #else if (!_unityBinds.TryAdd(unityEvent, invoker)) return; #endif unityEvent.AddListener(invoker); } public void Unbind(UnityEvent unityEvent) { unityEvent.RemoveListener(_unityBinds[unityEvent]); _unityBinds.Remove(unityEvent); } public void Bind(Action action, Action invoker) { #if !UNITY_2021_1_OR_NEWER if (!_actionBinds.ContainsKey(action)) _actionBinds.Add(action, invoker); #else if (!_actionBinds.TryAdd(action, invoker)) return; #endif action += invoker; } public void Unbind(Action action) { action -= _actionBinds[action]; _actionBinds.Remove(action); } public void UnbindAll() { foreach (var ev in _unityBinds.Keys) { ev.RemoveListener(_unityBinds[ev]); } _unityBinds.Clear(); void unbind(Action action) { action -= _actionBinds[action]; } foreach (var ev in _actionBinds.Keys) { unbind(ev); } _actionBinds.Clear(); } } public class TrackingBehaviourEvent : ITrackingBehaviourEvent { public readonly List> Actions = new List>(); public event TrackingBehaviourAction Action; private Dictionary, UnityAction> _unityBinds = new Dictionary, UnityAction>(); private Dictionary, Action> _actionBinds = new Dictionary, Action>(); public bool IsDisabled { get; set; } = false; public void AddHandler(TrackingBehaviourAction action) { Action += action; Actions.Add(action); } public void Invoke(ITrackingBehaviour owner, TSender sender, TValue value, TArgs args) { if (IsDisabled) return; Action?.Invoke(owner, sender, value, args); } public void Mute() { IsDisabled = true; } public void Unmute() { IsDisabled = false; } public void ClearActions() { foreach (var a in Actions) { Action -= a; } Actions.Clear(); } public void Dispose() { UnbindAll(); ClearActions(); } public void Bind(Action action, Action invoker) { #if !UNITY_2021_1_OR_NEWER if (!_actionBinds.ContainsKey(action)) _actionBinds.Add(action, invoker); #else if (!_actionBinds.TryAdd(action, invoker)) return; #endif action += invoker; } public void Unbind(Action action) { action -= _actionBinds[action]; _actionBinds.Remove(action); } public void Bind(UnityEvent unityEvent, UnityAction invoker) { #if !UNITY_2021_1_OR_NEWER if (!_unityBinds.ContainsKey(unityEvent)) _unityBinds.Add(unityEvent, invoker); #else if (!_unityBinds.TryAdd(unityEvent, invoker)) return; #endif unityEvent.AddListener(invoker); } public void Unbind(UnityEvent unityEvent) { unityEvent.RemoveListener(_unityBinds[unityEvent]); _unityBinds.Remove(unityEvent); } public void UnbindAll() { foreach (var ev in _unityBinds.Keys) { ev.RemoveListener(_unityBinds[ev]); } _unityBinds.Clear(); void unbind(Action action) { action -= _actionBinds[action]; } foreach (var ev in _actionBinds.Keys) { unbind(ev); } _actionBinds.Clear(); } } }