In diesem Tutorial lernst du, wie du prozedurale Musik mit MetaSounds erstellst. Du wirst prozedural generierte Hintergrundmusik für dein Abenteuerspiel erstellen.
MetaSounds ist ein hochleistungsfähiges Audiosystem, das Sound mit einem knotenbasierten System erzeugen kann, ähnlich dem Blueprint-Visual-Scripting-System.
Bevor du anfängst
Stelle sicher, dass du diese Themen verstehst, die in der Dokumentation Unreal Engine für neue Nutzer behandelt werden:
Blueprint-Grundlagen, wie das Hinzufügen und Verbinden von Knoten.
Prozedurale Musik mit MetaSounds erstellen
Du beginnst damit, ein MetaSound-Asset zu erstellen. Befolge diese Schritte:
Gehe zum Inhaltsbrowser und navigiere zum Ordner Inhalt > AdventureGame > Artist > Audio.
Erstelle im Audio-Ordner einen neuen Ordner namens Music.
Klicke mit der rechten Maustaste im Ordner Music und wähle Audio > MetaSound-Quelle.
Gib diesem Asset den Namen
MS_BGM, was für MetaSound Background Music steht.Öffne das Asset.
Das Asset wird im MetaSound-Editor geöffnet. Im neuen Fenster siehst du drei Knoten im Diagramm: Input, Output On Finished und Input Out Mono.
Der Input-Trigger wird ausgeführt, wenn diese Audioquelle abgespielt wird. Ein MetaSound beginnt immer mit einem Input.
Der Output On Finished-Trigger wird ausgeführt, um die Wiedergabe der Quelle zu stoppen. Wenn du das Audio an einem anderen Ort stoppst, beispielsweise in einem Blueprint, musst du diesen Knoten nicht verwenden, um die Audioquelle zu stoppen. In diesem Fall verwendest du einen Blueprint zum Starten und Anhalten des Audios, sodass du nicht auf diesen Knoten zugreifen musst.
Der Output Out Mono-Knoten repräsentiert den finalen Audio-Output des MetaSound-Diagramms und leitet alle vorgelagerten Audio-Signale in einen Einkanal-Output (Mono-Output) weiter. Alle damit verbundenen Knoten werden effektiv gemischt und als Output des Sounds an die Engine gesendet.
Musiktempo und Rhythmus festlegen
Zuerst erstellst du Knoten, um das Tempo und den Rhythmus der Musik einzustellen. Befolge diese Schritte:
Ziehe den Pin des Input-Knotens und füge einen Trigger Repeat-Knoten hinzu.
Ziehe den Period-Pin des Trigger Repeat-Knoten und füge einen BPM To Seconds-Knoten hinzu. Stelle die Unterteilungen der ganzen Note auf 16 ein.
Ziehe den BPM-Pin am BPM To Seconds-Knoten und wähle Auf Diagramm-Input hochstufen aus.
Benenne im Mitglieder-Panel in der oberen linken Ecke des Bildschirms Input von BPM in Note In um.
Ändere im Details-Panel den Standardwert des Note In-Knotens auf 60. Du kannst diesen Wert auch unterhalb des Knotens ändern.
Ziehe den RepeatOut-Pin des Trigger Repeat -Knotens und füge einen neuen Trigger Counter -Knoten hinzu.
Wähle den Trigger Counter-Knoten und setze den Reset Count auf 8.
Dieser Abschnitt bestimmt das Tempo und den Rhythmus. Zusätzlich kannst du alle vier Knoten – Trigger Counter, Trigger Repeat, BPM To Seconds und Input – hervorheben und C drücken, um eine Kommentar-Box hinzuzufügen, die alle Knoten enthält. Nenne dieses Kommentarfeld Tempo und Rhythmus.
Eine Melodie generieren
Als Nächstes erstellst du die Funktionalität, die die Melodie im vorgegebenen Tempo und Rhythmus erzeugt. Befolge diese Schritte:
Vom Trigger Counter-Knoten:
Ziehe den On Trigger-Pin und füge einen Random Get (Float:Array)-Knoten hinzu.
Ziehe den On Reset-Pin des Trigger Counter-Knotens und verbinde ihn mit dem Reset-Pin des Random Get-Knotens.
Ziehe den In Array-Pin des Random Get-Knotens und füge einen Nach Notenarray skalieren-Knoten hinzu.
Ziehe am Nach Notenarray skalieren-Knoten den Tonleitergrade-Pin und füge Auf Diagramm-Input hochstufen hinzu und benenne ihn Skalieren.
Ziehe den Seed-Pin vom Random Get-Knoten und füge einen Random (Int)-Knoten hinzu.
Ziehe den Next-Pin des Random (Int)-Knotens und verbinde ihn mit dem On Reset-Pin des Trigger Counter-Knotens.
Diese Sektion generiert die Melodie. Du kannst erneut alle neuen Knoten hervorheben und ein Kommentarfeld namens Melodieerzeugung hinzufügen.
Die Melodie synthetisieren
Als Nächstes gestaltest du, wie diese Melodie klingt, indem du die Synthese erstellst. Das bedeutet, die erzeugten Melodienoten in hörbaren Klang umzuwandeln. Befolge diese Schritte:
Am Random Get-Knoten ziehe den Value-Pin und füge einen Add (Float)-Knoten hinzu.
Ändere am Add-Knoten den Wert des zweiten Input-Pins von 0 auf 48.
Ziehe den Exec-Pin vom Add-Knoten und füge einen MIDI To Frequency (Float)-Knoten hinzu.
Ziehe den Out Frequency-Pin aus dem MIDI To Frequency (Float)-Knoten und füge einen Sine-Knoten hinzu.
Ziehe vom Sine-Knoten den Audio-Output-Pin und füge einen Add (Audio)-Knoten hinzu.
Du fügst einen weiteren Sine-Knoten hinzu, der mit diesem Add-Knoten verbunden ist. Ziehe vom Add-Knoten den anderen Input-Pin und füge einen Sine-Knoten hinzu.
Ziehe am neuen Sine-Knoten den Frequency-Pin und füge einen MIDI To Frequency (Float)-Knoten hinzu.
Ziehe den MIDI In-Pin des MIDI To Frequency-Knotens und füge einen Add (Float)-Knoten hinzu.
Am Add-Knoten:
Verbinde den ersten Input-Pin mit dem Add-Knoten, der mit dem ersten Sine-Knoten verbunden ist.
Ziehe den zweiten Input-Pin und wähle Zu Diagramm-Input hochstufen. Nenne ihn Verstimmen.
Wähle den Verstimmen-Input und ändere im Details-Panel den Bereich auf 0 und 12.
Ändere im Details-Panel den Standardwert auf 12.
Jetzt hast du die Melodie synthetisiert, die generiert werden soll. Du kannst erneut ein Kommentarfeld für diesen neuen Abschnitt hinzufügen und es Synthese nennen.
Sound mit einer Hüllkurve formen
Als Nächstes fügst du eine Hüllkurve hinzu, um zu formen, wie sich der Sound über die Zeit entwickelt, und steuerst so Start, Sustain und Ausblenden, um ein natürlicheres Ergebnis zu erzielen.
Um eine Hüllkurve hinzuzufügen, führe die folgenden Schritte durch:
Scrolle zur Sektion Melodiegenerierung, die du zuvor erstellt hast (wenn du ein Kommentarfeld hinzugefügt hast, sollte es Melodiegenerierung heißen). Ziehe den On Next-Pin des Random Get (Float:Array)-Knotens und füge einen AD Envelope (Audio)-Knoten hinzu. Verschiebe diesen neuen Knoten nach den beiden Sine-Knoten, die du in der Synthese-Sektion hinzugefügt hast.
Ziehe den Out Envelope-Pin von diesem Knoten und füge einen Multiply (Audio)-Knoten hinzu.
Ziehe den zweiten Input-Pin von diesem Multiply-Knoten und verbinde ihn mit dem Output-Pin des Add (Audio)-Knotens, mit dem du die zwei Sine-Knoten verbunden hast.
Ändere am AD Envelope (Audio)-Knoten die Verfallzeit auf 0,2.
Ziehe den Output-Pin des Multiply (Audio)-Knotens und verbinde ihn mit dem Output Out Mono-Knoten, der sich bereits in der MetaSound-Quelle befand.
Klicke jetzt auf die Schaltfläche Spielen in der Werkzeugleiste oben im MetaSound-Quelle-Fenster. Es wird kontinuierlich prozedural erzeugte Musik abgespielt.
Mehr Informationen zur prozeduralen Musik in der Unreal Engine findest du auf der Seite Creating Procedural Music with MetaSounds.
Die Musik im Spiel mit Blueprints abspielen
Bevor du weitermachst, erstellst du einen Blueprint, der die Hintergrundmusik im Level abspielt.
Da dieser Blueprint dem Level hinzugefügt wird, aber keine visuelle Darstellung hat, fügst du dem Blueprint eine Billboard-Komponente hinzu. Diese Komponente fügt ein 2D-Sprite hinzu, das es im Editor sichtbar macht, sodass du es bei der Bearbeitung deines Levels finden kannst, aber es ist im Spiel nicht sichtbar.
Um den Blueprint für die Hintergrundmusik zu erstellen, befolge diese Schritte:
Gehe in den Inhaltsbrowser und navigiere zu Inhalt > AdventureGame > Artist > Audio > Musik.
Klicke mit der rechten Maustaste und erstelle eine neue Blueprint-Klasse, die von der Actor-Parent-Klasse abgeleitet ist. Nenne diese BP_BGM, was für Blueprint Background Music steht.
Klicke im Komponenten-Panel auf Hinzufügen und füge eine Billboard-Komponente hinzu. Im Details-Panel siehst du, dass der Sprite standardmäßig auf S_Actor eingestellt ist. Du kannst das Sprite ändern oder es unverändert lassen.
Wechsle zum Tab EventGraph, um mit der Erstellung der Funktionalität zu beginnen.
Ziehe eine Verbindung vom Event BeginPlay-Knoten und füge einen Branch-Knoten hinzu.
Ziehe vom Branch-Knoten den Condition-Pin und wähle Auf Variable hochstufen aus. Nenne diese Variable Active. Diese Variable wird verwendet, um zu bestimmen, ob diese Quelle aktiv ist oder nicht.
Klicke in der Variablen-Liste im Meine Blueprints -Panel auf das Auge-Symbol neben der Active-Variable, damit das Auge geöffnet ist und sie im Level-Editor öffentlich und bearbeitbar wird.
Kompiliere den Blueprint, verwende das Details-Panel, um sicherzustellen, dass der Standardwert der Active-Variable true (aktiviert) ist.
Ziehe den True-Pin vom Branch-Knoten und füge einen Play Sound 2D-Knoten hinzu.
Verwende am Play Sound 2D-Knoten die Dropdown-Liste, um den Sound-Pin auf MS_BGM einzustellen.
Klicke im Play Sound 2D-Knotenauf den Abwärtspfeil, um die Knotenoptionen zu erweitern. Ziehe den Volume Multiplier-Pin und wähle Auf Variable hochstufen aus.
Klicke auf das Auge-Symbol der Variable, um sie öffentlich und bearbeitbar zu machen. Kompiliere den Blueprint und ändere seinen Standardwert auf 0,5.
Speichere und kompiliere deinen Blueprint.
Das „2D“ im Play Sound 2D-Knoten zeigt an, dass der Sound unabhängig von der Position des Spielers im Level abgespielt wird. Mit anderen Worten: Er ist nicht im 3D-Raum verräumlicht, also haben Entfernung und Richtung keinen Einfluss darauf, wie der Spieler es hört.
Deine Musik im Spiel testen
Nun kannst du zum Level-Editor zurückkehren und den BP_BGM-Blueprint in dein Level einfügen.
Wähle den Actor BP_BGM im Level aus und stelle im Details-Panel sicher, dass die beiden Variablen, die du hinzugefügt hast, korrekt eingerichtet sind: Active sollte aktiviert sein und der Lautstärke-Multiplikator sollte auf 0,5 eingestellt sein.
Du kannst verschiedene Werte für den Lautstärke-Multiplikator ausprobieren und herausfinden, was für deinen Anwendungsfall am besten funktioniert. Da es sich um die Hintergrundmusik handelt, solltest du die Lautstärke senken, um sie dezent zu halten.
Spiele jetzt das Spiel. Du solltest die Musik, die du erstellt hast, im Hintergrund hören!
Als Nächstes
Im nächsten Modul erfährst du, wie du deinem Spieler-Charakter dynamisch Schrittgeräusch-Soundeffekte hinzufügst, die unterschiedliche Sounds wiedergeben, abhängig von der Art des Bodens, auf dem sich der Charakter gerade bewegt.