Как заставить Ваши анимированные модели
издавать звуки. Наверно многие, просматривая модели в Модельвьювере (HLMV), удивлялись тому факту, что некоторые модели издают звуки во время анимации. Удивлялся и я. И даже думал, что за этот процесс отвечает некий кусок кода игры . Потом разобрался как это сделано. Все звуки (а точнее эвенты (event)) вставляются в модель на этапе подготовки QC файла для компилирования модели. Это не очень сложно сделать, и этому процессу посвящён этот небольшой тутор. Статья для тех, кто уже освоил компиляцию моделей, и поэтому я не буду распространяться о том, как делать QC файл «с нуля». Перейду сразу к делу. Итак - у вас есть модель с какой-то анимацией. Например, у вас есть некий механизм, делающий несколько манипуляций и вы хотите эти манипуляции озвучить, не прибегая к средствам маппинга (ambient_generic). Сначала подбираете звуки для движений вашего механизма, кладёте (в нужном формате) в папку звуков и прописываете их в скриптовом файле мода.
Пример. Механизм делает движение неким «манипулятором», подводя его к нужному месту, останавливает «манипулятор», включает на конце «манипулятора» некий «доводчик» и потом, к примеру, некоторое время «пыхтит». Предположим, это анимация будет называться «open». Потом механизм делает всё это в обратном порядке до исходного состояния и эту анимацию назовём «close». В такой анимации нам нужно минимум три звука. - «Лупленый» (loop) звук движения манипулятора. (manipulator_loops.wav)
- Звук «доводчика». (pump_move.wav)
- Звук «пыхтения». (mech_pump.wav)
Примечание: при движении модели звуки стартуют и останавливаются не по времени от начала анимации (в секундах) а по номеру фрейма в Вашей анимации и поэтому длительность не «лупленых» звуков надо подбирать вручную или рассчитывать по количеству фреймов каждого движения. Я рассчитывал по секундомеру.Звуки подготовлены в скриптах, прописаны и лежат где надо. Звуки в папке «моймод\sound\ambient» а скрипт файл в папке «моймод\scripts». И не забудьте, что ваш скрипт «моймод_ambient.txt» файл должен быть прописан в скрипт файле «моймод_manifest.txt». Как это выглядит в скрипте у меня: "mech.manipulator_loop" {
"channel"
"CHAN_STATIC" "soundlevel" "SNDLVL_80dB" "volume"
"VOL_NORM" "pitch" "PITCH_NORM" "wave"
"ambient/manipulator_loops.wav"
} | "mech.pump_move" {
"channel"
"CHAN_STATIC" "soundlevel" "SNDLVL_80dB" "volume"
"VOL_NORM" "pitch" "PITCH_NORM" "wave"
"ambient/pump_move.wav"
} | "mech.pump_job" {
"channel"
"CHAN_STATIC" "soundlevel" "SNDLVL_80dB" "volume"
"VOL_NORM" "pitch" "PITCH_NORM" "wave"
"ambient/mech_pump.wav"
}
|
Приступим к редакции QC файла. До добавления звуков секция анимаций выглядела примерно так: $sequence idle_open
"mech_idle_open" fps 30.00 $sequence idle_close "mech_idle_closed"
fps 30.00 $sequence open "mech_opening" fps 30.00 $sequence close
"mech_closed" fps 30.00
| mech_idle_open , mech_idle_closed , mech_opening , mech_closed – названия SMD файлов анимаций.
idle_open , idle_close , open , close – названия анимаций, которые вы увидите в свойствах модели в Хаммере или Модельвьювере. Предположим, что у вас 100 фреймов в Вашей анимации (начинается с «0» и кончается «99»). С 0 по 70-й движение манипулятора, с 71 по 90-й движение доводчика и с 91 по 99 -й звук помпы. В анимации «open» звуки будут стартовать с начальных фреймов движений. В анимации «close» - в обратном порядке. Стоповые фреймы звуков становятся стартовыми, и фреймы идут в обратном порядке. (фрейм №0 для анимации «open» становится фреймом №99 для анимации «close»). В результате этот кусок QC будет выглядеть так: $sequence idle_open "mech_idle_open" fps 30.00 $sequence idle_close
"mech_idle_closed" fps 30.00 $sequence open "mech_opening" fps 30.00 { {
event AE_CL_PLAYSOUND 0 " mech.manipulator_loop " } { event
AE_CL_STOPSOUND 70 " mech.manipulator_loop " } { event AE_CL_PLAYSOUND
71 " mech.pump_move " } { event AE_CL_PLAYSOUND 91 " mech.pump_job "
} } $sequence close "mech_closed" ACT_IDLE 1 fps 30.00 { { event
AE_CL_PLAYSOUND 0 " mech.pump_job " } { event AE_CL_PLAYSOUND 10 "
mech.pump_move " } { event AE_CL_PLAYSOUND 70 " mech.manipulator_loop "
} { event AE_CL_STOPSOUND 99 " mech.manipulator_loop " } }
| В общем тут всё понятно. Принудительно останавливать необходимо ТОЛЬКО LOOP звуки. Хотя, если Вам лень сидеть с секундомером – вы можете использовать все звуки LOOPленые и останавливать их в нужный момент.
Вот и всё ребята..
|