Eventos FMOD en Unreal Engine 5 (Play Event 2D) - Game Audio Basics
If you prefer to read an English version, click on this button =>
Unreal Engine Version: 5.0.3
FMOD Version: 2.02.07
Este blog post es un guía sobre cómo disparar un Evento FMOD “2D Event” en Unreal Engine 5 usando Blueprints y código C++. Vamos a crear un evento simple de tipo One-shot y otro evento musical de tipo looping/bucle. Adicionalmente, te mostraré un diseño algorítmico simple para manejar el comportamiento de estos eventos.
Para nuestras pruebas, vamos a disparar nuestras acciones presionando las teclas E, R, y T en nuestro teclado. Finalmente, te mostraré como asignar estas teclas a nuestras funciones en blueprints y C++.
Vamos a crear todos nuestros ejemplos blueprints en la clase BP_ThirdPersonCharacter y definir los de tipo C++ en la el archivo MyUE5ProjectCharacter.cpp. Para este tutorial, vamos a aprender como implementar estos eventos usando ambos C++ y Blueprints, entonces asegúrate de abrir ambas clases.
IMPORTANTE!
〰️
IMPORTANTE! 〰️
Prerequisitos:
Crea un proyecto C++ third-person vacio y llámalo “MyUE5Project”.
Descarga e integra el plugin FMOD en tu proyecto.
Crea un nuevo proyecto FMOD Studio y define el directorio para construir tus bancos en MyUEProject/Content/FMOD
Construye el Master Bank
Para que este tutorial tenga sentido, es importante que sepas cómo integrar el plugin FMOD y cómo llamar sus propiedades en Unreal Engine. Adicionalmente, considera leer y consultar mi post anterior sobre UPROPERTY & UFUNCTION:
IMPORTANTE!
〰️
IMPORTANTE! 〰️
Configuración de FMOD:
Abre tu proyecto FMOD y crea dos eventos de tipo 2D Timeline Events, uno llamado “Play_MusicLoop” y otro llamado “Play_OneShot.”
Importa dos archivos de audio dentro de estos eventos, uno corto de tipo one-shot (Un efecto de sonido de tipo UI funciona bien para este ejemplo) y un loop/bucle musical o ambiente. Si prefieres, puedes descargar y usar estos sonidos a continuación.
Selecciona ambos eventos, dales click derecho y asígnalos al Master Bank.
Ahora, construye tu Master Bank.
Regresa a tu proyecto Unreal. Deberías poder ver tus eventos en el Content Drawer dentro de MyUEProject/Content/FMOD/Events.
Configuración C++:
Para simplificar nuestras pruebas, vamos a implementar nuestros eventos dentro del Player Pawn principal. Puedes encontrar la clase C++ padre en MyUE5Project/MyUE5ProjectCharacter y la clase Blueprint heredada/hijo en MyUE5Project/Content/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.
Añade esta directiva de acceso al API FMOD.
.h file:
#include "FMODBlueprintStatics.h"
Declara una propiedad FMOD event y otra Event Instance.
.h file:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Audio") UFMODEvent* myEvent; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Audio") FFMODEventInstance myEventInstance;
Declara tres funciones, PlayEvent(), PauseEvent(), y StopEvent():
.h file:
UFUNCTION(BlueprintCallable, Category="Audio") void PlayEvent(); UFUNCTION(BlueprintCallable, Category="Audio") void PauseEvent(); UFUNCTION(BlueprintCallable, Category="Audio") void StopEvent();
.h file:
Guarda tu código y compila en el editor.
Deberías poder ver estas propiedades en el graph blueprint de tu clase BP_ThirdPersonCharacter:
Sonidos One-Shot:
Este tipo de evntos no requieren mucho control. Estos tienden a ser cortos en longitud, y muchos pueden existir de forma simultanea. En la mayoría de casos, el dispararlos es suficiente para lograr el comportamiento deseado. Podemos definir un numero máximo de instancias y el tiempo de “cool-down” en FMOD Studio.
IMPORTANTE:
Asigna el evento “Play_OneShot" a la propiedad My Event.
Blueprint:
.cpp file:
void MyUE5ProjectCharacter::PlayEvent() { UFMODBlueprintStatics::PlayEvent2D(this, myEvent, true); }
Parámetros/Argumentos:
WorldContextObject (UObject*) = this
El objeto en el mundo donde este evento va a ser asignado, pero no va a seguir a su posición. Usa this como argumento general
Event (UFMODEvent*) = myEvent
El evento FMOD a reproducir
bAutoPlay (bool) = true
Si reproduce el evento apenas se llame a la función o no
.cpp file:
Sonidos de tipo Loop/Bucle:
En la mayoría de casos, para sonidos de tipo loop, no queremos multiples instancias reproduciéndose simultaneamente. La música y ambientes son claros ejemplos de este tipo de sonidos. Para lograr esto, necesitamos un sistema simple que verifique si la instancia de un evento existe o no. Usando una propiedad FMOD Event Instance y algunas técnicas de control de flujo, vamos a crear un algoritmo que verifique si una instancia existe, luego podremos Pausar/Continuar, Detenernos e Iniciar el evento de nuevo. Solo una instancia de este evento será reproducida a la vez.
IMPORTANTE:
Asigna el evento “Play_MusicLoop" a la propiedad My Event.
Play Event:
Blueprint:
.cpp file:
void MyUE5ProjectCharacter::PlayEvent() { if (UFMODBlueprintStatics::EventInstanceIsValid(myEventInstance)) { UFMODBlueprintStatics::EventInstanceSetPaused(myEventInstance,false); } else { myEventInstance = UFMODBlueprintStatics::PlayEvent2D(this, myEvent, true); } }
Parámetros/Argumentos:
paused (bool) = false
Si pausar tu instancia o no
WorldContextObject (UObject*) = this
El objeto en el mundo donde este evento va a ser asignado, pero no va a seguir a su posición. Usa this como argumento general
EventInstance (FFMODEventInstance) = myEventInstance
La propiedad Event Instance a manipular
Event (UFMODEvent*) = myEvent
El evento FMOD a ser reproducido
bAutoPlay (bool) = true
Si reproduce el evento apenas se llame a la función o no
Pause Event:
Blueprint:
.cpp file:
void MyUE5ProjectCharacter::PauseEvent() { UFMODBlueprintStatics::EventInstanceSetPaused(myEventInstance,true); }
Parámetros/Argumentos:
EventInstance (FFMODEventInstance) = myEventInstance
La propiedad Event Instance a manipular
paused (bool) = true
Si pausar tu instancia o no
Stop Event:
Blueprint:
.cpp file:
void MyUE5ProjectCharacter::StopEvent() { UFMODBlueprintStatics::EventInstanceStop(myEventInstance, true); }
Parámetros/Argumentos:
EventInstance (FFMODEventInstance) = myEventInstance
La propiedad Event Instance a manipular
Released (bool) = true
Si liberar el contenido de la instancia después de detenerse
.cpp file:
Blueprint Graph Completo:
Extra - Todo en C++?:
Si prefieres quedarte completamente en C++, Te mostraré como crear una referencia directa deI FMOD AudioEvent y cómo asignar teclas de tu teclado para disparar tus funciones.
Referencia directa a un asset o recurso:
Ve al Content Drawer y encuentra el evento del cual quieres una referencia, da click derecho en él y selecciona Copy Reference para obtener la ruta de tu evento.
Abre tu archivor .h, y pega la ruta en tu propiedad FMOD event dentro de TEXT(“ “) como un argumento:
.h file:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Audio") UFMODEvent* myEvent = LoadObject<UFMODEvent>(nullptr, TEXT("FMODEvent'/Game/FMOD/Events/Play_OneShot.Play_OneShot'"));
Asignación De Teclas A Funciones:
Dentro del archivo .cpp, encuentra la función SetupPlayerInputController() y añade tus asignaciones de teclado aquí. Estas líneas de código logran lo mismo que llamar “Keyboard Events” en Blueprints al asignar las teclas E, R, y T a tus funciones PlayEvent(), PauseEvent(), y StopEvent().
.cpp file:
void AMyUE5ProjectCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) { PlayerInputComponent->BindKey("E", IE_Pressed, this, &AMyUE5ProjectCharacter::PlayEvent); PlayerInputComponent->BindKey("R", IE_Pressed, this, &AMyUE5ProjectCharacter::PauseEvent); PlayerInputComponent->BindKey("T", IE_Pressed, this, &AMyUE5ProjectCharacter::StopEvent); }