using System.Linq; using UnityEngine; using UnityEngine.Events; using CleverCrow.Fluid.Utilities.UnityEvents; namespace CleverCrow.Fluid.Databases { /// /// Triggers the proper event on `Start()` and triggers the opposite event if the variable changes value /// public class GlobalBoolMonitor : MonoBehaviour { private GlobalBoolMonitorInternal _internal; [SerializeField] private KeyValueDefinitionBool[] _booleans = new KeyValueDefinitionBool[1]; [SerializeField] private UnityEvent _eventTrue = new UnityEvent(); [SerializeField] private UnityEvent _eventFalse = new UnityEvent(); private void Start () { var copies = _booleans.Select(Instantiate).ToArray>(); _internal = new GlobalBoolMonitorInternal( GlobalDatabaseManager.Instance.Database, copies); _internal.EventTrue.AddListener(_eventTrue.Invoke); _internal.EventFalse.AddListener(_eventFalse.Invoke); _internal.UpdateEvent(); _internal.BindChangeMonitor(); } private void OnDestroy () { if (!GlobalDatabaseManager.IsInstance) return; _internal?.UnbindChangeMonitor(); } } public class GlobalBoolMonitorInternal { private readonly IDatabaseInstance _database; private readonly IKeyValueDefinition[] _definitions; public IUnityEvent EventTrue { get; } = new UnityEventPlus(); public IUnityEvent EventFalse { get; } = new UnityEventPlus(); public GlobalBoolMonitorInternal (IDatabaseInstance database, IKeyValueDefinition[] definitions) { _database = database; _definitions = definitions; } public void UpdateEvent () { var isTrue = true; foreach (var definition in _definitions) { if (!_database.Bools.Get(definition.Key, definition.DefaultValue)) { isTrue = false; } } if (isTrue) { EventTrue.Invoke(); } else { EventFalse.Invoke(); } } public void BindChangeMonitor () { foreach (var definition in _definitions) { _database.Bools.AddKeyListener(definition.Key, BindMethod); } } private void BindMethod (bool value) { UpdateEvent(); } public void UnbindChangeMonitor () { foreach (var definition in _definitions) { _database.Bools.RemoveKeyListener(definition.Key, BindMethod); } } } }