using UnityEngine; namespace MalbersAnimations.Scriptables { /// Vector2 Scriptable Variable. Based on the Talk - Game Architecture with Scriptable Objects by Ryan Hipple [CreateAssetMenu(menuName = "Malbers Animations/Variables/Vector2",order = 1000)] public class Vector2Var : ScriptableVar { /// The current value [SerializeField] private Vector2 value = Vector2.zero; /// Value of the Float Scriptable variable public virtual Vector2 Value { get => value; set { this.value = value; #if UNITY_EDITOR if (debug) Debug.Log($"{name} -> [ {value} ] ", this); #endif } } public float x { get => value.x; set => this.value.x = value; } public float y { get => value.y; set => this.value.y = value; } public void SetValue(Vector2Var var) => Value = var.Value; public void SetX(float var) => value.x = var; public void SetY(float var) => value.y = var; public static implicit operator Vector2(Vector2Var reference) => reference.Value; } [System.Serializable] public class Vector2Reference : ReferenceVar { public Vector2 ConstantValue = Vector2.zero; [RequiredField] public Vector2Var Variable; public Vector2Reference() { UseConstant = true; ConstantValue = Vector2.zero; } public Vector2Reference(bool variable) { UseConstant = !variable; if (!variable) { ConstantValue = Vector2.zero; } else { Variable = ScriptableObject.CreateInstance(); Variable.Value = Vector2.zero; } } public Vector2Reference(Vector2 value) => Value = value; public Vector2Reference(float x, float y) { UseConstant = true; Value = new Vector2(x, y); } public Vector2 Value { get => UseConstant ? ConstantValue : Variable.Value; set { if (UseConstant) ConstantValue = value; else Variable.Value = value; } } public float x { get => UseConstant ? ConstantValue.x : Variable.Value.x; set { if (UseConstant) ConstantValue.x = value; else Variable.x = value; } } public float y { get => UseConstant ? ConstantValue.y : Variable.Value.y; set { if (UseConstant) ConstantValue.y = value; else Variable.y = value; } } #region Operators public static implicit operator Vector2(Vector2Reference reference) => reference.Value; public static implicit operator Vector2Reference(Vector2 reference) => new Vector2Reference(reference); #endregion } #if UNITY_EDITOR [UnityEditor.CanEditMultipleObjects, UnityEditor.CustomEditor(typeof(Vector2Var))] public class Vector2VarEditor : VariableEditor { public override void OnInspectorGUI() => PaintInspectorGUI("Vector2 Variable"); } #endif }