In diesem Tutorial lernen wir, wie man FMOD Events in Unreal Engine 4 abspielt, indem man die Blueprint-Nodes des FMOD Integration Plugins verwendet und einfachen C++ Code schreibt.
Inhaltsverzeichnis
Wiedergabe von FMOD Events mit dem FMOD Ambient Sound Actor
Der FMOD Ambient Sound ist ein Actor, der ein FMODAudio Component enthält. Suche nach dem Ambient Sound in den Modes-Tab auf der linken Seite des Editors und ziehe ihn in den Level:
Wir können das FMOD Event in dem Details Tab auswählen und entscheiden, ob das Event zu Beginn des Spiels automatisch gestartet werden soll, indem wir das Kontrollkästchen Auto Activate aktivieren:
Wenn du den Sound manuell aktivieren möchten, konvertiere den Actorzu einer Blueprint-Class und verweise auf den FMODAudioComponent. Verwende anschließend den Play Node, um den Sound abzuspielen:
Wiedergabe von FMOD Events mit Hilfe von Blueprints
Die FMOD Integration stellt uns verschiedene einfach zu bedienende Blueprint-Nodes zur Verfügung, mit denen wir FMOD Events abspielen und managen können. Werfen wir einen Blick auf die verschiedenen Nodes.
Abspielen eines 2D FMOD Events
Um ein 2D FMOD Event in Unreal Engine 4 abzuspielen, können wir den Play Event 2D Node verwenden:
Wir verbinden den Event BeginPlay Node mit dem Play Event 2D Node, wählen ein 2D-Event im FMODEvent Object Reference Feld aus und starten das Level. Der Sound wird zu Beginn des Levels abgespielt.
Wenn die Auto Play Bool aktiv ist, startet das Event automatisch und gibt die Instanz nach Beendigung der Wiedergabe aus dem Arbeitsspeicher frei. Da der Node eine FMOD Event Instance zurückgibt, könnten wir auch darüber nachdenken, selbst zu entscheiden, wann wir die Instanz freigeben wollen, und wir können das auch manuell tun, indem wir die Nodes Event Instance Play und Event Instance Release verwenden:
Wiedergabe eines Loops
Zusätzlich zum Release Node haben wir Zugriff auf den Event Instance Stop Node, mit dem wir z.B. ein Loop stoppen können:
Die Release Checkbox gibt die Instanz automatisch aus dem Arbeitspeicher frei. Wenn wir die Release Checkbox deaktivieren, müssen wir die Instanz manuell über den Event Instance Release Node freigeben.
Abspielen eines 3D FMOD Events
Wenn wir den Play Event 2D Node verwenden und ein 3D Event aus der Event Dropdown-Liste auswählen, wird der Sound verräumlicht und im 3D Raum an der Location des Actors abgespielt. Der Play Event 2D Node verwendet den Play Event at Location Node unter der Haube. Das bedeutet auch, dass sich das Event nicht mit dem Actor bewegt. Wenn wir die 3D-Koordinaten der Event Instance noch aktualisieren wollen, können wir dafür den Event Instance Set Transform Node verwenden:
In diesem Blueprint erhalten wir einfach die Event Instance vom Play Event 2D Node und überprüfen, ob die Event Instance gültig ist und aktualisieren die 3D-Attributes der Instanz über den GetActorLocation Node.
PlayEventAttached
Wir können auch den Play Event Attached Node verwenden, um ein FMOD Event an einen Component anzuhängen. Die 3D-Attributes des Events werden dann automatisch aktualisiert:
Hier hängen wir das Event an den Root-Component an und spielen das Event ab, wenn wir die Taste 1 drücken. Dieser Node gibt ein FMODAudio Component zurück, daher verwenden wir die Stop und Release Nodes, um die Instanz zu stoppen und sie aus dem Arbeitsspeicher zu befreien.
FMOD Events mit C++ Code wiedergeben
Das Abspielen von FMOD Events durch das Schreiben von C++ Code ist ebenfalls sehr einfach. Wir können mit den gleichen Blueprint-Nodes im Code arbeiten oder direkt auf die FMOD Studio API zugreifen.
Vorbereitung für die Wiedegabe von FMOD Events mit C++
Für alle C++ Beispiele werde ich das ThirdPersonExample verwenden, das beim Starten der Unreal Engine erstellt werden kann. Wir arbeiten direkt innerhalb von Character.h und Character.cpp.
Gehe in den Projekteinstellungen von Unreal in den Input-Einstellungen und erstelle zwei neue Action Mappings:
Wir spielen einen Sound ab, wenn wir die Taste 1 auf unseres Keyboards drücken, und stoppen den Sound mit der Taste 2.
Füge in der ThirdPersonCharacter Header-Datei FMODBlueprintStatics.h
hinzu und deklariere eine UFMODEvent
Variable mit dem UPROPERTY
Makro:
UPROPERTY(EditAnywhere, Category = "FMOD")
class UFMODEvent* Event;
Der Property Specifier EditAnywhere ermöglicht es uns, das Event im Details-Tab unseres ThirdPersonCharacters anzuzeigen und auszuwählen:
Deklariere die FFMODEventInstance
Variable, die ein Wrapper für FMODs Event Instances ist:
FFMODEventInstance InstanceWraper;
Deklariere in der gleichen Header-Datei die Funktionen PlaySound
und StopSound
:
void PlaySound();
void StopSound();
Bevor wir fortfahren, fügen wir auch FMODBlueprintStatics.h
hinzu und binden die beiden Action Mappings in der SetupPlayerInputComponent-Funktion der Character.cpp-Datei ein:
// FMOD
PlayerInputComponent->BindAction("PlaySound", IE_Pressed, this, &ATutorialCharacter::PlaySound);
PlayerInputComponent->BindAction("StopSound", IE_Pressed, this, &ATutorialCharacter::StopSound);
Abspielen und Stoppen eines FMOD Events mit C++
Wir können nun endlich die beiden Funktionen implementieren, die wir zuvor deklariert haben. In der Datei Character.cpp spielen wir ein Event ab, indem wir PlayEvent2D aufrufen. PlayEvent2D gibt eine FFMODEventInstanz zurück. Wir weisen den Rückgabewert der FFMODEventInstance dem InstanceWrapper zu:
void ATutorialCharacter::PlaySound()
{
InstanceWrapper = UFMODBlueprintStatics::PlayEvent2D(GetWorld(), Event, true);
}
Durch den Zugriff auf die FFMODEventInstance können wir die aktuelle Event Instance erhalten und die Event Instance über die Studio API von FMOD stoppen und freigeben:
void ATutorialCharacter::StopSound()
{
InstanceWrapper.Instance->stop(FMOD_STUDIO_STOP_ALLOWFADEOUT);
InstanceWrapper.Instance->release();
}
Kompiliere die Solution und wähle dann das gewünschte FMOD Event im Details-Tab des Charakters in der Engine aus, starte das Spiel und drücke die Taste 1 zum Abspielen und 2 zum Stoppen des Events.
Aktualisieren der 3D-Attributes eines FMOD Events mit Hilfe von C++
Wenn du ein 3D Event abgespielt haben, hast du wahrscheinlich bemerkt, dass die Position des Sounds nicht mit der des Actors geupdated wird. Wie bereits zu Beginn dieses Tutorials erwähnt, ruft PlayEvent2D die Funktion PlayEventAtLocation auf und der Position des Sounds wird daher nicht aktualisiert. Wir können dies lösen, indem wir EventInstanceSetTransform
jeden Frame aufrufen. Da unser Tutorial-Charakter keine Tick-Funktion hat, werden wir diese zuerst erstellen:
virtual void Tick(float DeltaTime) override;
Füge diese Codezeile dem Character-Konstruktor hinzu:
PrimaryActorTick.bCanEverTick = true;
Jetzt können wir die Tick-Funktion implementieren und überprüfen, ob die Event Instance gültig ist, wenn ja, aktualisieren wir die 3D-Attributes der Instanz mit den Transformwerte des Actors:
void ATutorialCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
if (UFMODBlueprintStatics::EventInstanceIsValid(InstanceWrapper))
{
UFMODBlueprintStatics::EventInstanceSetTransform(InstanceWrapper, GetActorTransform());
}
}
PlayEventAttached
Alternativ können wir die Instanz abspielen und an einen Component anhängen, indem wir PlayEventAttached
verwenden:
void ATutorialCharacter::PlaySound()
{
AudioComponent = UFMODBlueprintStatics::PlayEventAttached(Event, RootComponent, NAME_None, GetActorLocation(), EAttachLocation::KeepWorldPosition, true, true, true);
}
void ATutorialCharacter::StopSound()
{
AudioComponent->Stop();
AudioComponent->Release();
}
PlayEventAttached gibt ein UFMODAudioComponent
zurück, also stelle sicher, dass die Variable in der Header-Datei deklariert wurde, wenn du den Sound aufspielen und stoppen möchten:
UPROPERTY(EditAnywhere, Category = "FMOD")
class UFMODAudioComponent* AudioComponent;
Herzlichen Glückwunsch. Du weißt jetzt, wie man FMOD Events in Unreal Engine 4 abspielt. Im nächsten Tutorial werden wir FMOD Parameter kontrollieren, indem wir wie gewöhnt Blueprints verwenden und C++ Code schreiben.