Внимание, данная статья предназначена для тех, кто работает или собирается работать на Godot версии 4.3 и позже! Если вы не собираетесь переходить на Godot 4.3, можете не читать эту статью.

В Godot 4.3 было добавлено три класса наследующих AudioStream: AudioStreamInteractive, AudioStreamPlaylist и AudioStreamSynchronized. Сейчас нам интересен класс AudioStreamInteractive, который позволит нам сделать нашу музыку динамической.

(Для тех, кто не знает) Что вообще такое динамическая музыка?

Динамическая (адаптивная) музыка — это музыка, ритм или тон которой меняется в зависимости от текущих действий в игре.

Проще говоря, если, например, в игре вокруг спокойствие, рядом никого нет, игрок в безопасности, то на фоне играет спокойная мелодия, но стоит появиться какому-нибудь монстру в поле зрения игрока, как тут же спокойная мелодия дополняется новыми элементами, тем самым превращаясь в боевую.

Если вы так и не поняли, что это, наберите в вашей поисковой системе "Адаптивная музыка" и напишите в комментариях под этой статьёй, что я ужасно объясняю.

Итак, за дело! Как пользоваться AudioStreamInteractive?

Вы можете почитать обсуждение и скачать демо оттуда: https://github.com/godotengine/godot/pull/64488

Здесь используются звуковые файлы из этого демо.

Для начала создадим AudioStreamPlayer/2D/3D и добавим в параметр Stream AudioStreamInteractive:

AudioStreamInteractive создан! Теперь нам нужно добавить новый клип:

Параметры Name и Stream нам понятны, в параметре выше, Initial Clip, задаётся клип, который должен проигрываться при запуске всей этой цепочки клипов. Но что за параметр Auto Advance? А что за кнопочка внизу Edit Transitions?

Если параметр Auto Advance включён и задан следующий клип (параметр Next Clip), то после проигрывания текущего клипа AudioStreamInteractive автоматически переключится на выбранный клип:

Но, если вы внимательно пригляделись к gif или попробовали сделать всё вышенаписанное, вы могли заметить, что клип под названием "intro" должен сменяться немного раньше, а не под конец.

Чтобы исправить это, нажмите два раза по вашему звуковому файлу, который вы хотите обрезать. Появится такое окно:

Здесь вы можете задать вашей мелодии количество ударов в минуту (BPM), задать количество битов (Beat Count), тем самым обрезав мелодию (сам звуковой файл не обрезается), задать количество тактов (Bar Beats), а также повторение музыки (Loop).

Параметры мы задали, теперь смотрим результат:

Клип под названием "intro" теперь не доходит до конца, а сменяется в заданный момент.

Давайте расширим музыку

Давайте добавим ещё один клип, "high":

Но мы не хотим, чтобы по окончании клипа "low" начинался клип "high". Это же адаптивная музыка или как?

Прокрутите инспектор вниз, ничего не заметили нового?

Parameters
Parameters

Раскройте его и увидите параметр Switch to Clip, который как раз нам и нужен.

При проигрывании, то есть при включённом Playing у аудиоплеера, вы можете переключать клипы с помощью этого параметра:

Если вам не нравится, что при переключении клипа следующий клип начинается с самого начала, то вы можете редактировать переходы.

Нажмите на кнопочку "Edit Transitions":

Появится окно с таблицей и параметрами перехода клипов:

Соответствуя столбцам, выделите одну из ячеек и отредактируйте переход как вам надо.

Пробежимся по параметрам:

  • Use Transition — включите его, если вы хотите отредактировать этот переход;

  • Transition From — переход от: немедленно (Immediate), следующего бита (Next Beat), следующего такта (Next Bar), конца клипа (Clip End);

  • Transition To — переход к: той же позиции (Same Position), началу клипа (Clip Start), позиции, на которой клип останавливался в последний раз (Prev Position);

  • Fade Mode — режим затухания, время затухания зависит от параметра Fade Beats. Поэкспериментируйте с этим параметром;

  • Fade Beats — время затухания при переходе (в ударах);

  • Filler Clip — клип, который должен проигрываться при переходе между двумя клипами.

Переходы мы редактировали, смотрим результат:

Отлично, клипы переключаются так, как мы задумывали.

Вы можете скачать демо c обсуждения и поиграться с клипами, чтобы лучше понять, как это устроено.

Переключение клипов при помощи кода

Надо же как-то переключать клипы при помощи кода. Например при вхождении игрока в триггер клип должен переключиться и т. п.

Простой способ переключить клип при помощи скрипта — переключение с помощью set().

$AUDIOPLAYER.set('parameters/switch_to_clip', 'CLIP_NAME')

Где AUDIOPLAYER — ваш аудиоплеер, CLIP_NAME — название клипа, на который вы хотите сменить.

Если вы не знаете, как получить сам путь свойства, нажмите ПКМ по свойству и нажмите "Copy Property Path" (Скопировать путь свойства):

#Пример переключения клипа с помощью кода:

func _ready() -> void:
	await get_tree().create_timer(10.0).timeout # Ждать 10 секунд.
	danger() # Опасность!

func danger() -> void:
	$AudioStreamPlayer.set('parameters/switch_to_clip', 'high') # Переключает клип.

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


  1. Arkology
    18.11.2024 06:25

    $AudioStreamPlayer.set('parameters/switch_to_clip', 'high') # Переключает клип.

    Настраивать параметры через set() не рекомендуется, потому что это медленнее (поскольку оба аргумента строки), менее читабельно и есть шанс ошибиться в названиях. Лучше настраивать через соответствующие функции, в данном случае, согласно доке, через switch_to_clip_by_name()

    Кстати, про шанс ошибиться в названиях. Вы точно уверены, что switch_to_clip ? Потому как он принимает на вход не String / StringName, а int.


  1. CitizenOfDreams
    18.11.2024 06:25

    Ты побеждаешь босса.

    Надпись "уровень пройден" почему-то не появляется.

    Музыка становится тревожной.

    У нее теперь есть слова.

    На латыни.