private IEnumerator RoutineMonitorTilt()
        {
            float tiltLowVelocity  = 0f;
            float tiltHighVelocity = 0f;

            WaitForEndOfFrame waitHandle = new WaitForEndOfFrame();

            yield return(waitHandle);

            while (true)
            {
                // Adapt the operating tilt range based on the operating height range, and if it's
                // over its limits, then move it towards it's target range.
                float t = operatingHeightRange.InverseLerp(CurrentHeight);
                t = Mathf.Clamp01(t);
                t = settings.EvaluateTiltTransition(t);
                ValueRange targetRange = ValueRange.Lerp(settings.TiltRangeLow, settings.TiltRangeHigh, t);
                operatingTiltRange.Set(
                    Mathf.SmoothDampAngle(operatingTiltRange.Min, targetRange.Min, ref tiltLowVelocity, 0.2f),
                    Mathf.SmoothDampAngle(operatingTiltRange.Max, targetRange.Max, ref tiltHighVelocity, 0.2f));

                ApplyTiltFactor();
                yield return(waitHandle);
            }
        }
 private void ApplyTiltFactor()
 {
     CurrentTiltAngle = operatingTiltRange.Lerp(tiltFactor);
 }
 private void UpdateOperatingTiltRange()
 {
     operatingTiltRange = ValueRange.Lerp(settings.TiltRangeLow, settings.TiltRangeHigh, operatingHeightRange.InverseLerp(CurrentHeight));
 }