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 ER, 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:

  1. Crea un proyecto C++ third-person vacio y llámalo “MyUE5Project”.

  2. Descarga e integra el plugin FMOD en tu proyecto.

  3. Crea un nuevo proyecto FMOD Studio y define el directorio para construir tus bancos en MyUEProject/Content/FMOD

  4. 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:

 

Click derecho en el graph y busca: “Keyboard Event E“, “Play Event 2D”, and “Get My Event”

 

.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:

 

Click derecho en el graph y busca: “Keyboard Event E“, “Event Instance Is Valid”, ”Get My Event Instance”, “Branch“, “Event Instance Set Paused”, “Get My Event”, “Play Event 2D”, and “Set My Event Instance”

 

.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:

 

Right-click on the graph and search for: “Keyboard Event R“, ”Get My Event Instance”, and “Event Instance Set Paused”

 

.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:

 

Right-click on the graph and search for: “Keyboard Event T“, ”Get My Event Instance”, and “Event Instance Stop”

 

.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);
}
 

EL FIN!

〰️〰️〰️

EL FIN! 〰️〰️〰️

Previous
Previous

Eventos Wwise en Unreal Engine 5 (Post Event) - Game Audio Basics

Next
Next

Propiedades Wwise en Unreal Engine 5 - C++ (Eventos, Estados, RTPCs, y más…)