using Controller.Bicycle; using SicknessReduction.Visual.Vignetting; using UnityEngine; namespace SicknessReduction { public enum ReductionValueSource { AngularVelocity, SteerAngle, SteerAngleAndSpeed } //TODO: also based on slopes public class DynamicReductionSource : MonoBehaviour { public RbBicycleController bikeController; [Header("Restriction Data")] public ReductionValueSource reductionSource; public float minValue = 0.3f; public float maxValue = 0.7f; public float maxValueChangePerSecond = 0.8f; [Tooltip("Depending on Vignetting source -> deg or deg/s")] public float threshold = 20f; private ValueBasedRestrictionSuggestor steerAngleSuggestor; private QueueBasedRestrictionSuggestorVector3 angularVelocitySuggestor; private ValueBasedRestrictionSuggestor speedSuggestor; protected float currentValue; protected float change; public float CurrentValue => currentValue; public float Change => change; protected virtual void Start() { if (reductionSource == ReductionValueSource.AngularVelocity) { angularVelocitySuggestor = new QueueBasedRestrictionSuggestorVector3(threshold, minValue, maxValue, 180f); //deg/s } else if (reductionSource == ReductionValueSource.SteerAngle || reductionSource == ReductionValueSource.SteerAngleAndSpeed) { steerAngleSuggestor = new ValueBasedRestrictionSuggestor(threshold, minValue, maxValue, bikeController.maxSteeringAngle); //deg if (reductionSource == ReductionValueSource.SteerAngleAndSpeed) { speedSuggestor = new ValueBasedRestrictionSuggestor(0, minValue, maxValue, 25f); } } } protected virtual void Update() { float desiredValue; if (reductionSource == ReductionValueSource.AngularVelocity) { angularVelocitySuggestor.AddValue(bikeController.rigidBody.transform.localEulerAngles); desiredValue = angularVelocitySuggestor.Suggestion; } else { steerAngleSuggestor.Value = bikeController.CurrentSteerAngle; if (reductionSource == ReductionValueSource.SteerAngle) { desiredValue = steerAngleSuggestor.Suggestion; } else { speedSuggestor.Value = bikeController.CurrentSpeed; var steerSuggestion = steerAngleSuggestor.Suggestion; var speedSuggestion = speedSuggestor.Suggestion; if (steerSuggestion == 0) { desiredValue = 0f; } else { desiredValue = (2 * steerSuggestion + speedSuggestion) / 3; } } } var desiredChange = desiredValue - currentValue; var maxChange = Time.deltaTime * maxValueChangePerSecond; change = Mathf.Sign(desiredChange) * Mathf.Min(Mathf.Abs(desiredChange), maxChange); } } }