namespace Zinnia.Tracking.Follow.Modifier.Property { using UnityEngine; using Zinnia.Data.Type; /// /// Modifies a specific property with the ability to limit the axes the property is applied to. /// public abstract class RestrictableTransformPropertyModifier : PropertyModifier { [Header("Restriction Settings")] [Tooltip("Determines which axes to apply the modification on>.")] [SerializeField] private Vector3State applyModificationOnAxis = Vector3State.True; /// /// Determines which axes to apply the modification on>. /// public Vector3State ApplyModificationOnAxis { get { return applyModificationOnAxis; } set { applyModificationOnAxis = value; } } /// /// Whether the modifier has restrictable axes on. /// public virtual bool HasAxisRestrictions => !ApplyModificationOnAxis.ToVector3().Equals(Vector3.one); /// /// The original value of the property. /// protected Vector3 originalPropertyValue; /// /// Saves the original value for the property. /// /// The property value to save. protected virtual void SaveOriginalPropertyValue(Vector3 valueToSave) { originalPropertyValue = valueToSave; } /// /// Applies the restrictions to the property value based on the axes to apply modification on. /// /// The property value to restrict. /// The restricted property value. protected virtual Vector3 RestrictPropertyValue(Vector3 valueToRestrict) { valueToRestrict.x = ApplyModificationOnAxis.xState ? valueToRestrict.x : originalPropertyValue.x; valueToRestrict.y = ApplyModificationOnAxis.yState ? valueToRestrict.y : originalPropertyValue.y; valueToRestrict.z = ApplyModificationOnAxis.zState ? valueToRestrict.z : originalPropertyValue.z; return valueToRestrict; } } }