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);
}
}
}
}
}