Почему yield return null не продолжает цикл а завершает его

Мне нужно сделать плавное изменение переменной в зависимости от нажатой клавиши. Я создал класс в котором я плавно меня значение переменной.

class AxisLerp : MonoBehaviour
    {
        private int _resultAxisLerpInt = 0;
        private float _resultAxisLerpFloat;

        public float ResultAxisLerpFloat { get => _resultAxisLerpFloat; private set => _resultAxisLerpFloat = value; }

        public IEnumerator AxisLerpCoroutine(Axis axis, float valueTo)
        {
            while (_resultAxisLerpFloat != valueTo)
            {
                //axis.RateOfChenge скорость изменения переменной
                _resultAxisLerpInt = (int)Mathf.Lerp(_resultAxisLerpInt, valueTo * 100, axis.RateOfChenge * Time.deltaTime);
                _resultAxisLerpFloat = _resultAxisLerpInt * 0.01f;
                yield return null;
            }
                
        }
   }

И вызываю этот класс вот таким образом

float valueTo;
if (Input.GetKey(axis.PositiveButton))
    valueTo = 1;
else if (Input.GetKey(axis.NegativeButton))
    valueTo = -1;
else
    valueTo = 0;

            
AxisLerp lerp = gameObject.AddComponent<AxisLerp>();
StartCoroutine(lerp.AxisLerpCoroutine(axis, valueTo));
return lerp.ResultAxisLerpFloat;

Но после этого вместо плавного изменения переменной до 1 или -1 у меня были значения 0.04 и -0.04. Я стал отлаживать код и заметил, что цикл while повторятся один раз и завершается на строчке с yield return null. Когда я убрал yield return null с отладкой все работало, но если запустить игру без отладки то Unity зависала(Unity c while без yield return работать не может). Почему так происходит.


Ответы (1 шт):

Автор решения: Alemkhan Utepkaliev

Корутина работает правильно, я перепроверил, у Вас проблема с параметрами у корутины.

Проверил на таком коде:

private float _resultAxisLerpFloat;

private void Start()
{
    StartCoroutine(AxisLerpCoroutine(1f));
}

public IEnumerator AxisLerpCoroutine(float valueTo)
{
    while (_resultAxisLerpFloat <= valueTo)
    {
        _resultAxisLerpFloat += 0.01f;
        Debug.Log($"value: {_resultAxisLerpFloat}");
        yield return null;
    }
}

Важное замечание, Вы уверены что ваш valueTo параметр достижим именно для != оператора? проверка проверяет именно что он не равен точному этому значению, и где то может проверка не сработать так как имеем дело с не точным типом данных, попробуйте использовать while(_resultAxisLerpFloat <= valueTo) в качестве проверки.

Проверьте отладкой какое значение уходит в параметр valueTo в момент старта корутины

→ Ссылка