using System; using UnityEngine; namespace MalbersAnimations.Scriptables { /// V3 Scriptable Variable. Based on the Talk - Game Architecture with Scriptable Objects by Ryan Hipple [CreateAssetMenu(menuName = "Malbers Animations/Variables/Vector3", order = 1000)] public class Vector3Var : ScriptableVar { /// The current value [SerializeField] private Vector3 value = Vector3.zero; /// Invoked when the value changes public Action OnValueChanged = delegate { }; /// Value of the Float Scriptable variable public virtual Vector3 Value { get => value; set { this.value = value; OnValueChanged(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 float z { get => value.z; set => this.value.z = value; } public void SetValue(Vector3Var var) => Value = var.Value; public void SetValue(Vector3 var) => Value = var; public void SetValuePosition(Transform var) => Value = var.position; public void SetValuePosition(Component var) => Value = var.transform.position; public void SetValuePosition(GameObject var) => Value = var.transform.position; public void SetValuePositionLocal(Transform var) => Value = var.localPosition; public void SetValuePositionLocal(Component var) => Value = var.transform.localPosition; public void SetValuePositionLocal(GameObject var) => Value = var.transform.localPosition; public void SetValueRotation(Transform var) => Value = var.rotation.eulerAngles; public void SetValueRotation(Component var) => Value = var.transform.rotation.eulerAngles; public void SetValueRotation(GameObject var) => Value = var.transform.rotation.eulerAngles; public void SetValueRotationLocal(Transform var) => Value = var.localRotation.eulerAngles; public void SetValueRotationLocal(Component var) => Value = var.transform.localRotation.eulerAngles; public void SetValueRotationLocal(GameObject var) => Value = var.transform.localRotation.eulerAngles; public void SetValueScale(Transform var) => Value = var.lossyScale; public void SetValueScale(Component var) => Value = var.transform.lossyScale; public void SetValueScale(GameObject var) => Value = var.transform.lossyScale; public void SetValueScaleLocal(Transform var) => Value = var.localScale; public void SetValueScaleLocal(Component var) => Value = var.transform.localScale; public void SetValueScaleLocal(GameObject var) => Value = var.transform.localScale; public void SetX(float var) => value.x = var; public void SetY(float var) => value.y = var; public void SetZ(float var) => value.z = var; public static implicit operator Vector3(Vector3Var reference) => reference.Value; public static implicit operator Vector2(Vector3Var reference) => reference.Value; } [System.Serializable] public class Vector3Reference : ReferenceVar { public Vector3 ConstantValue = Vector3.zero; [RequiredField] public Vector3Var Variable; public Vector3Reference() { UseConstant = true; ConstantValue = Vector3.zero; } public Vector3Reference(bool variable) { UseConstant = !variable; if (!variable) { ConstantValue = Vector3.zero; } else { Variable = ScriptableObject.CreateInstance(); Variable.Value = Vector3.zero; } } public Vector3Reference(Vector3 value) => Value = value; public Vector3 Value { get => (UseConstant || Variable == null) ? ConstantValue : Variable.Value; set { if (UseConstant) ConstantValue = value; else Variable.Value = value; } } public float x { get => UseConstant ? ConstantValue.x : Variable.x; set { if (UseConstant) ConstantValue.x = value; else Variable.x = value; } } public float y { get => UseConstant ? ConstantValue.y : Variable.y; set { if (UseConstant) ConstantValue.y = value; else Variable.y = value; } } public float z { get => UseConstant ? ConstantValue.z : Variable.z; set { if (UseConstant) ConstantValue.z = value; else Variable.z = value; } } #region Operators public static implicit operator Vector3(Vector3Reference reference) => reference.Value; public static implicit operator Vector2(Vector3Reference reference) => reference.Value; #endregion } #if UNITY_EDITOR [UnityEditor.CanEditMultipleObjects, UnityEditor.CustomEditor(typeof(Vector3Var))] public class Vector3VarEditor : VariableEditor { public override void OnInspectorGUI() => PaintInspectorGUI("Vector3 Variable"); } #endif }