[System.Serializable]
public class PropertyChangedSubscriber<T> : MonoBehaviour where T : struct
{
[SerializeField]
private GenericReference<T> _value;
[SerializeField]
private UnityEvent<object,PropertyChangedEventArgs<T>> _response;
void OnEnable() {
_value.PropertyChangedEventHandler += PropertyChanged;
}
void OnDisable() {
_value.PropertyChangedEventHandler -= PropertyChanged;
}
private void PropertyChanged(object sender, PropertyChangedEventArgs<T> e) {
_response.Invoke(sender,e);
}
}
[System.Serializable]
public class IntPropertyChangedSubscriber : PropertyChangedSubscriber<int> { }
public class GenericReference<T> : ScriptableObject where T : struct {
[SerializeField]
private T _value;
[SerializeField]
private T _constantValue;
[SerializeField]
private bool _isConstant;
public event EventHandler<PropertyChangedEventArgs<T>> PropertyChangedEventHandler;
public T Value
{
get { return _isConstant ? _constantValue : _value; }
set
{
if (!_isConstant) {
var oldValue = _value;
_value = value;
PropertyChangedEventHandler(this, new PropertyChangedEventArgs<T> { OldValue = oldValue, NewValue = _value });
}
else {
_value = _constantValue;
}
}
}
}
I use IntPropertyChangedSubscriber but can not serialize fields.