DynamicReductionSource.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using Controller.Bicycle;
  2. using SicknessReduction.Visual.Vignetting;
  3. using UnityEngine;
  4. namespace SicknessReduction
  5. {
  6. public enum ReductionValueSource
  7. {
  8. AngularVelocity,
  9. SteerAngle,
  10. SteerAngleAndSpeed
  11. }
  12. //TODO: also based on slopes
  13. public class DynamicReductionSource : MonoBehaviour
  14. {
  15. public RbBicycleController bikeController;
  16. [Header("Restriction Data")] public ReductionValueSource reductionSource;
  17. public float minValue = 0.3f;
  18. public float maxValue = 0.7f;
  19. public float maxValueChangePerSecond = 0.8f;
  20. [Tooltip("Depending on Vignetting source -> deg or deg/s")]
  21. public float threshold = 20f;
  22. private ValueBasedRestrictionSuggestor steerAngleSuggestor;
  23. private QueueBasedRestrictionSuggestorVector3 angularVelocitySuggestor;
  24. private ValueBasedRestrictionSuggestor speedSuggestor;
  25. protected float currentValue;
  26. protected float change;
  27. public float CurrentValue => currentValue;
  28. public float Change => change;
  29. protected virtual void Start()
  30. {
  31. if (reductionSource == ReductionValueSource.AngularVelocity)
  32. {
  33. angularVelocitySuggestor =
  34. new QueueBasedRestrictionSuggestorVector3(threshold, minValue, maxValue, 180f); //deg/s
  35. }
  36. else if (reductionSource == ReductionValueSource.SteerAngle || reductionSource == ReductionValueSource.SteerAngleAndSpeed)
  37. {
  38. steerAngleSuggestor =
  39. new ValueBasedRestrictionSuggestor(threshold, minValue, maxValue,
  40. bikeController.maxSteeringAngle); //deg
  41. if (reductionSource == ReductionValueSource.SteerAngleAndSpeed)
  42. {
  43. speedSuggestor = new ValueBasedRestrictionSuggestor(0, minValue,
  44. maxValue, 25f);
  45. }
  46. }
  47. }
  48. protected virtual void Update()
  49. {
  50. float desiredValue;
  51. if (reductionSource == ReductionValueSource.AngularVelocity)
  52. {
  53. angularVelocitySuggestor.AddValue(bikeController.rigidBody.transform.localEulerAngles);
  54. desiredValue = angularVelocitySuggestor.Suggestion;
  55. }
  56. else
  57. {
  58. steerAngleSuggestor.Value = bikeController.CurrentSteerAngle;
  59. if (reductionSource == ReductionValueSource.SteerAngle)
  60. {
  61. desiredValue = steerAngleSuggestor.Suggestion;
  62. }
  63. else
  64. {
  65. speedSuggestor.Value = bikeController.CurrentSpeed;
  66. var steerSuggestion = steerAngleSuggestor.Suggestion;
  67. var speedSuggestion = speedSuggestor.Suggestion;
  68. if (steerSuggestion == 0)
  69. {
  70. desiredValue = 0f;
  71. }
  72. else
  73. {
  74. desiredValue = (2 * steerSuggestion + speedSuggestion) / 3;
  75. }
  76. }
  77. }
  78. var desiredChange = desiredValue - currentValue;
  79. var maxChange = Time.deltaTime * maxValueChangePerSecond;
  80. change = Mathf.Sign(desiredChange) * Mathf.Min(Mathf.Abs(desiredChange), maxChange);
  81. }
  82. }
  83. }