DynamicReductionSource.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. using Controller.Bicycle;
  2. using SicknessReduction.Visual.Vignetting;
  3. using UnityEngine;
  4. namespace SicknessReduction
  5. {
  6. //TODO: also based on slopes
  7. public class DynamicReductionSource : MonoBehaviour
  8. {
  9. public RbBicycleController bikeController;
  10. [Header("Restriction Data")] public float minValue = 0.3f;
  11. public float maxValue = 0.7f;
  12. public float maxValueChangePerSecond = 0.8f;
  13. [Tooltip("Depending on Vignetting source -> deg or deg/s")]
  14. public float threshold = 20f;
  15. private ValueBasedRestrictionSuggestor steerAngleSuggestor;
  16. private ValueAndTimeBasedRestrictionSuggestor speedSuggestor;
  17. protected float currentValue;
  18. public float CurrentValue => currentValue;
  19. protected virtual void Start()
  20. {
  21. if (bikeController == null) Debug.LogError("bike controller = null!");
  22. steerAngleSuggestor =
  23. new ValueBasedRestrictionSuggestor(threshold, minValue, maxValue,
  24. bikeController.maxSteeringAngle); //deg
  25. speedSuggestor = new ValueAndTimeBasedRestrictionSuggestor(0, minValue,
  26. maxValue, 25f, 1.111f /*4kmh*/, 3);
  27. }
  28. protected virtual void Update()
  29. {
  30. steerAngleSuggestor.Value = bikeController.CurrentSteerAngle;
  31. speedSuggestor.UpdateValue(bikeController.CurrentSpeed);
  32. var steerSuggestion = steerAngleSuggestor.Suggestion;
  33. var speedSuggestion = speedSuggestor.Suggestion;
  34. var desiredValue = Mathf.Max(steerSuggestion, speedSuggestion);
  35. var desiredChange = desiredValue - currentValue;
  36. var maxChange = Time.deltaTime * maxValueChangePerSecond;
  37. var change = Mathf.Sign(desiredChange) * Mathf.Min(Mathf.Abs(desiredChange), maxChange);
  38. currentValue = Mathf.Clamp(currentValue + change, 0, 1);
  39. }
  40. }
  41. }