GameDev.CoreSystems/Architecture/ScriptableObjects/Variables/BaseVariable.cs

154 lines
4.0 KiB
C#

using UnityEngine;
using UnityEngine.Events;
namespace ScriptableObjectArchitecture
{
public abstract class BaseVariable : GameEventBase
{
public abstract bool IsClamped { get; }
public abstract bool Clampable { get; }
public abstract bool ReadOnly { get; }
public abstract System.Type Type { get; }
public abstract object BaseValue { get; set; }
}
public abstract class BaseVariable<T> : BaseVariable
{
public virtual T Value
{
get
{
return _value;
}
set
{
_value = SetValue(value);
Raise();
}
}
public virtual T MinClampValue
{
get
{
if(Clampable)
{
return _minClampedValue;
}
else
{
return default(T);
}
}
}
public virtual T MaxClampValue
{
get
{
if(Clampable)
{
return _maxClampedValue;
}
else
{
return default(T);
}
}
}
public override bool Clampable { get { return false; } }
public override bool ReadOnly { get { return _readOnly; } }
public override bool IsClamped { get { return _isClamped; } }
public override System.Type Type { get { return typeof(T); } }
public override object BaseValue
{
get
{
return _value;
}
set
{
_value = SetValue((T)value);
Raise();
}
}
[SerializeField]
protected T _value = default(T);
[SerializeField]
private bool _readOnly = false;
[SerializeField]
private bool _raiseWarning = true;
[SerializeField]
protected bool _isClamped = false;
[SerializeField]
protected T _minClampedValue = default(T);
[SerializeField]
protected T _maxClampedValue = default(T);
public virtual T SetValue(BaseVariable<T> value)
{
return SetValue(value.Value);
}
public virtual T SetValue(T value)
{
if (_readOnly)
{
RaiseReadonlyWarning();
return _value;
}
else if(Clampable && IsClamped)
{
return ClampValue(value);
}
return value;
}
protected virtual T ClampValue(T value)
{
return value;
}
private void RaiseReadonlyWarning()
{
if (!_readOnly || !_raiseWarning)
return;
Debug.LogWarning("Tried to set value on " + name + ", but value is readonly!", this);
}
public override string ToString()
{
return _value == null ? "null" : _value.ToString();
}
public static implicit operator T(BaseVariable<T> variable)
{
return variable.Value;
}
}
public abstract class BaseVariable<T, TEvent> : BaseVariable<T> where TEvent : UnityEvent<T>
{
[SerializeField]
private TEvent _event = default;
public override T SetValue(T value)
{
T oldValue = _value;
T newValue = base.SetValue(value);
if (!newValue.Equals(oldValue))
_event.Invoke(newValue);
return newValue;
}
public void AddListener(UnityAction<T> callback)
{
_event.AddListener(callback);
}
public void RemoveListener(UnityAction<T> callback)
{
_event.RemoveListener(callback);
}
public override void RemoveAll()
{
base.RemoveAll();
_event.RemoveAllListeners();
}
}
}