namespace VRTK.Prefabs.Locomotion.Movement.MovementAmplifier
{
using UnityEngine;
using Malimbe.XmlDocumentationAttribute;
using Malimbe.PropertySerializationAttribute;
using Zinnia.Extension;
using Zinnia.Tracking.Follow;
using Zinnia.Data.Attribute;
using Zinnia.Data.Operation.Mutation;
using Zinnia.Data.Type.Transformation.Aggregation;
///
/// Sets up the MovementAmplifier prefab based on the provided user settings.
///
public class MovementAmplifierConfigurator : MonoBehaviour
{
#region Facade Settings
///
/// The public interface facade.
///
[Serialized]
[field: Header("Facade Settings"), DocumentedByXml, Restricted]
public MovementAmplifierFacade Facade { get; protected set; }
#endregion
#region Reference Settings
///
/// Moves the radius origin.
///
[Serialized]
[field: Header("Reference Settings"), DocumentedByXml, Restricted]
public ObjectDistanceComparator RadiusOriginMover { get; protected set; }
///
/// Determines whether is inside the radius.
///
[Serialized]
[field: DocumentedByXml, Restricted]
public ObjectDistanceComparator DistanceChecker { get; protected set; }
///
/// Moves the objects.
///
[Serialized]
[field: DocumentedByXml, Restricted]
public ObjectDistanceComparator ObjectMover { get; protected set; }
///
/// Subtracts the radius.
///
[Serialized]
[field: DocumentedByXml, Restricted]
public FloatAdder RadiusSubtractor { get; protected set; }
///
/// Stabilizes the radius by ensuring moves back into the radius.
///
[Serialized]
[field: DocumentedByXml, Restricted]
public float RadiusStabilizer { get; protected set; } = 0.001f;
///
/// Amplifies the movement.
///
[Serialized]
[field: DocumentedByXml, Restricted]
public Vector3Multiplier MovementMultiplier { get; protected set; }
///
/// Moves the target.
///
[Serialized]
[field: DocumentedByXml, Restricted]
public TransformPositionMutator TargetPositionMutator { get; protected set; }
#endregion
///
/// Configures the with the facade settings.
///
public virtual void ConfigureRadiusOriginMover()
{
RadiusOriginMover.transform.parent.position = Facade.Source.transform.position;
RadiusOriginMover.RunWhenActiveAndEnabled(() => RadiusOriginMover.Target = Facade.Source);
}
///
/// Configures the with the facade settings.
///
public virtual void ConfigureDistanceChecker()
{
DistanceChecker.RunWhenActiveAndEnabled(() => DistanceChecker.Source = Facade.Source);
DistanceChecker.DistanceThreshold = Facade.IgnoredRadius;
}
///
/// Configures the with the facade settings.
///
public virtual void ConfigureObjectMover()
{
ObjectMover.RunWhenActiveAndEnabled(() => ObjectMover.Source = Facade.Source);
}
///
/// Configures the with the facade settings.
///
public virtual void ConfigureRadiusSubtractor()
{
RadiusSubtractor.RunWhenActiveAndEnabled(() => RadiusSubtractor.Collection.SetAt(-Facade.IgnoredRadius + RadiusStabilizer, 1));
}
///
/// Configures the with the facade settings.
///
public virtual void ConfigureMovementMultiplier()
{
MovementMultiplier.RunWhenActiveAndEnabled(() => MovementMultiplier.Collection.SetAt(Vector3.one * (Facade.Multiplier - 1f), 1));
}
///
/// Configures the with the facade settings.
///
public virtual void ConfigureTargetPositionMutator()
{
TargetPositionMutator.Target = Facade.Target;
}
protected virtual void OnEnable()
{
ConfigureRadiusOriginMover();
ConfigureDistanceChecker();
ConfigureObjectMover();
ConfigureRadiusSubtractor();
ConfigureMovementMultiplier();
ConfigureTargetPositionMutator();
}
protected virtual void OnDisable()
{
ObjectMover.enabled = false;
}
}
}