Сопрограмма не воспроизводится полностью

#c# #unity3d #coroutine #lerp

#c# #unity3d #сопрограмма #lerp

Вопрос:

К сожалению, моя сопрограмма не воспроизводится полностью. Предполагается, что объект исчезает, поэтому его альфа равна 0. Однако она исчезает до .039.

 {
    StartCoroutine(colorlerpin7());
    yield return null;
}

public IEnumerator colorlerpin7()

{
    float ElapsedTime = 0.0f;
    float TotalTime = 1f;
    while (ElapsedTime < TotalTime)

    {
        //  fades out atipical
        ElapsedTime  = Time.deltaTime;
        fluidpef.GetComponent<Renderer>().material.color = Color.Lerp(new 
        Color(1f, 1f, 1f, 1f), new Color(1f, 1f, 1f, 0f), (ElapsedTime / 
        TotalTime));
        yield return null;

    }
}
  

Ответ №1:

это выглядит как «правильное» поведение, поскольку ваше прошедшее время будет больше, чем общее время, прежде чем вы достигнете альфа-значения 0 (или значения lerp, равного 1), например

-> прошедшее время кадра x равно 0.97, ваше значение lerp равно 0.97.

-> прошедшее время кадра x 1 может быть уже 1.1, поэтому вы выйдете из цикла.

Просто добавьте этот код после цикла:

 fluidpef.GetComponent<Renderer>().material.color = Color.Lerp(new 
    Color(1f, 1f, 1f, 1f), new Color(1f, 1f, 1f, 0f), 1);
  

Комментарии:

1. В этом случае вам даже не понадобится функция Lerp, хотя вы могли бы просто принудительно ввести значение new Color(1f, 1f, 1f, 0f)

2. Да, безусловно.

Ответ №2:

while Условие заключается в том, почему значение alpha не уменьшается до 0. ElapsedTime < TotalTime означает, что в вашем цикле ElapsedTime / TotalTime никогда не будет равно 1, что означает, что значение alpha не будет равно 0.

Чтобы решить это, я бы изменил условие, чтобы проверить альфа-значение материала:

 public IEnumerator colorlerpin7()

{
    float ElapsedTime = 0.0f;
    float TotalTime = 1f;
    Renderer matRenderer =  fluidpef.GetComponent<Renderer>();
    while (matRenderer.material.color.a > 0.0f)

    {
        ElapsedTime  = Time.deltaTime;
        matRenderer.material.color = Color.Lerp(new 
        Color(1f, 1f, 1f, 1f), new Color(1f, 1f, 1f, 0f), (ElapsedTime / 
        TotalTime);
        yield return null;

    }
}

  

Комментарии:

1. Color.Lerp сделает зажим для вас.

2. Color.Lerp фиксирует третий параметр, а не значение цвета, поэтому ваш код получит тот же результат, что и у OP. Я думаю, что его проблема не в зажиме.

3. Я обновил свой ответ, извините за беспокойство. Проблема, как уже отмечалось, заключается в while том, что фрейм заканчивается слишком рано. В этом ответе я изменяю условие, чтобы проверять альфа-значение вместо ElapsedTime