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);
}
}
}