Audio Listener 2D Para Música y UI en Unreal Engine y Wwise
If you prefer to read an English version, click on this button =>
Unreal Engine Version: 5.3.2
Wwise Version: 2023.1.0
Este blog post muestra cómo registrar un listener 2D (Audio No Espacializado) y un Objecto Wwise para reproducir música y sonidos UI que no requieren de posicionamiento 3D en el mundo del juego. Estos objetos Wwise son registrados usando un Manager de Audio y no son destruidos en transiciones de nivel, lo que significa que la reproducción de audio no es interrumpida. Esta implementación no es posible usando scripting visual, pero muestro cómo exponer algo de su funcionalidad a Blueprint.
Aquí la lista de herramientas y términos esenciales usados en este proyecto:
Programé toda la funcionalidad dentro de la clase MyAudioSubsystem (Audio Manager), y usé el Blueprint del nivel para llamar a los playlist de música en Beginplay()
Importante:
Ten en consideración que esta guía no pretende enseñar diseño de sonido creativo. En cambio, se enfoca exclusivamente en aspectos de implementación y programación de game audio.
Descarga el Proyecto Aquí:
IMPORTANTE!
〰️
IMPORTANTE! 〰️
Prerequisitos:
Crea un proyecto C++ third-person llamado “MyUEProject.”
Descarga e integra el plugin Wwise desde el Wwise Launcher.
Activa Enable Auto-Defined SoundBanks en las propiedades Wwise Project Settings
Para que este tutorial tenga sentido, es importante que sepas cómo integrar el plugin Wwise en Unreal Engine. Adicionalmente, considera leer y consultar mi post anterior sobre UPROPERTY & UFUNCTION y Cómo crear un Audio Manager en Unreal Engine:
IMPORTANT!
〰️
IMPORTANT! 〰️
Wwise Music Sequence
Para este sistema, importé una secuencia musical simple con dos capas (tracks de música). Coloqué el marcador de salida (post-exit) en la posición correcta.
Creé un playlist container y definí que el segmento musical se reproduzca en un loop infinito.
Añadí un grupo de estados con con dos estados, Layer1 y Layer2. Definí un fade de volumen simple en el Layer2 cuando el estado Layer1 esté activo.
Finalmente, creé un evento de audio que apunta al playlist musical. Añadí un retardo de 0.5 segundos para que la música no empiece inmediatamente cuando el mundo es creado.
En Unreal Engine, usé el Wwise Browser para actualizar, generar soundbanks y consolidar assets. Un nuevo evento de Wwise .uasset se muestra en el directorio correcto.
Implementación C++
El primer paso en cualquier implementación C++ es incluir todas las dependencias necesarias en el archivo build.cs
Estas son necesarias para compilar el proyecto con el plugin Wwise.
MyUEProject.build.cs
Registro de los Objectos Music & UI y Listener:
Cree un Game Instance Subsystem cómo mi Manager de Audio. Al usar este método, me aseguro de que estos objetos van a ser registrados antes de que cualquier mundo de juego sea instanciado y no se destruyan en las transiciones. Además, estas funciones son globalmente accesibles.
Asignar nuevos Ak Game Objects:
Para incluir estos cámpos, añadí
#include "AkGameObject.h"
MyAudioSubsystem.h
Registrar Ak Objects en Initialize():
Llamé a la función virtual Initialize() desde MyAudioSubsystem y declaré una nueva función que registra a estos nuevos Ak Game Objects llamada RegisterAkGameObjects(). Adicionalmente, definí la configuración de canales de estos objectos cómo stereo y deshabilité su espacialización.
MyAudioSubsystem.h
Para obtener el puntero de Wwise Sound Engine, añade
#include "Wwise/API/WwiseSoundEngineAPI.h"
MyAudioSubsystem.cpp
Reproducir y Detener la Música:
Creé una función para reproducir un Ak Audio Event en el objeto MUSIC_AND_UI_OBJECT registrado.
MyAudioSubsystem.h
MyAudioSubsystem.cpp
Niveles y Blueprints
Creé dos niveles. Cada uno contiene un set de actores de tipo Trigger Box actors para llamar a las nuevas funciones de audio en OnActorBeginOverlap()
Implementación del Blueprint de Nivel:
El Blueprint de nivel tiene accesso a cada actor que contiene, entonces es un lugar excelente para prototipar este sistema rápidamente. Para obtener una referencia a los Trigger Boxes, selecciona uno de estos actores en el viewport, da click derecho en el graph y encuentra todos sus eventos en la lista.
Transición a Nivel:
Cuando el jugador se superpone con el actor trigger box, transiciona a otro nivel.
Detener el Evento Musical:
Cuando el jugador se superpone con el actor trigger box, llama a StopCurrentMusicEvent() en el AudioSubsystem
Reproducir un Nuevo Evento Musical:
Después de que el nuevo mundo de juego es creado, define un nuevo estado y reproduce un nuevo evento musical. PlayNewMusicEvent() es llamado en AudioSubsystem y sólo va a reproducir un nuevo evento si su ID es diferente al evento que se está reproduciendo actualmente.
Wwise Profiler
Verificar que este sistema está correctamente configurado, es muy fácil usando el Wwise profiler.
Conecta el Wwise Profiler al editor
Abre el Advanced Profiler
El nuevo Listener 2D es registrado con el motor y se escucha a si mismo y al objeto de Música y UI. El profiler también muestra que la espacialización no está activada en estos objetos.
En la pestaña Voices Graph, es fácil verificar que el evento de música se reproduce desde el objeto de Música y UI, y es enviado (escuchado) al Listener (Non-World).
Qué hay de los sonidos UI?
Los sonidos UI no requieres de mucho control tal como los eventos musicales, entonces reproducirlos sobre el objeto de Música y UI es suficiente.
MyAudioSubsystem.h
MyAudioSubsystem.cpp