Я хочу что-бы волк шел потом шел и поворачивал, затем бил лапами и шел дальше, и так бесконечно.
|
Смена действий во времени - это уже геймплейная часть конкретной игры имхо, а не движка. Движок должен просто уметь проигрывать анимацию, типа
Делать какие-то действия, ждать их завершения и делать следующие - это распространённая задача в играх и касается далеко на только анимаций.
Наблюдал реализацию этой фишки в скриптовых движках, что мне кажется довольно удобным.
Например, в первой Мафии такой скрипт выглядел бы так:
label 1
model_playanim 0, "wolf_walk", 1 // записывает время анимки в переменную 1
wait flt[1] // ждём окончания
model_playanim 0, "wolf_turn", 1
wait flt[1]
model_playanim 0, "wolf_paws", 1
wait flt[1]
goto 1
а в юнити с C# он бы мог выглядеть так:
IEnumerator loop()
{
animation.CrossFade(wolf_walk);
yield return new WaitForSeconds(animation["wolf_walk"].length);
animation.CrossFade(wolf_turn);
yield return new WaitForSeconds(animation["wolf_turn"].length);
animation.CrossFade(wolf_paws);
yield return new WaitForSeconds(animation["wolf_paws"].length);
}
В обоих вариантах всё куда понятнее. Плюс, оба варианта не ограничены движениями. Я могу поставить wait, чтобы NPC просто какое-то время занимался одной скриптовой деятельностью, интерактясь с миром, а потом переключался на другое дело, могу сделать часовую бомбу, миссию на время и много чего ещё на одном и том же функционале.
Специализированная версия waitов для анимаций в феноменально замороченной обёртке - не нужна.
---
алсо, как в мафе, так и в юнити, нет реальной асинхронности у этих штук (ибо не нужно), виртуальная машина просто умеет не обновлять скрипт, пока условие не выполнено, чекая его время от времени.