Unity - как прыгнуть при включенном определенном состоянии анимации?

Итак, у меня есть анимация, скорость которой контролируется нажатием кнопки m, что означает, что я не могу просто сделать рывок в течение заданного времени, но это зависит от того, верно ли это:

cameraAnim.GetCurrentAnimatorStateInfo (0).IsName ("stillOpening")

К концу этой анимации (независимо от того, сколько времени это заняло, быстрая или медленная), мне нужно, чтобы этот всплеск в моем материале достиг конечного значения:

skybox.SetFloat ("_Exponent1",Mathf.Lerp(skybox.GetFloat("_Exponent1"), topSkyBoxOpen, ratio));

Это означает, что он должен быть равен topSkyBoxOpen в конце "stillOpening". Я не знаю, как согласовать время.

Я пробовал это в обновлении ():

void openSkyLerp()
    {
        float ratio = 0;
        float duration = 0.5f; // this is the one that will control how long it takes
        // value is in second 
        float multiplier = 1 / duration;

        while (cameraAnim.GetCurrentAnimatorStateInfo (0).IsName ("stillOpening")) {
            ratio += Time.deltaTime * multiplier;
            skybox.SetFloat ("_Exponent1",Mathf.Lerp(skybox.GetFloat("_Exponent1"), topSkyBoxOpen, ratio));

        }
    }

Но ничего не происходит вообще - я читал, что это может быть из-за того, что он пытается сделать все в одном кадре. Это возможно? Как я могу узнать, когда анимация воспроизводится независимо от ее скорости?

1 ответ

Решение

Это означает, что он должен быть равен topSkyBoxOpen в конце "stillOpening". Я не знаю, как согласовать время.

Проблема в том, что вы даже не ждете кадра. Таким образом, даже если ваше уравнение верно, все это не может происходить гладко в одном кадре. Вы ждете кадр с yield return null; и это требует сопрограммы.

Ответил на очень похожий, но не тот же вопрос несколько часов назад.

Если stillOpening переменная является целевым значением, получить текущий _Exponent1 значение перед входом в цикл while. Иметь переменную счетчика, которая увеличивает каждый кадр, пока счетчик меньше topSkyBoxOpen, Вы можете использовать Mathf.Lerp(currentVal, topSkyBoxOpen, counter / duration); в SetFloat функция.

bool running = false;

void openSkyLerp()
{
    if (running)
    {
        return;
    }
    running = true;
    StartCoroutine(OpenSky(5));
}

IEnumerator OpenSky(float duration)
{
    float currentVal = skybox.GetFloat("_Exponent1");
    float counter = 0;
    while (counter < topSkyBoxOpen)
    {
        //Exit if not still opening
        if (!cameraAnim.GetCurrentAnimatorStateInfo(0).IsName("stillOpening"))
        {
            yield break;
        }
        counter = counter + Time.deltaTime;

        float val = Mathf.Lerp(currentVal, topSkyBoxOpen, counter / duration);

        skybox.SetFloat("_Exponent1", val);
        yield return null; //Wait for a frame
    }
    running = false;
}
Другие вопросы по тегам