namespace Zinnia.Data.Operation.Mutation { using UnityEngine; using Zinnia.Data.Type; using Zinnia.Extension; /// /// Mutates the position of a transform with an optional facing direction. /// public class TransformPositionMutator : TransformPropertyMutator { #region Position Settings [Header("Position Settings")] [Tooltip("Determines the facing direction when mutating the position.")] [SerializeField] private GameObject facingDirection; /// /// Determines the facing direction when mutating the position. /// public GameObject FacingDirection { get { return facingDirection; } set { facingDirection = value; } } [Tooltip("Determines which axes to take from the FacingDirection.")] [SerializeField] private Vector3State applyFacingDirectionOnAxis = Vector3State.True; /// /// Determines which axes to take from the . /// public Vector3State ApplyFacingDirectionOnAxis { get { return applyFacingDirectionOnAxis; } set { applyFacingDirectionOnAxis = value; } } #endregion /// /// Clears . /// public virtual void ClearFacingDirection() { if (!this.IsValidState()) { return; } FacingDirection = default; } /// /// Clears . /// public virtual void ClearApplyFacingDirectionOnAxis() { if (!this.IsValidState()) { return; } ApplyFacingDirectionOnAxis = default; } /// /// Sets the x value. /// /// The value to set to. public virtual void SetApplyFacingDirectionOnAxisX(bool value) { ApplyFacingDirectionOnAxis = new Vector3State(value, ApplyFacingDirectionOnAxis.yState, ApplyFacingDirectionOnAxis.zState); } /// /// Sets the y value. /// /// The value to set to. public virtual void SetApplyFacingDirectionOnAxisY(bool value) { ApplyFacingDirectionOnAxis = new Vector3State(ApplyFacingDirectionOnAxis.xState, value, ApplyFacingDirectionOnAxis.zState); } /// /// Sets the z value. /// /// The value to set to. public virtual void SetApplyFacingDirectionOnAxisZ(bool value) { ApplyFacingDirectionOnAxis = new Vector3State(ApplyFacingDirectionOnAxis.xState, ApplyFacingDirectionOnAxis.yState, value); } /// protected override float GetGlobalAxisValue(int axis) { return Target != null ? Target.transform.position[axis] : default; } /// protected override float GetLocalAxisValue(int axis) { return Target != null ? Target.transform.localPosition[axis] : default; } /// protected override Vector3 GetNewSetValue(Vector3 input) { return LockSetInput(GetFacingDirection() * input); } /// protected override Vector3 GetNewIncrementValue(Vector3 input) { if (Target == null) { return default; } return (UseLocalValues ? Target.transform.localPosition : Target.transform.position) + LockIncrementInput(GetFacingDirection() * input); } /// protected override Vector3 SetGlobalTargetValue(Vector3 input) { if (Target == null) { return default; } return Target.transform.position = input; } /// protected override Vector3 SetLocalTargetValue(Vector3 input) { if (Target == null) { return default; } return Target.transform.localPosition = input; } /// /// Determines the value to use for the facing direction. /// /// The facing direction. protected virtual Quaternion GetFacingDirection() { if (FacingDirection == null) { return Quaternion.identity; } Quaternion returnValue = UseLocalValues ? FacingDirection.transform.localRotation : FacingDirection.transform.rotation; Vector3 facingAxesToApply = ApplyFacingDirectionOnAxis.ToVector3(); if (facingAxesToApply.ApproxEquals(Vector3.one)) { return returnValue; } facingAxesToApply.Scale(returnValue.eulerAngles); return Quaternion.Euler(facingAxesToApply); } } }