Почему 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 шт):
Корутина работает правильно, я перепроверил, у Вас проблема с параметрами у корутины.
Проверил на таком коде:
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 в момент старта корутины