XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Желтая пресса: обучающие статьи
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

 
Алексей
Где кошачья мята?!
offline
Опыт: 26,303
Активность:
Stand 2, Spell-4 и др. Как их проиграть триггерно?
В кинематиках для придания большей реалистичности действию часто используется триггерная команда
Анимация - Play unit animation.
Например, если какой-то герой по сюжету должен прыгать от радости, а он вместо этого стоит неподвижно, получится как-то неестественно. Самый лучший выход в этом случае - проиграть анимацию прыжка. Например, у Лорда Ужаса (Дридлорда) прыжок - это анимация Stand-3. И вот тут-то как раз и возникает проблема. Оказывается, что команда проигрывания анимации работает сразу с группой анимаций. Т.е. при попытке проиграть не Stand, а Stand 2, Stand 3 или Stand 4 результат будет непредсказуемый. Скорее всего, проиграется обычная анимация Stand (она же - Stand 1) или же вообще ничего не проиграется.
В случае с лордом ужаса проблема вполне разрешима - достаточно использовать для кинематики Вариматаса - у него есть анимация прыжка Spell Third, которая проигрывается без проблем.
Но в любом случае, очень обидно, что большинство анимаций юнитов оказываются триггерно недоступными. Особенно обидно бывает, когда импортируешь в карту модель WoW 10Мб весом, а потом оказывается, что из всех тамошних анимаций можно использовать лишь 3-4 штуки. Остальное же - просто мёртвый груз, ибо War вообще не понимает анимации с нестандартными именами (навроде Attack Very-Very Hard).
.
Триггерно решить эту проблему невозможно. А вот у JASS'еров есть шансы. Думаю, многие любители JASS во время просмотра common.j обращали своё внимание на функцию
Код:
native SetUnitAnimationByIndex takes unit whichUnit, 
                                                      integer whichAnimation returns nothing

Судя по её названию, она должна проигрывать анимацию не по имени, а по номеру. Т.е. всё, что надо сделать, это подставить туда номер анимации - и готово, имя не имеет значения!
Эх, если бы всё и впрямь было так просто :(. Blizzard'ы не были бы Blizzard'ами, если бы не придумали очередной способ сверления зубов дракона через задний проход. Т.е. данная функция попросту не работает! Причём абсолютно, все её вызовы просто игнорируются и на анимацию никак не влияют.
.
Так как же всё-таки проиграть нужную анимацию юнита?
Первое, что для этого нужно сделать - создать анимационный тег. Это особый объект, представляющий собой всего лишь список всех анимаций юнита. Создаётся он при помощи ещё одной "загадочной" JASS-функции:
Код:
native AddUnitAnimationProperties  takes unit whichUnit, 
                                                 string animProperties, boolean add returns nothing

Что только о ней не пишут во всяких мануалах! По одной версии, она добавляет новые имена анимаций; по другой - новые анимационные свойства (что бы это значило). В JASSWiki данная функция "поясняется" так: "Добавляет/удаляет анимационные свойства юнита".
На самом же деле она всего лишь создаёт анимационный тег (список анимаций юнита) и "цепляет" его на указанный юнит. Рассмотрим параметры этой функции:
  • whichUnit - всего-навсего тот юнит, анимационный тег которого мы хотим создать (или удалить, т.к. эта же функция способна и удалять анимационные теги).
  • animProperties - имя анимационного тега. Может быть любым. Используется для дальнейших ссылок на анимационный тег. Если ссылки на тег в дальнейшем не понадобятся, то в этом параметре можно передать null. Тогда ссылка на тег теряется и происходит утечка памяти (всем участникам команды DotaTeam рекомендуется всегда передавать сюда null).
  • add - если сюда передать true, то тег создаётся; если false - удаляется (при условии, конечно, что на юните есть тег с указанным именем). Все, кто озабочен утечками, должны непременно удалять теги, когда они становятся ненужными. Все остальные могут упростить себе жизнь и оставить теги неудалёнными (благо в любой кинематике и без того утечек масса).
Кстати, триггерщики для создания тега могут воспользоваться командой
Анимация - Add/Remove unit animation tag. Вообще говоря, это очень странно: создать тег триггеры позволяют, а работать с ним - нет :).
.
Итак, тег создан (для тех, кто забыл - напоминаю: тег есть список всех анимаций юнита). А вот теперь смело вызываем SetUnitAnimationByIndex. Триггерщики могут воспользоваться для этого Custom script:
Код:
call SetUnitAnimationByIndex(gg_unit_hfoo_0002,3)

Первый параметр этой функции - юнит, анимацию которого нужно проиграть. Второй - номер анимации (нумерация идёт с нуля, 0 - это, как правило, Stand 1).
Триггерщикам будет несколько сложновато определять, что нужно написать в качестве юнита :), выглядит это действительно страшновато. Ну что ж, могу посоветовать создать какой-нибудь триггер для тестирования, содержащий всего 1 команду, использующую данный юнит. Затем конвертировать триггер в текст и глянуть имя глобалки юнита. (Надеюсь, я вас ещё не загрузил?)
Вторая проблема - определить номер нужной анимации. WE тут ничем не поможет, т.к. его окошко анимаций сортирует их по алфавиту, а не по номеру. Номер можно определить, открыв файл модели юнита в блокноте (лучше - в виде MDL), War3Viewer, MdlVis, W3ME или подобной программе. После чего просто подсчитать анимации (от нуля), пока не дойдёте до нужной.
.
Итак, ещё раз (кратко, для триггерщиков):
1. Анимация - Add/Remove unit animation tag. Создаётся список анимаций на юните. Достаточно создать тег один раз, и можно проигрывать сколько угодно анимаций для этого юнита.
2. Custom script: call SetUnitAnimationByIndex(gg_unit_XXXX_YYYY,N) предварительно определив имя глобалки, содержащей юнит и номер желаемой анимации.
.
Ну, вроде и всё. Если что-то будет непонятно - пишите. До скорых встреч :end:

Отредактировано Алексей, 11.02.2006 в 12:02.
Старый 11.02.2006, 11:52
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Молодец! Прекрасная статья - авненько хотелось бы играть только одну определённую из аналогичных анимаций типа Stand 2, Stand - 3. Добавлю ещё то, что если вам надо играть анимацию БЕЗ анлогов, тоесть обычную анимацию, когда скажем, юнит тупо стоит и дышет,Ю не вертя башкой, не поигрывая мускулами - то тогда можно использовать такую триггерную функцию -
Play Unit`s animation, specific rarity (using only редко/часто animation). Это должно упростить в ряде лучаев вам жизнь.
Цитата:
Затем конвертировать триггер в текст и глянуть имя глобалки юнита.
Вот эту тему стоило бы описать поподробнее. Я то понял, да вот не каждый забредший сюда новичок поймёт - я о существовании конвертирования до этого года вообще не знал.
Старый 11.02.2006, 12:49
NETRAT

offline
Опыт: 83,712
Активность:
True, true
AddUnitAnimationProperties, мда, вроде тут из названия понятно что тег добавляет...
Алексей, почему про Rarity ничего не написал? можешь осветить все аспекты анимаций?
Старый 11.02.2006, 13:27
Алексей
Где кошачья мята?!
offline
Опыт: 26,303
Активность:
Хорошо, статью доработаю. Вообще-то она рассчитана больше на JASS'еров (только новичков в JASS), но всё равно нужно поподробнее.
Почему про Rarity не написал? Так ведь это и без того все знают! Стандартная команда, в триггерах есть. Вряд ли тут что-то сложное.
А вот все аспекты анимации осветить действительно нужно - т.е. статью я расширю. Только в ней станет ещё больше JASS - и да простят меня те, кто с ним не в ладах.
Старый 11.02.2006, 16:45
N.Sy.Prophet
Йа Байан
offline
Опыт: 13,122
Активность:
Алексей спасибо! зач0т и респект. ;)
Старый 11.02.2006, 17:15
NETRAT

offline
Опыт: 83,712
Активность:
Алексей жасс рулит, я думаю, ты и сам знаешь. Просто чтобы польностью описать часть вара, связанную с анимациями и раскрыть тему - такая статья очень важна при создании кинематиков, к примеру, да и для РПГ карт она имеет большое значение
Старый 11.02.2006, 17:48
MapMan
Corey 8 Taylor
offline
Опыт: 21,554
Активность:
Афтор жжош! Пиши исчо!
Старый 11.02.2006, 18:14
Wulfrein
где я?
offline
Опыт: 88,142
Активность:
Алексей, а чё, если в самой модели взять, напр, анимацию Stand-3 (или другую, которая не проиграется), и создать такую же, тока с именем Spell Third (или ещё как-нибудь) и проигрывать её? (мышление моделлера). ИМХО так проще...

Цитата:
когда импортируешь в карту модель WoW 10Мб весом, а потом оказывается, что из всех тамошних анимаций можно использовать лишь 3-4 штуки.

жж0шь!!!
Старый 11.02.2006, 21:28
Алексей
Где кошачья мята?!
offline
Опыт: 26,303
Активность:
Wolverine: Можно и переименовать. Только в этом случае придётся импортировать изменённую модель в карту, а это +300Кб (а то и больше). Зачем, если нужная модель уже есть в War'е?
Старый 11.02.2006, 21:39
N.Sy.Prophet
Йа Байан
offline
Опыт: 13,122
Активность:
Алексей Ну 300кб ты немного загнул... 150-200, а так полностью согласен.
Старый 11.02.2006, 21:59
Mefist
Is it cocktail hour yet?
offline
Опыт: 98,190
Активность:
аффтар жжот, пеши еще и тд и тп.
как допишешь - скажи, повешу на сайт
Старый 11.02.2006, 23:45
N.Sy.Prophet
Йа Байан
offline
Опыт: 13,122
Активность:
Mefist, погодь.
Алексей загляни в тему "Татурил по Синематике". Там пытаемя помочь МапМену, написать супермегаэксклюзив для ХГМ. Может всунуть туда и твою статью? Выйдет круто, что-то роде "Заметки Синематиста".
Старый 12.02.2006, 09:14
NETRAT

offline
Опыт: 83,712
Активность:
Алексей если найдешь время дополнить статью, дополни ее по ссылке http://xgm.guru/articles.php?section=wc3&name=play_animation
Старый 16.02.2006, 18:12
Toadcop

offline
Опыт: 54,313
Активность:
Я имею лол идею (как всегда :)) !!! короче делаем думми абилы у которых при юзании проигрываютьса разные анимации (много разных дамми абил) потом триггерно добавляем и застовляем юзать и потом удаляем абилу и юзер ничего не замечает ! может некоторые анимы проигрыватьса не будут ! но если полностью трг то SetUnitAnimationByIndex() рулит ! но только для каждой модели индивидуально надо номер анимы писать...
Старый 01.05.2006, 16:54
MPI3
Хм...
offline
Опыт: 24,597
Активность:
Алексей
Как всегда круто!
Старый 01.05.2006, 18:08
MapMan
Corey 8 Taylor
offline
Опыт: 21,554
Активность:
Алексей молодец, статья хорошая, она мне только-что помогла, так что спасибо тебе, и за MdlVis с помощью которого я узнал номер нужной мне анимации!
Ты писал что можно посмотреть и спомощье War3ME но там анимации расположены в алфовитном порядке!
Старый 02.05.2006, 12:16
WildCat
General Mapmaker
offline
Опыт: 10,232
Активность:
недавно гонял одну ВоВовскую модель и заметил, что триггер вызова анимации по номеру работает даже если я предварительно не добавлял юниту анимационного тэга (Анимация - Add/Remove unit animation tag).
К тому же варик вовсе не спешит использовать анимацию из основного набора, если не досчитается таковой в используемом. Скажем, если мы добавим тэг First какому-либо юниту, а у его модели не окажется анимации Stand First, то будет применяться анимация не Stand, а первую (при сортировке в алфавитном порядке) анимацию содержащую слова Stand и First, например Stand Ready First.
Старый 06.05.2006, 23:04
and_y87
Тру Кодер
offline
Опыт: 21,030
Активность:
Надеюсь оно мне поможет...
Статья думую та которую ждали все =)) это я про Stand - 3 =))

MEXAHuK добавил:
Повозился, повозился потом ещё повозился... помогло... =)
Старый 13.05.2006, 13:39
Toadcop

offline
Опыт: 54,313
Активность:
Цитата:
недавно гонял одну ВоВовскую модель и заметил, что триггер вызова анимации по номеру работает даже если я предварительно не добавлял юниту анимационного тэга (Анимация - Add/Remove unit animation tag).
К тому же варик вовсе не спешит использовать анимацию из основного набора, если не досчитается таковой в используемом. Скажем, если мы добавим тэг First какому-либо юниту, а у его модели не окажется анимации Stand First, то будет применяться анимация не Stand, а первую (при сортировке в алфавитном порядке) анимацию содержащую слова Stand и First, например Stand Ready First.
- ОООО !!! ... я это уже 1 год тому назад знал... короче вот карта пример всё проще чем вы думаете !
Прикрепленные файлы
Тип файла: w3x test.w3x (21.8 Кбайт, 41 просмотров )
Старый 13.05.2006, 16:35

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 01:59.