Работа с тегами Mannequin editor в коде

Те, кто хоть раз сталкивался с маникен эдитором явно интересовался каким образом работают установленные там теги и по какому принципу проигрываются анимации при разных группах тегов. Работа с тегами Mannequin editor в коде - student2.ru

Рисунок 1Окно Manequin Editor

Как вы могли заметить, на скриншоте видно несколько FragmentID: hit, grab, hold и тд. Раскрывая данные фрагменты вы можете увидеть другие вложения. Эти вложения как раз-таки и формируются из установленных тегов. В конце каждой ветви дерева тегов будет лежать сам Fragment Entity, в котором задаются различные плюшки – анимации и её параметры. На скриншоте это Option 1.

Окей, это было начало теперь самое интересное. Для того что бы движок обрабатывал ваши собственные теги и задавал их в нужный момент времени вам нужно, разумеется, их где-то объявить. Для этого открываем PlayerAnimation.h и ищем объявление макро команды

#define MAN_PLAYER_TAGS ( f ) \

Работа с тегами Mannequin editor в коде - student2.ru

Рисунок 2 Файл PlayerAnimation.h

Здесь, после дефолтных объявлений, мы можем добавить свой тег простой командой:

f( myTag )

Хочу заметить, что в строчке выше, перед вашим объявлением, нужно поставить символ \ после макро команды(см. работа с макросами С++).

Готово. Наш тег определен. Далее для активации/деактивации тега в нужный момент мы должны вызвать соответствующую функцию. Для этого в вашем коде, например у вас есть собственный класс оружия, нужно прописать следующий код:

CItem* pItem = (CItem*)g_pGame->GetIGameFramework()->GetClientActor()->GetCurrentItem();

IActionController *pActionController = pItem ? pItem->GetActionController() : NULL;

if (!pActionController)

return;

SAnimationContext &animContext = pActionController->GetContext();

animContext.state.Set(PlayerMannequin.tagIDs.myTag, true);

Немного комментариев к данному коду

В первой строчке мы получаем указатель на текущее оружие игрока. Затем получаем указатель на экшен контроллер данного айтема.

Следующий шаг получение контекста анимаций.

После того как мы получили объект контекста анимаций нам достаточно обратиться к состоянию тегов(state) и установить нужный нам тег функцией Set(), которая принимает ид тега и флаг установить либо убрать.

Советую вынести эту процедуру в отдельную функцию:

//-------------------------------------------------------------------

void MyWeaponСlass::SetTag(uint32 id, bool set)

{

m_pItem = (CItem*)g_pGame->GetIGameFramework()->GetClientActor()->GetCurrentItem();

IActionController *pActionController = m_pItem ? m_pItem->GetActionController() : NULL;

if (!pActionController)

return;

SAnimationContext &animContext = pActionController->GetContext();

animContext.state.Set(id, set);

m_pItem->SetFragmentTags(animContext.state);

}

Компилируем код, и открываем редактор и заходим в маникен эдитор.

После того, как маникен эдитор загрузится, открываем окно Tag definition editor. В левой колонке представлены файлы, в которых описаны теги. В принципе вы можете создать свой файл. В своем примере я буду использовать itemTags.xml.

Создадим новый тег одноименный тому, который мы определили в PlayerAnimation.h – myTag. Работа с тегами Mannequin editor в коде - student2.ru Работа с тегами Mannequin editor в коде - student2.ru

Далее сохраняем изменения и перезагружаем движок.

Кстати, в некоторых версиях не удается сохранить изменения и для этого иногда требуется ручками прописать нужный тег в соотвественном файле. Это не сложно, структура файла элементарна для рядового крайэнджиста :D

Теги лежат в папке GameSDK/ Animations/Mannequin/ADB/

Все, осталось выбрать тег в соответствующем Fragment Entity.

Работа с тегами Mannequin editor в коде - student2.ru

Примечание: для дебага тегов используйте команду mn_debug dude

Наши рекомендации