Проблема
Вы попробуете добавить AudioStreamPlayer в Godot на вашего моба/монету и т. д., чтобы воспроизводить звук при смерти объекта или его сборе. Но проблема заключается в том, что при удалении объекта с ним также исчезает аудио-плеер, обрывая звук. Вам нужен более простой способ управления воспроизведением звука.
Решение
Мы решим эту проблему с помощью узла, доступного из любого места в SceneTree. Этот узел управляет набором узлов AudioStreamPlayer и очередью звуковых потоков для воспроизведения.
Создайте новый скрипт в редакторе скриптов.
extends Node
var num_players = 8
var bus = "master"
var available = [] # The available players.
var queue = [] # The queue of sounds to play.
func _ready():
# Create the pool of AudioStreamPlayer nodes.
for i in num_players:
var p = AudioStreamPlayer.new()
add_child(p)
available.append(p)
p.finished.connect(_on_stream_finished.bind(p))
p.bus = bus
func _on_stream_finished(stream):
# When finished playing a stream, make the player available again.
available.append(stream)
func play(sound_path):
queue.append(sound_path)
func _process(delta):
# Play a queued sound if any players are available.
if not queue.empty() and not available.empty():
available[0].stream = load(queue.pop_front())
available[0].play()
available.pop_front()
Установите этот скрипт как автозагрузку в настройках проекта. Дайте ему легко узнаваемое имя, например, «AudioStreamManager».


В любом месте вашего проекта, где вы хотите воспроизвести звук, используйте:
AudioStreamManager.play("res://path/to/sound")
Пример проекта
Ниже вы можете скачать пример проекта, демонстрирующего использование узла аудио-менеджера. Этот проект считывает папку с аудиофайлами и создает сетку кнопок. Нажмите на кнопку, чтобы воспроизвести звук.


Вверху вы можете видеть живую статистику аудио-менеджера.
Скачайте этот проект
Скачайте код проекта здесь: https://github.com/godotrecipes/audio_manager