using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace MoreMountains.Tools { /// /// This struct lets you declare observable properties. /// For example, let's say you have a class called Character, and you declare its speed like so : /// /// public MMObservable Speed; /// /// then, in any other class, you can register to OnValueChanged events on that property (usually in OnEnable) : /// /// protected virtual void OnEnable() /// { /// _myCharacter.Speed.OnValueChanged += OnSpeedChange; /// } /// /// and unsubscribe like so : /// /// protected virtual void OnDisable() /// { /// _myCharacter.Speed.OnValueChanged -= OnSpeedChange; /// } /// /// and then all you need is a method to handle that speed change : /// /// protected virtual void OnSpeedChange() /// { /// Debug.Log(_myCharacter.Speed.Value); /// } /// /// You can look at the MMObservableTest demo scene for an example of how it's used. /// /// /// public struct MMObservable { public Action OnValueChanged; public Action OnValueChangedTo; public Action OnValueChangedFromTo; private T _value; public T Value { get { return _value; } set { if (!EqualityComparer.Default.Equals(value, _value)) { var prev = _value; _value = value; OnValueChanged?.Invoke(); OnValueChangedTo?.Invoke(_value); OnValueChangedFromTo?.Invoke(prev,_value); } } } } }