Die Verarbeitung von Musik in Unity umfasst mehr als das Abspielen einer Audiodatei. Bereits beim Import entscheidet die Engine, wie ein Musikstück gespeichert, komprimiert und während des Spiels geladen wird. Anschließend beeinflussen Audio Sources, Audio Mixer und Audioeffekte, wie das Signal verarbeitet und ausgegeben wird.
Diese Abläufe wirken sich auf die Klangqualität, den Arbeitsspeicher und die benötigte Rechenleistung aus. Besonders bei längeren Musikstücken lohnt sich deshalb ein genauer Blick auf die technischen Einstellungen. Unity 2021.1 stellt dafür verschiedene Werkzeuge bereit, mit denen du Musik an die Anforderungen deines Spiels anpassen kannst.
Was bedeutet Musikverarbeitung in Unity?
Unter Musikverarbeitung lassen sich mehrere technische Vorgänge zusammenfassen. Dazu gehören der Import und die Dekodierung von Audiodateien, die Verwaltung ihrer Daten im Speicher sowie die Bearbeitung des Audiosignals während der Wiedergabe.
Ein Musikstück durchläuft dabei vereinfacht verschiedene Stationen. Zunächst importiert Unity die Quelldatei als Audio Clip. Die Importkonfiguration legt fest, wie die Audiodaten für die jeweilige Zielplattform aufbereitet werden. Eine Audio Source stellt den Clip anschließend zur Wiedergabe bereit.
Optional gelangt das Signal durch einen Audio Mixer, der Lautstärke, Filter und weitere Effekte verarbeitet. Am Ende erfolgt die Audioausgabe über das verwendete Gerät.
Die Grundlagen der Wiedergabe behandelt der Artikel Unity Audio Source – Sounds und Musik in der Szene abspielen. Hier steht dagegen die technische Aufbereitung und Bearbeitung des Musiksignals im Mittelpunkt.
Musikdateien vor dem Import vorbereiten
Die Qualität der späteren Musikwiedergabe hängt bereits von der Ausgangsdatei ab. Unity kann eine schlecht aufbereitete Aufnahme nicht automatisch in eine hochwertige Produktion verwandeln.
Vor dem Import solltest du deshalb überprüfen, ob das Musikstück die gewünschte Länge besitzt, sauber beginnt und endet und keine unbeabsichtigten Störgeräusche enthält.
Bei Musik, die sich wiederholen soll, ist außerdem ein geeigneter Übergang zwischen Ende und Anfang wichtig. Ein hörbarer Sprung lässt sich nicht allein durch das Aktivieren der Loop-Einstellung verhindern.
Für die eigentliche Bearbeitung einer Audiodatei kannst du externe Audioprogramme verwenden. Unity übernimmt anschließend die Einbindung, Verarbeitung und Wiedergabe innerhalb des Spiels.
Welche Audioformate unterstützt Unity?
Unity 2021.1 kann unter anderem Audiodateien im WAV-, MP3- und Ogg-Vorbis-Format importieren. Diese Formate unterscheiden sich in ihrer Speicherung und Kompression.
WAV-Dateien enthalten häufig unkomprimierte PCM-Audiodaten. Dadurch eignen sie sich als Ausgangsmaterial, wenn du eine möglichst verlustarme Weiterverarbeitung anstrebst. Allerdings benötigen unkomprimierte Dateien vergleichsweise viel Speicherplatz.
MP3 und Ogg Vorbis verwenden verlustbehaftete Kompressionsverfahren. Sie können die Dateigröße deutlich reduzieren, entfernen dabei jedoch bestimmte Informationen aus dem Audiosignal.
Entscheidend ist nicht nur das Format der ursprünglichen Datei. Unity kann die importierten Audiodaten abhängig von den gewählten Einstellungen erneut aufbereiten und in einem anderen Format für das fertige Spiel speichern.
Die Audio-Importeinstellungen im Inspector
Wenn du einen Audio Clip im Project-Fenster auswählst, zeigt der Inspector seine Importkonfiguration. Dort kannst du festlegen, wie Unity die Audiodaten behandelt.
Zu den wichtigen Einstellungen gehören Force To Mono, Load In Background, Preload Audio Data, Load Type, Compression Format, Quality und Sample Rate Setting.
Einige Optionen hängen vom gewählten Kompressionsformat und der Zielplattform ab. Deshalb erscheinen nicht bei jeder Importkonfiguration dieselben Einstellmöglichkeiten.
Force To Mono – Stereo in Mono umwandeln
Mit Force To Mono kannst du Unity anweisen, mehrkanalige Audiodaten beim Import auf ein Monosignal herunterzumischen.
Für bestimmte räumliche Soundeffekte kann Mono sinnvoll sein, da die räumliche Positionierung anschließend durch das Audiosystem erfolgt.
Bei Hintergrundmusik ist die Situation anders. Viele Musikstücke nutzen die Stereoaufteilung bewusst als Bestandteil ihrer Komposition. Eine Umwandlung in Mono kann deshalb räumliche Details und die gewünschte Klangwirkung verändern.
Ob du Force To Mono verwendest, sollte sich daher nach dem jeweiligen Musikstück und seiner Funktion richten.
Load Type bestimmt die Bereitstellung der Audiodaten
Die Einstellung Load Type gehört zu den wichtigsten Optionen für die Speicherverwaltung. Sie bestimmt, wie Unity die Audiodaten während des Spiels bereitstellt.
In Unity 2021.1 stehen drei grundlegende Varianten zur Verfügung: Decompress On Load, Compressed In Memory und Streaming.
Decompress On Load – Audiodaten beim Laden dekomprimieren
Bei Decompress On Load dekomprimiert Unity die Audiodaten beim Laden. Die Wiedergabe kann anschließend auf die bereits dekomprimierten Daten zugreifen.
Dadurch sinkt der Aufwand für die laufende Dekodierung. Gleichzeitig steigt der Speicherbedarf, weil dekomprimierte Audiodaten wesentlich mehr Platz beanspruchen können als ihre komprimierte Form.
Für kurze, häufig abgespielte Soundeffekte ist diese Methode oft sinnvoll. Bei mehrminütiger Hintergrundmusik kann der zusätzliche Speicherbedarf dagegen beträchtlich ausfallen.
Compressed In Memory – komprimierte Musik im Arbeitsspeicher
Bei Compressed In Memory bleiben die Audiodaten im Speicher komprimiert. Unity dekodiert sie während der Wiedergabe.
Diese Methode reduziert den Speicherbedarf gegenüber vollständig dekomprimierten Daten. Dafür entsteht zusätzlicher Rechenaufwand während der Audiowiedergabe.
Die Einstellung kann für Clips geeignet sein, bei denen du Speicher sparen möchtest und die laufende Dekodierung keine problematische Belastung darstellt.
Bei vielen gleichzeitig abgespielten komprimierten Clips kann sich der Dekodierungsaufwand allerdings summieren. Deshalb solltest du die tatsächliche Belastung auf der vorgesehenen Zielplattform überprüfen.
Streaming – längere Musikstücke fortlaufend laden
Für längere Hintergrundmusik ist Streaming häufig eine geeignete Wahl. Unity liest dabei Audiodaten während der Wiedergabe fortlaufend ein, statt den gesamten Clip vollständig dekomprimiert im Arbeitsspeicher bereitzuhalten.
Dadurch lässt sich der Speicherbedarf reduzieren. Gleichzeitig benötigt Streaming zusätzliche Ressourcen für das Einlesen und die Verarbeitung der Daten.
Auch gestreamte Musik benötigt Puffer und verursacht einen gewissen Verwaltungsaufwand. Streaming bedeutet daher nicht, dass ein Audio Clip überhaupt keinen Arbeitsspeicher beansprucht.
Für lange Musikstücke ist die Methode oft sinnvoll. Bei sehr kurzen Effekten kann der zusätzliche Streaming-Aufwand dagegen unnötig sein.
Compression Format und die Klangqualität
Über Compression Format bestimmst du, wie Unity die Audiodaten für die jeweilige Plattform speichert. Die verfügbaren Optionen hängen von der Zielplattform ab.
Zu den in Unity verwendeten Verfahren gehören PCM, ADPCM und Vorbis. Sie unterscheiden sich hinsichtlich Dateigröße, Klangqualität und Dekodierungsaufwand.
PCM speichert Audiodaten ohne eine vergleichbare verlustbehaftete Audiokompression. Das benötigt mehr Speicherplatz, reduziert jedoch den Aufwand für die Dekodierung.
ADPCM bietet eine vergleichsweise einfache Kompression und kann sich für bestimmte kurze Effekte eignen. Bei Musik mit vielen feinen Klangdetails kann die Klangqualität jedoch stärker leiden.
Vorbis ermöglicht eine stärkere Kompression und eignet sich häufig für längere Musikstücke. Wie deutlich die Kompression hörbar ist, hängt von der eingestellten Qualität und vom Ausgangsmaterial ab.
Quality – das Verhältnis zwischen Dateigröße und Klang
Bei geeigneten Kompressionsformaten bietet Unity eine Quality-Einstellung. Sie beeinflusst das Verhältnis zwischen komprimierter Dateigröße und Klangqualität.
Eine stärkere Kompression kann Speicherplatz sparen, gleichzeitig aber hörbare Veränderungen verursachen. Besonders bei Musik mit vielen hohen Frequenzen, komplexen Instrumenten oder leisen Details können Kompressionsartefakte auffallen.
Deshalb solltest du verschiedene Einstellungen nicht ausschließlich anhand ihrer Dateigröße vergleichen. Höre dir das Ergebnis auch direkt im Spiel an.
Eine Einstellung, die bei einem einfachen Klang unauffällig bleibt, kann bei einem anderen Musikstück deutlich hörbare Qualitätsverluste verursachen.
Sample Rate und die Verarbeitung von Frequenzen
Die Sample Rate beschreibt, wie viele Abtastwerte eines Audiosignals pro Sekunde vorliegen. Übliche Werte bei Audiodateien sind beispielsweise 44.100 Hz oder 48.000 Hz.
Über die Sample Rate Setting kannst du beeinflussen, wie Unity mit der Abtastrate des importierten Clips umgeht. Je nach Einstellung behält Unity die ursprüngliche Rate bei oder verwendet eine angepasste Abtastrate.
Eine niedrigere Abtastrate kann den Datenumfang reduzieren. Gleichzeitig begrenzt sie den darstellbaren Frequenzbereich. Für Musik mit vielen hohen Frequenzanteilen kann das hörbare Auswirkungen besitzen.
Eine höhere Sample Rate führt dagegen nicht automatisch zu einer besseren Klangqualität, wenn das Ausgangsmaterial die entsprechenden Informationen gar nicht enthält.
Preload Audio Data und Load In Background
Mit Preload Audio Data bestimmst du, ob Unity die Audiodaten beim Laden des Audio Clips automatisch vorbereitet. Ist die Option deaktiviert, musst du bei Bedarf selbst sicherstellen, dass die Daten rechtzeitig verfügbar sind.
Load In Background ermöglicht das Laden im Hintergrund. Das kann verhindern, dass bestimmte Ladevorgänge den Hauptablauf unnötig blockieren.
Allerdings kann ein noch nicht vollständig geladener Clip nicht immer sofort wie erwartet starten. Wenn Musik unmittelbar nach einem Szenenwechsel beginnen soll, solltest du das Ladeverhalten deshalb berücksichtigen.
Die passenden Einstellungen hängen unter anderem davon ab, wann das Musikstück benötigt wird und wie groß die Datei ist.
Wie verarbeitet die Audio Source ein Musiksignal?
Nach dem Laden kann eine Audio Source den Musikclip wiedergeben. Dabei berücksichtigt Unity die Einstellungen der Komponente.
Die Eigenschaft Volume beeinflusst die Lautstärke. Über Pitch kannst du Wiedergabegeschwindigkeit und Tonhöhe verändern. Mit Loop lässt sich der Clip wiederholt abspielen.
Für gewöhnliche Hintergrundmusik wird Spatial Blend häufig auf 2D gesetzt. Dadurch hängt die Wiedergabe nicht von der räumlichen Entfernung zwischen Quelle und Hörpunkt ab wie bei einem 3D-Sound.
Die Audio Source kann ihr Signal direkt zur Audioausgabe beziehungsweise zum Master-Mix weiterleiten oder einer Gruppe innerhalb eines Audio Mixers zugeordnet werden.
Der Audio Mixer als Werkzeug zur Musikverarbeitung
Ein Audio Mixer ermöglicht die gemeinsame Bearbeitung verschiedener Audiosignale. Du kannst Audio Sources unterschiedlichen Mixer-Gruppen zuweisen und ihre Signale anschließend gemeinsam verarbeiten.
Für ein Spiel bietet sich beispielsweise eine Trennung zwischen Musik, Soundeffekten, Stimmen und Umgebungsgeräuschen an.
Eine eigene Musikgruppe erlaubt es dir, die Hintergrundmusik unabhängig von anderen Klängen zu regeln. Zusätzlich kannst du Effekte hinzufügen oder verschiedene Mischzustände speichern.
Audio Mixer erstellen und Musik zuweisen
In Unity 2021.1 kannst du einen Audio Mixer über das Project-Fenster erstellen. Anschließend öffnest du ihn zur Bearbeitung.
- Erstelle im Project-Fenster über Create > Audio Mixer einen neuen Mixer.
- Öffne den Mixer und lege bei Bedarf eine eigene Gruppe für Musik an.
- Wähle das GameObject mit deiner Musik-Audio-Source aus.
- Suche im Inspector das Feld Output.
- Weise dort die gewünschte Audio-Mixer-Gruppe zu.
- Starte das Spiel und kontrolliere die Wiedergabe.
Die Musik läuft nun durch die zugewiesene Mixer-Gruppe. Dort kannst du ihre Lautstärke beeinflussen oder weitere Effekte ergänzen.
Lautstärke in Dezibel verarbeiten
Während die Lautstärke einer Audio Source üblicherweise als linearer Wert zwischen 0 und 1 eingestellt wird, verwendet der Audio Mixer Dezibelwerte.
Die Dezibelskala ist logarithmisch. Eine Änderung um einen bestimmten Dezibelwert entspricht deshalb keiner einfachen linearen Veränderung der Lautstärke.
Für einen UI-Slider kannst du einen linearen Wert in Dezibel umrechnen. Dazu eignet sich die Formel:
Dezibel = 20 × log10(Lautstärkewert)
Der Lautstärkewert muss dabei größer als null sein, da der Logarithmus von null nicht definiert ist.
Musiklautstärke mit C# und Audio Mixer steuern
Das folgende Script verwendet einen zuvor freigegebenen Mixer-Parameter namens MusicVolume:
using UnityEngine;
using UnityEngine.Audio;
public class MusicMixerControl : MonoBehaviour
{
[SerializeField] private AudioMixer audioMixer;
public void SetMusicVolume(float volume)
{
if (audioMixer == null)
{
return;
}
if (volume <= 0f)
{
audioMixer.SetFloat("MusicVolume", -80f);
return;
}
float safeVolume = Mathf.Clamp01(volume);
float decibels =
Mathf.Log10(safeVolume) * 20f;
audioMixer.SetFloat(
"MusicVolume",
decibels
);
}
}
Die Methode erwartet einen Wert zwischen 0 und 1. Bei null setzt sie die Musikgruppe auf -80 dB. Bei positiven Werten erfolgt eine logarithmische Umrechnung.
Damit das Script funktioniert, musst du den entsprechenden Lautstärkeparameter im Audio Mixer unter dem Namen MusicVolume freigeben und den Mixer im Inspector zuweisen.
Die tatsächliche Stummschaltung bei -80 dB hängt vom verwendeten Mixer und seiner Konfiguration ab. Für eine ausdrücklich vollständige Stummschaltung kannst du ergänzend eine entsprechende Mute-Logik einsetzen.
Equalizer und Frequenzbearbeitung
Bei der Frequenzbearbeitung veränderst du bestimmte Bereiche des Audiosignals. Tiefe Frequenzen beeinflussen beispielsweise den Bassbereich, während hohe Frequenzen häufig für Brillanz und bestimmte Klangdetails verantwortlich sind.
Unity stellt dafür verschiedene Audiofilter und Mixer-Effekte bereit. Dazu gehören unter anderem Low-Pass- und High-Pass-Filter.
Ein Low-Pass-Filter schwächt hohe Frequenzen ab. Dadurch kann Musik gedämpfter erscheinen, beispielsweise wenn der Spieler einen Raum verlässt und die Musik nur noch durch eine geschlossene Tür wahrnimmt.
Ein High-Pass-Filter reduziert dagegen tiefe Frequenzanteile. Das kann für bestimmte Übergänge oder bewusst verfremdete Klänge verwendet werden.
Eine umfassende musikalische Klangbearbeitung mit detaillierten Equalizern, Mastering und Mehrspurproduktion erfolgt häufig bereits vor dem Import in einer dafür vorgesehenen Audiosoftware.
Reverb – Musik mit Nachhall versehen
Ein Reverb-Effekt erzeugt Nachhall und kann dadurch den Eindruck eines akustischen Raums vermitteln.
Bei räumlich positionierter Musik kann das beispielsweise sinnvoll sein, wenn ein Radio in einer großen Halle steht oder Musik aus einem angrenzenden Raum hörbar ist.
Für gewöhnliche Hintergrundmusik ist ein zusätzlicher Nachhall nicht immer erforderlich. Viele Musikstücke enthalten bereits Hallanteile aus ihrer ursprünglichen Produktion.
Ein weiterer Reverb-Effekt kann den Klang in solchen Fällen unnötig verwaschen. Deshalb solltest du ihn gezielt und abhängig von der gewünschten Wirkung einsetzen.
Kompression und Dynamikbearbeitung unterscheiden
Bei der Musikverarbeitung begegnet dir der Begriff Kompression in zwei unterschiedlichen Zusammenhängen.
Die Datenkompression reduziert die Größe einer Audiodatei. Dazu gehören beispielsweise verlustbehaftete Verfahren wie Vorbis.
Die Dynamikkompression verändert dagegen das Verhältnis zwischen leisen und lauten Signalanteilen. Ein Kompressor kann starke Pegelspitzen reduzieren und dadurch den Dynamikumfang beeinflussen.
Beide Verfahren verfolgen unterschiedliche Ziele. Eine kleinere Audiodatei bedeutet nicht automatisch, dass ihre musikalische Dynamik reduziert wurde.
Ducking – Musik bei Dialogen und wichtigen Sounds absenken
Beim Ducking wird die Lautstärke eines Audiosignals vorübergehend reduziert, damit ein anderes Signal deutlicher hörbar bleibt.
Ein typisches Beispiel ist die Absenkung der Hintergrundmusik während eines Dialogs. Sobald die Sprachausgabe endet, steigt die Musiklautstärke wieder auf ihren ursprünglichen Wert.
Unity unterstützt entsprechende Audiobearbeitung über den Audio Mixer und geeignete Effekte. Alternativ kannst du die Lautstärke einer Musikgruppe per Script steuern.
Bei der Umsetzung solltest du darauf achten, dass die Musik nicht bei jedem kurzen Geräusch stark schwankt. Eine angemessene Ein- und Ausblendzeit sorgt häufig für ruhigere Übergänge.
Audio Mixer Snapshots für unterschiedliche Klangzustände
Mit Snapshots kannst du unterschiedliche Zustände eines Audio Mixers speichern. Dazu gehören beispielsweise Lautstärken und weitere geeignete Effektparameter.
Du kannst einen Snapshot für die gewöhnliche Spielmusik erstellen und einen weiteren für Dialogsituationen, in denen die Musik leiser sein soll.
Unity ermöglicht Übergänge zwischen diesen Zuständen. Dadurch kannst du mehrere Audioeinstellungen gemeinsam verändern, statt jede Eigenschaft einzeln per Script anzupassen.
Musikübergänge durch Fades verarbeiten
Wenn ein Musikstück endet oder eine andere Szene beginnt, kann ein abrupter Wechsel störend wirken. Mit einem Fade-out reduzierst du die Lautstärke schrittweise, bis die Musik nicht mehr hörbar ist.
Ein Fade-in funktioniert umgekehrt: Die Musik beginnt leise und erreicht innerhalb einer festgelegten Zeit ihre gewünschte Lautstärke.
Solche Übergänge lassen sich durch die Veränderung der Audio-Source-Lautstärke oder über einen Audio Mixer umsetzen.
Bei mehreren Musikquellen kann auch ein Crossfade sinnvoll sein. Dabei wird das erste Musikstück ausgeblendet, während das zweite bereits eingeblendet wird.
Crossfade und die Überlagerung zweier Musikstücke
Ein Crossfade verwendet häufig zwei Audio Sources. Die erste spielt das aktuelle Musikstück, während die zweite bereits den nächsten Clip vorbereitet.
Während des Übergangs sinkt die Lautstärke der ersten Quelle. Gleichzeitig steigt die Lautstärke der zweiten. Nach Abschluss des Übergangs kann die erste Quelle gestoppt werden.
Technisch ist ein Crossfade vergleichsweise einfach umzusetzen. Musikalisch muss er jedoch nicht immer gut funktionieren. Zwei Stücke mit unterschiedlichen Tonarten oder stark abweichenden Rhythmen können während der Überlagerung unruhig wirken.
Für solche Situationen kann ein kurzer Fade-out mit anschließendem Fade-in besser geeignet sein.
Musik anhand der DSP-Zeit synchronisieren
Bei zeitlich präzisen Musiksystemen reicht ein gewöhnlicher Start über AudioSource.Play() nicht immer aus. Der Aufruf erfolgt im Rahmen des Spielablaufs und ist damit von der zeitlichen Ausführung des entsprechenden Scripts abhängig.
Unity stellt mit AudioSettings.dspTime eine Zeitbasis für die Audioverarbeitung bereit. In Verbindung mit AudioSource.PlayScheduled() kannst du einen Wiedergabestart für einen bestimmten DSP-Zeitpunkt planen.
using UnityEngine;
public class MusicScheduler : MonoBehaviour
{
[SerializeField] private AudioSource musicSource;
public void ScheduleMusic()
{
if (musicSource == null ||
musicSource.clip == null)
{
return;
}
double startTime =
AudioSettings.dspTime + 1.0;
musicSource.PlayScheduled(startTime);
}
}
Das Beispiel plant den Beginn der Musik eine Sekunde nach der aktuellen DSP-Zeit. Die Vorlaufzeit gibt dem Audiosystem Gelegenheit, den geplanten Start vorzubereiten.
Für musikalisch nahtlose Übergänge musst du zusätzlich die Länge der verwendeten Abschnitte und ihre geplanten Startzeiten berücksichtigen.
Adaptive Musik und mehrschichtige Arrangements
Bei adaptiver Musik verändert sich die musikalische Begleitung abhängig vom Spielgeschehen. Die technische Verarbeitung kann dabei über einfache Clipwechsel hinausgehen.
Ein Musikstück kann beispielsweise aus mehreren getrennten Spuren bestehen. Eine Spur enthält die Grundbegleitung, eine weitere zusätzliche Percussion und eine dritte melodische Elemente.
Wenn diese Spuren zeitlich aufeinander abgestimmt sind, kannst du sie abhängig von der Spielsituation ein- oder ausblenden. Dadurch verändert sich die Intensität der Musik, ohne dass zwangsläufig ein vollständig neues Stück starten muss.
Für eine saubere Synchronisation sind geeignete Audiodateien und eine präzise zeitliche Steuerung wichtig. Unterschiedliche Startzeitpunkte können dazu führen, dass rhythmisch zusammengehörige Spuren nicht mehr exakt übereinanderliegen.
Musikschichten über mehrere Audio Sources
Eine einfache mehrschichtige Musikstruktur kann mehrere Audio Sources verwenden. Jede Quelle spielt eine eigene musikalische Spur.
Du kannst beispielsweise eine Grundspur dauerhaft abspielen und zusätzliche Instrumente bei bestimmten Ereignissen hörbar machen.
Wichtig ist, dass die einzelnen Spuren musikalisch aufeinander abgestimmt sind. Für eine zuverlässige Synchronisation sollten ihre Startzeiten über die DSP-Zeit geplant werden.
Die Lautstärke der einzelnen Schichten kannst du anschließend direkt über ihre Audio Sources oder über getrennte Mixer-Gruppen verändern.
Musikdaten zur Laufzeit analysieren
Unity bietet außerdem Möglichkeiten, Audiodaten während der Wiedergabe auszuwerten. Dazu gehören beispielsweise die Analyse von Signalwerten und Frequenzanteilen.
Mit AudioSource.GetSpectrumData() kannst du Frequenzinformationen einer Audio Source abrufen. Die Methode verwendet eine schnelle Fourier-Transformation, um das Audiosignal in Frequenzbereiche aufzuteilen.
Solche Daten lassen sich beispielsweise für Visualisierungen einsetzen, bei denen grafische Elemente auf bestimmte Frequenzanteile der Musik reagieren.
Die Spektrumanalyse liefert allerdings nicht automatisch musikalische Informationen wie Takt, Tonart oder den genauen Zeitpunkt eines Beats. Dafür sind zusätzliche Auswertungsverfahren erforderlich.
Frequenzspektrum einer Audio Source auslesen
Das folgende Beispiel liest regelmäßig Frequenzdaten einer Audio Source aus und berechnet daraus einen einfachen Durchschnittswert:
using UnityEngine;
public class MusicSpectrum : MonoBehaviour
{
[SerializeField] private AudioSource musicSource;
private float[] spectrum = new float[512];
private void Update()
{
if (musicSource == null ||
!musicSource.isPlaying)
{
return;
}
musicSource.GetSpectrumData(
spectrum,
0,
FFTWindow.BlackmanHarris
);
float sum = 0f;
for (int i = 0; i < spectrum.Length; i++)
{
sum += spectrum[i];
}
float average = sum / spectrum.Length;
Debug.Log("Spektrum-Durchschnitt: " + average);
}
}
Das Array enthält 512 Werte des Frequenzspektrums. Über FFTWindow.BlackmanHarris legst du die verwendete Fensterfunktion für die Spektrumanalyse fest.
Der berechnete Durchschnitt dient hier lediglich als einfaches Beispiel. Er beschreibt weder die wahrgenommene Lautstärke noch einen zuverlässig erkannten Beat.
Für eine praktische Visualisierung solltest du bestimmte Frequenzbereiche gezielt auswerten und die Werte glätten. Außerdem solltest du vermeiden, jede Spektrumberechnung dauerhaft über Debug.Log() auszugeben, da dies unnötigen Aufwand verursachen kann.
Musikvisualisierung und reaktive Spielelemente
Aus den analysierten Audiodaten kannst du Werte ableiten, die grafische Elemente beeinflussen. Beispielsweise können Partikel, Lichtintensitäten oder die Skalierung eines Objekts auf Veränderungen im Frequenzspektrum reagieren.
Ein häufiger Ansatz besteht darin, tiefe Frequenzen für größere Bewegungen und hohe Frequenzen für kleinere visuelle Details zu verwenden.
Damit die Darstellung nicht unruhig flackert, solltest du die Werte über mehrere Frames glätten und geeignete Mindest- und Höchstwerte festlegen.
Eine solche Visualisierung reagiert auf Eigenschaften des Audiosignals. Sie erkennt jedoch nicht zwangsläufig die musikalische Struktur des Stücks.
Musikdaten mit GetData auslesen
Neben der Spektrumanalyse stellt Unity mit AudioClip.GetData() eine Möglichkeit bereit, Audiosamples eines geeigneten Audio Clips auszulesen.
Damit kannst du beispielsweise Wellenformdaten untersuchen oder eigene Analyseverfahren entwickeln. Die Verfügbarkeit der Samples hängt allerdings von der Importkonfiguration und dem Ladezustand des Clips ab.
Insbesondere bei gestreamten oder komprimiert im Speicher gehaltenen Clips solltest du nicht davon ausgehen, dass sämtliche Audiodaten jederzeit auf dieselbe Weise für einen direkten Zugriff bereitstehen.
Für eine reine Visualisierung während der Wiedergabe kann die Spektrumanalyse einer Audio Source deshalb geeigneter sein als das vollständige Auslesen einer Musikdatei.
Audioverarbeitung mit OnAudioFilterRead
Für eigene digitale Audioverarbeitung bietet Unity außerdem die Methode OnAudioFilterRead(). Sie ermöglicht es, Audiopuffer innerhalb der Audioverarbeitung zu bearbeiten.
Diese Methode richtet sich vor allem an fortgeschrittene Entwickler, die eigene Filter, Signalgeneratoren oder spezielle Audioeffekte umsetzen möchten.
Die Verarbeitung erfolgt im Audiokontext und unterliegt anderen Anforderungen als gewöhnlicher Gameplay-Code. Aufwendige Berechnungen, blockierende Operationen oder ungeeignete Zugriffe auf Unity-Funktionen können die Audiowiedergabe beeinträchtigen.
Für gewöhnliche Lautstärkeänderungen, Musikübergänge oder einfache Filter solltest du deshalb zunächst die vorhandenen Audio-Source- und Audio-Mixer-Funktionen verwenden.
Musikverarbeitung und Arbeitsspeicher
Musik kann einen erheblichen Anteil am Speicherbedarf eines Spiels besitzen. Das gilt besonders dann, wenn zahlreiche längere Musikstücke gleichzeitig geladen bleiben.
Die Größe einer Audiodatei im Project-Fenster entspricht dabei nicht zwangsläufig dem Speicherbedarf während der Wiedergabe. Abhängig vom Load Type kann Unity die Daten dekomprimieren, komprimiert im Speicher halten oder streamen.
Deshalb solltest du die Importkonfiguration nicht ausschließlich anhand der Dateigröße beurteilen. Entscheidend ist auch, wie Unity die Daten während des Spiels verarbeitet.
Musikverarbeitung und CPU-Auslastung
Neben dem Arbeitsspeicher benötigt das Audiosystem Rechenleistung. Dazu gehören die Dekodierung komprimierter Audiodaten, die Mischung verschiedener Quellen und die Berechnung von Effekten.
Besonders viele gleichzeitig aktive Audio Sources oder aufwendige Audiobearbeitungen können die Belastung erhöhen.
Eine einzelne Hintergrundmusik stellt normalerweise keine außergewöhnliche Anforderung dar. Werden jedoch mehrere Musikschichten, zusätzliche Filter und zahlreiche Soundeffekte gleichzeitig verarbeitet, kann eine gezielte Optimierung sinnvoll sein.
Audio im Unity Profiler kontrollieren
Der Unity Profiler unterstützt dich bei der Untersuchung des Audiosystems. Über das Audio-Modul kannst du Informationen zur Audiowiedergabe und ihrer Ressourcenbelastung abrufen.
Damit lässt sich beispielsweise überprüfen, wie viele Audiostimmen aktiv sind und ob die Audioverarbeitung auffällige Ressourcen benötigt.
Für eine zuverlässige Beurteilung solltest du dein Spiel möglichst auf der vorgesehenen Zielplattform testen. Das Verhalten im Unity Editor muss nicht vollständig mit dem Verhalten eines fertigen Builds übereinstimmen.
Musik für unterschiedliche Plattformen optimieren
Ein PC-Spiel, ein mobiles Spiel und ein WebGL-Projekt können unterschiedliche Anforderungen an die Musikverarbeitung stellen.
Auf mobilen Geräten sind Speicherbedarf und Energieverbrauch häufig besonders wichtig. Bei WebGL können außerdem die Möglichkeiten und Einschränkungen der browserbasierten Audiowiedergabe eine Rolle spielen.
Unity erlaubt plattformspezifische Importkonfigurationen für Audio Clips. Dadurch kannst du beispielsweise unterschiedliche Kompressions- und Qualitätseinstellungen für verschiedene Zielplattformen verwenden.
Die optimale Einstellung solltest du durch Tests ermitteln. Eine möglichst kleine Audiodatei ist nicht automatisch die beste Wahl, wenn dadurch die Klangqualität oder die Wiedergabeleistung zu stark beeinträchtigt wird.
Typische Fehler bei der Musikverarbeitung
Probleme bei der Musikwiedergabe können bereits beim Import entstehen oder erst während der Verarbeitung auftreten. Einige Ursachen lassen sich durch eine systematische Kontrolle eingrenzen.
- Musik klingt schlechter als die Ausgangsdatei: Prüfe Compression Format, Quality und Sample Rate Setting.
- Hoher Speicherverbrauch: Kontrolliere Load Type und die Anzahl gleichzeitig geladener Musikclips.
- Verzögerter Musikstart: Prüfe, ob die Audiodaten rechtzeitig geladen und vorbereitet wurden.
- Hörbare Unterbrechungen: Untersuche Streaming, Ressourcenbelastung und die Konfiguration der Audioausgabe.
- Musik ist zu leise: Kontrolliere Audio Source, Audio Mixer und aktive Effekte.
- Musik klingt dumpf: Überprüfe, ob ein Low-Pass-Filter oder eine andere Frequenzbearbeitung aktiv ist.
- Musikspuren laufen auseinander: Kontrolliere ihre Startzeiten und verwende bei Bedarf eine gemeinsame DSP-Zeitbasis.
- Loop klingt unsauber: Prüfe die Ausgangsdatei und mögliche Auswirkungen der Kompression.
Beginne die Fehlersuche möglichst mit einer einzelnen Audio Source ohne zusätzliche Effekte. Wenn der Musikclip dort korrekt klingt, kannst du Mixer-Gruppen, Filter und weitere Verarbeitungsschritte nacheinander wieder aktivieren.
Musikverarbeitung passend zum Spiel gestalten
Unity bietet verschiedene Möglichkeiten, Musik technisch aufzubereiten und während des Spiels zu bearbeiten. Welche davon sinnvoll sind, hängt vom Umfang deines Projekts und der gewünschten Klanggestaltung ab.
Für eine einfache Hintergrundmusik genügen häufig ein geeigneter Audio Clip, eine Audio Source und eine passende Importkonfiguration. Bei umfangreicheren Spielen kommen Audio Mixer, Lautstärkegruppen, Filter, Musikübergänge und gegebenenfalls eine zeitlich präzise Steuerung hinzu.
Die eigentliche Musikproduktion und die Verarbeitung innerhalb der Engine solltest du dabei voneinander unterscheiden. Unity kann Audiodaten wiedergeben, analysieren und mit Effekten bearbeiten. Für umfangreiche Komposition, Aufnahme und Mastering ist dagegen eine spezialisierte Audiosoftware meist besser geeignet.
Eine durchdachte Musikverarbeitung verbindet Klangqualität mit einem angemessenen Ressourcenverbrauch. Dadurch bleibt die musikalische Begleitung nicht nur hörbar, sondern fügt sich technisch zuverlässig in dein Spiel ein.
Weitere technische Informationen zu Import, Kompression und Audiowiedergabe findest du im Unity-Handbuch zu Audio Clips.
