WarCraft 3: Нестандартные звуки анимаций

» Раздел: Моделлинг
» Автор оригинала: Monoroh

О статье

Доброго времени суток, уважаемые пользователи XGM!
В данной статье мы подробно рассмотрим как прикрепить к анимациям модели нестандартные звуки. План:
  1. Выбор модели и анимаций.
  2. Выбор звуков и конвертирование их в корректный формат.
  3. Работа с таблицами AnimLookups.slk и AnimSounds.slk.
  4. Присоединение звуков к анимациям.
  5. Импорт в игру.
(Весь используемый мной материал).
Ну что, приступим!

Подготовка

Используемые программы:

  1. Любой MPQ редактор. (Я использую Ladik's MPQ Editor v3.6.0).
  2. Любой аудио-конвертер, который умеет в wav.
  3. War3 Model Editor (Я использую 1.07).
  4. Любой редактор, который умеет работу с таблицами, например Microsoft Excel.

Выбор модели и анимаций.

Здесь вы можете выбрать любую модель, но я рассмотрю на примере своей модели Военачальника Горианской Империи. Сразу определимся к каким анимациям мы хотим прикрепить звуки. Я выбрал Attack, Attack 2, Attack 3, Attack Slam, Death.

Выбор звуков и конвертирование их в корректный формат.

Для анимаций Attack, Attack 2, Attack 3, я выбрал:
OgreNewAttackEffort1
OgreNewAttackEffort2
Для анимации Attack Slam, я выбрал:
OgreNewCriticalAttack1
Для анимации Death, я выбрал:
OgreNewDeath1
Важно: Для того, чтобы звук воспроизводился в игре корректно и вообще воспроизводился, нужно обязательно сконвертировать в wav:
  1. Sample rate: 22 050 Частота дискретизации
  2. Bit Depth: 16 Битрейт
  3. Channels: Mono аудио-каналы

Работа с таблицами AnimLookups.slk и AnimSounds.slk

С помощью MPQ редактора, мы открываем war3x.mpq до 1.29 включительно, я прикрепил таблицы к статье для тех, у кого 1.30 и выше. Проходим по пути UI\SoundInfo\ и экспортируем файлы: AnimLookups.slk и AnimSounds.slk.

Открываем AnimLookups.slk

Видим три столбца:
AnimSoundEvent, SoundLabel, InBeta.
  1. AnimSoundEvent - здесь вводим 4-х значный идентификатор. Придумываем любой, но отличный от уже существующих. Я выбрал MNR1, MNR2, MNR3 (MNR сократил мой ник Monoroh :))
  2. SoundLabel - здесь что-то вроде описания того, какой звук будет воспроизводиться. Можно написать все, что угодно, но рекомендую писать под название анимаций, для которых этот звук будет воспроизводиться, чтобы самим не запутаться. Я выбрал OgreNewDeath, OgreNewAttack, OgreNewCriticalAttack.
  3. InBeta - от него ничего не зависит, я так полагаю это идентификатор версий. Я везде проставил 1.
На выходе получается вот такая табличка:
AnimSoundEventSoundLabelInBeta
MNR1 OgreNewDeath 1
MNR2 OgreNewAttack 1
MNR3 OgreNewCriticalAttack 1
Сохраняем, закрываем.

Открываем AnimSounds.slk

  1. Опускаемся в самый низ и в первый столбец (SoundName) вводим значение столбца SoundLabel из таблицы AnimLookups.slk. Соответственно это будет OgreNewDeath, OgreNewAttack, OgreNewCriticalAttack.
  2. Во второй столбец FileNames вписываем название аудиофайла, который будет воспроизводиться. Соответственно: OgreNewDeath1.wav; OgreNewAttackEffort1.wav,OgreNewAttackEffort2.wav; OgreNewCriticalAttack1.wav. Обратите внимание, что в строку OgreNewAttack, во второй столбец мы вписали два звука OgreNewAttackEffort1.wav,OgreNewAttackEffort2.wav через запятую. Это значит, что при воспроизведении анимаций атак, мы будет слышать либо первый, либо второй звук (рандомно).
  3. В третий столбец DirectoryBase мы прописываем путь, где буду находиться наши звуки. Я выбрал Units\Creeps\OgreNew.
  4. Остальные столбцы я заполнял по образцу соответствующих стандартных звуков. Например для OgreNewDeath я взял значения стандартного звука смерти Огра OgreDeath, а для OgreNewAttackEffort1.wav, OgreNewAttackEffort2.wav, OgreNewCriticalAttack1.wav я взял значения звуков атак Повелителя зверей BeastmasterAttack. Параметры очень гибкие, например можно отстроить дистанцию слышимости, изменяя параметры столбцов MinDistance, MaxDistance, DistanceCutoff, но я решил не импровизировать и оставить стандартные значения Blizzard.
На выходе получается такая табличка:
SoundNameFileNamesDirectoryBase
OgreNewDeath OgreNewDeath1.wav Units\Creeps\OgreNew
OgreNewAttack OgreNewAttackEffort1.wav,OgreNewAttackEffort2.wav Units\Creeps\OgreNew
OgreNewCriticalAttack OgreNewCriticalAttack1.wav Units\Creeps\OgreNew
» Остальные столбцы
Сохраняем, закрываем.

Присоединение звуков к анимациям.

Итак, приступаем к самому вкусному, а именно присоединение звуков к анимациям. Делать мы это будем в War3 Model Editor'е. Но сначала подготовим его.
Идем в директорию, куда вы распаковали War3 Model Editor. Заходим в папку Data и там с помощью любого текстового редактора открываем файл SoundData. Спускаемся в самый низ и дописываем строчки:
MNR1 OgreNewDeath
MNR2 OgreNewAttack
MNR3 OgreNewCriticalAttack
Сохраняем, закрываем.
Для чего эти манипуляции?...
Дело в том, что War3 Model Editor берет значения идентификаторов звуков не из таблиц как нам всем казалось и хотелось AnimLookups и AnimSounds, которые благополучно лежат в файлах игры, а как раз таки из этого SoundData файла. Проще говоря, если бы мы не добавили эти строчки в SoundData, то War3 Model Editor не увидел бы наши новые значения.

Ключевые кадры

Теперь открываем War3 Model Editor.
File>Open>Наша модель.mdx.
Теперь нам нужны ключевые кадры анимаций, с которых будет воспроизводиться звук. Для этого идем в Windows > Sequence Manager. Открывается список анимаций. Делаем двойной клик по анимации Attack. Открывается окно Sequence: Запоминаем значение графы From:
Так же проделываем для анимаций Attack 2, Attack 3, Attack Slam, Death.
Вот мы получили значения нужных нам кадров.

Привязка

Далее идем во вкладку Windows>Node Manager.
Перед нами список костей. Все событийные объекты привязываются к главной кости. Часто эти кости называются по-разному. Например bone root, root и т.д. В нашей модели это кость bone_b0 .
Кликаем на bone_b0 правой кнопкой мыши, и жмякаем Create Event Object. Появился объект под названием UNNAMED.
Кликаем по нему два раза, или правой кнопкой мыши>Edit . Открывается окно:
Правый клик по области Event Tracks > Create New.
Открывается окошко Enter a Track Time. В него мы вводим номер кадра, с которого будет воспроизводиться наш звук. Соответственно для анимации Attack вводим значение 74195.
Type оставляем SND (Sound).
Data разворачиваем список и ищем MNR2 - OgreNewAttack. либо в строку ниже вводим MNRH2
Т.к. анимации Attack 2 и Attack 3 будут воспроизводить те же звуки, что и анимация Attack, то мы сюда же добавляем значения анимаций Attack 2, Attack 3. По итогу должно получиться вот так:
Жмем Ок и видим наш объект. Вот, собственно, мы и добавили звуки атак :)
Так же проделываем и для остальных анимаций:
Attack Slam
Death
Итог. Объекты переименовались в тип объекта x идентификатор.
Сохраняем модель. File > Save
Добавление звуков закончено. Осталось только правильно импортировать в игру.

Импорт в игру

Способы:

Осталось дело за малым. Импортировать в игру. Выделю несколько способов:
  1. Добавить в архив war3x.mpq с заменой где нужно. до 1.29 включительно
  2. Добавить в карту.
  3. Создать отдельный архив war3mod.mpq и закинуть туда, не заменяя стандартные файлы. до 1.29 включительно

Пути импорта:

» Для таблиц:
UI\SoundInfo\AnimLookups.slk
UI\SoundInfo\AnimSounds.slk
» Для звуков:
Units\Creeps\OgreNew\OgreNewAttackEffort1.wav
Units\Creeps\OgreNew\OgreNewAttackEffort2.wav
Units\Creeps\OgreNew\OgreNewCriticalAttack1.wav
Units\Creeps\OgreNew\OgreNewDeath1.wav
» Для модели и текстур:
Убрать war3imported из пути.

Заключение

Вот мы и научились прикреплять нестандартные звуки к анимациям :).
Спасибо за внимание! :)

Просмотров: 308

» Лучшие комментарии


Komkozavr #1 - 4 недели назад -17
Э. Зачем это?

Но статья хорошая. Хоть одна качественная и полезная статья появилась в библиотеке статей xgm.
Свиборг #2 - 3 недели назад 4
Хорошая статья!
Кстати, Sound Data править совсем не обязательно, достаточно просто забить ИД звука вручную в графу EventData. Ещё можно написать, что в AnimSounds есть интересные параметры priority (приоритет звука над другими, например при более высокой priority для звука смерти он будет заглушать звуки выстрелов и наоборот) и Volume - уровень громкости, правда, там сильно увеличить громкость не получится.