Анимационные нотификаторы в UDK: события в анимации

Анимация в UDKАнимационные нотификаторы в UDK (Anim Sequence Notifies) — крайне полезная, даже можно сказать, незаменимая вещь. Они дают разработчику обратную связь из анимационной последовательности (Animation Sequence) в UnrealScript в виде вызовов определенных событий (функций) при анимации. Благодаря нотификаторам мы всегда сможем знать, в каком состоянии находится наш персонаж (точнее, в каком положении находится его тело).

При помощи анимационных нотификаторов можно создавать такие вещи, как звук шагов персонажа, обработчики ударов в боевой системе и даже правильную постановку стоп на неровной поверхности с использованием инверсной кинематики (IK). Я уже писал про создание основы системы постановки стоп персонажа, теперь пришло время ее доработать с использованием Anim Sequence Notifies (анимационных нотификаторов в UDK).
Об этом, а также о других применениях Anim Sequence Notifies будет мой сегодняшний пост.

Создание Anim Sequence Notifies

Для начала поговорим о том, как добавить анимационный нотификатор в UDK. Это делается в редакторе Unreal AnimSet Editor. Выбираем в браузере контента AnimSet и заходим в редактор (двойным щелчком или по правой кнопке мыши, а потом «Edit Using Anim Set Viewer»).
В редакторе есть блок Properties, а в нем закладка AnimSequence. Прямо сверху в разделе Anim Sequence есть поле Notifies. Это массив, который изначально пуст. В него мы и будем добавлять наши оповещения (или вызовы UnrealScript из анимации). Добавляя новый элемент, нужно указать его тип. В комплекте UDK идет уже несколько (множество) готовых вызовов, каждый из которых работает по-своему.

Я пока проверил только работу оповещения AnimNotify_Footstep, которое вызывает событие PlayFootStepSound() в классе Pawn и передает в него номер ноги: 0-левая, 1-правая; а также оповещения AnimNotify_Script, которое вызывает заданное нами событие, причем позволяет вызывать событие начала, окончания и течения анимации — очень удобно и гибко.

При добавлении анимационных нотификаторов (оповещений) на временной шкале появляются метки, которые мы можем перемещать, синхронизируя их с определенным событием в анимации (например, для постановки стоп — с моментом опускания стопы на поверхность).

Анимационные нотификаторы (Anim Sequence Notifies) в UDK

Вызов события из анимации в UDK

Итак, чтобы вызвать событие из анимации в UDK мы добавляем анимационный нотификатор AnimNotify_Script, и указываем имя события, которое будем вызывать. Далее в классе нашем классе, унаследованном от Pawn, мы будем обрабатывать это событие соответствующей функцией.

Звук шагов
Для наглядности я приведу пример с AnimNotify_Footstep, который вызывает не заданное нами событие, а «зашитое» в нотификатор событие PlayFootStepSound(). Вы можете использовать AnimNotify_Script и вручную указать имя PlayFootStepSound, тогда также будет вызываться этот метод субкласса Pawn. Сам обработчик события в анимации будет выглядеть очень просто — от него требуется только проиграть звук шагов:


// Выбираем в редакторе нужный SoundCue
var(Sounds) SoundCue FootStepSound;

// Событие, вызываемое из анимации
event PlayFootStepSound(int FootDown)
{
    PlaySound(FootStepSound, false, true, true,, true);
}


На сайте UDN есть более мощный пример, который проигрывает звук шагов в зависимости от физического материала поверхности (Physical Material):
udn.epicgames.com/Three/PhysicalMaterialProperty.html

Постановка стоп на поверхности
Анимационные события также можно использовать для доработки системы постановки стоп. Для этого можно использовать анимационный нотификатор AnimNotify_Script, и задать пару вызовов: для начала постановки стопы — Notify Name = OnFootDown, и для момента, когда стопа отрывается от земли — Notify End Name = OnFootUp. Вот небольшой пример в виде псевдокода:


event OnFootDown(номер ноги)
{
    // TODO: Включаем IK для заданной ноги
}

event OnFootUp(номер ноги)
{
    // TODO: Выключаем IK для заданной ноги
}


В итоге IK-ресолвер, следящий за поверхностью, на которую наступает персонаж, включается только тогда, когда нога персонажа действительно находится на поверхности. Таким образом мы можем избавиться от «эффекта лыжника», когда постоянно включенная инверсная кинематика (IK) заставляет стопы персонажа все время скользить по поверхности.

Боевая система
Как использовать вызовы события из анимации для боевой системы, вы, наверное, уже догадались. Точно также, создаем AnimNotify_Script нотификатор, и заставляем его вызвать событие OnStartHit(), когда оружие персонажа начинает грозно обрушиваться на врага, и вызываем событие OnStopHit() в момент завершения анимации удара. А между двумя этими событиями производим трассировку луча, как я описывал это в статье про создание холодного оружия в UDK.

Итак, общие принципы нам понятны — за работу, товарищи!
  • 0
  • 30 октября 2012, 11:47
  • dimanjy

Комментарии (4)

RSS свернуть / развернуть
+
0
спасибо за статью, их по удк крайне мало на ру. а можно в сокетах партиклы включать таким образом?
avatar

logian

  • 15 июня 2013, 11:01
+
0
Думаю, по нотификаторам можно включать что угодно :)
avatar

dimanjy

  • 17 июня 2013, 13:04
+
0
а когда нужно использовать Animset или Animtree? Вот скорпион например выводится через Animtree, но у него также есть Animset
avatar

logian

  • 17 июня 2013, 13:36
+
0
AnimTree — это сложная древовидная структура, описывающая анимационное поведение персонажа в зависимости от каких-либо внешних факторов. AnimSet — это анимационная последовательность, созданная в анимационном редакторе и импортированная в UDK. AnimTree может запускать на воспроизведение различные AnimSet'ы в зависимости от текущего состояния дерева AnimTree, а также смешивать сразу несколько AnimSet'ов (это называется блендинг).

Советую почитать документацию по AnimTree. Также можете посмотреть мои статьи про инверсную кинематику.
avatar

dimanjy

  • 17 июня 2013, 13:52

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.