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;
}