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