Unity - как написать “после того как анимация закончится”?

563
04 мая 2017, 11:27

Unity, C#. Есть молдель с animator, в котором уже настроены стейты-анимации и параметры для переходов между ними.

Мне нужно проигрывать анимации в определенном порядке. Чтобы вызвать нужную анимацию мне достаточно чекнуть нужный параметр:

GetComponent.<Animator>().SetBool("someparameter",true);

Как написать условие "когда текущая анимация закончится"? Все варианты что нахожу либо про Animation а не Animator, либо слишком сложны а нужен простой способ в котором можно быстро разобраться использовать.

Answer 1

У Animator есть метод GetCurrentAnimatorStateInfo, который получает информацию о текущем состоянии на указанном слое Контроллера Аниматора (AnimatorController). То есть он возвращает AnimatorStateInfo Вот им и стоит воспользоваться.

У AnimatorStateInfo, в свою очередь, есть поле IsName - которое говорит, совпадает ли name с именем активного состояния в statemachine. В итоге может получится что-то такое:

private Animator animator;
private void Start() {
    animator = GetComponentInChildren<Animator>();        
}
public bool IsAnimationPlaying(string animationName) {        
    // берем информацию о состоянии
    var animatorStateInfo = animator.GetCurrentAnimatorStateInfo(0);
    // смотрим, есть ли в нем имя какой-то анимации, то возвращаем true
    if (animatorStateInfo.IsName(animationName))             
        return true;
    return false;
}

Как применение:

if (IsAnimationPlaying("Run"))
    Debug.Log("Player is running");

Для проверки нескольких анимаций скорее всего придется их поместить в массив и пробегаться циклом:

foreach (var move in attackMoves) {
    if (IsAnimationPlaying(move.animationName)) {                   
        // do smth...
    }
}

P.S. GetCurrentAnimatorStateInfo - получает информацию на определенном слое. Поэтому чтобы взять инфу на самом базовом слое стоит GetCurrentAnimatorStateInfo(0). В других слоях индекс будет меняться естественно.

Answer 2

Не очень понятно что вы хотите, если после того как одна анимация закончилась вы хотите перейти в другую так настройте переходы между стейтами в Mecanim.

Если вам нужно отловить сам момент когда делается выход из состояния можно воспользоваться классами StateMachineBehaivour который как раз умеет реагировать на работу в состояние. Этот скрипт навешивается в Mecanim на само состояние. Его надо выбрать в сцене и в окне инспектора добавить соотвествующий скрипт, как это делается с компонентами на сцене.

READ ALSO
Символ в название переменной

Символ в название переменной

Хочу прочитать JSON файл с использованием View модели (класса с названием всех переменных), но возникла загвоздкаНекоторые имена в файле имеют...

204
Cтроки подключения в App.config и Web.config

Cтроки подключения в App.config и Web.config

Представим ситуацию: В Visual Studio есть решение, которое состоит из 3 проектовВ каждом из проектов в файле app

502
C# .Net 2.0 послать get запрос

C# .Net 2.0 послать get запрос

Добрый день, вот допустим у меня есть код который посылает гет запрос

458
Как группировать по нескольким полям?

Как группировать по нескольким полям?

Пример кода взят из MSDNВ нем показано,как получить сумму ,группируя по одному полю

432