Der FMOD Mixer kann mit all seinen Funktionen in Unity gesteuert werden. In diesem Tutorial verändern wir die Lautstärke von Bussen, VCAs und triggern Snapshots direkt aus Unity heraus.
Lade dir das Unity & FMOD Projekt zu diesem Tutorial herunter.
Inhaltsverzeichnis
FMOD Studio Bus Lautstärke in Unity kontrollieren
Die Lautstärke eines Busses in Unity kontrolliert man mit drei einfachen Schritten:
- Bus deklarieren
- Bus abrufen
- Lautstärke bzw. Volume einstellen
Schauen wir uns diese Schritte genauer an.
Bus Deklarieren
Genauso wie bei einfachen Instanzen, müssen wir an erster Stelle den Bus deklarieren:
FMOD.Studio.Bus bus;
Bus abrufen
Nun können wir in Unitys Start()-Methode unseren gewünschten Bus abrufen:
bus = FMODUnity.RuntimeManager.GetBus("bus:/MusicBus");
bus:/MusicBus
ist ein String und bezieht sich auf die Groups im FMOD Studio Mixer, die im Routing-Tab erstellt werden. Wir können diesen Path durch ein Klick mit der rechten Maustaste auf dem Group und der Option „Copy Path“ kopieren:
Lautstärke einstellen
Mit bus.setVolume(float volume)
in der Update()-Funktion können wir nun unsere gewünschte Laustärke für den Bus einstellen. setVolume() nimmt eine Float-Zahl an, die von 0 (stumm) bis 1 (volle Lautstärke) geht. Natürlich ist es uns auch möglich mit der dB-Skala zu arbeiten. Dafür deklarieren wir zwei Floats:
[SerializeField] [Range(-80f, 10f)]
private float busVolume;
private float volume;
busVolume ist ein Float, den wir über ein Slider im Inspektor kontrollieren können. Es soll unseren gewünschten dB-Lautstärke-Wert darstellen. Mit volume nutzen wir eine Formel, um dB in einer linearen Skala umzuwandeln:
volume = Mathf.Pow(10.0f, busVolume / 20f);
Der vollständige Skript für den Bus sieht folgendermaßen aus:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Bus : MonoBehaviour
{
FMOD.Studio.EventInstance instance;
FMOD.Studio.Bus bus;
[FMODUnity.EventRef]
public string fmodEvent;
[SerializeField] [Range(-80f, 10f)]
private float busVolume;
private float volume;
void Start()
{
instance = FMODUnity.RuntimeManager.CreateInstance(fmodEvent);
instance.start();
bus = FMODUnity.RuntimeManager.GetBus("bus:/MusicBus");
}
void Update()
{
volume = Mathf.Pow(10.0f, busVolume / 20f);
bus.setVolume(volume);
}
}
FMOD Studio VCA Lautstärke in Unity kontrollieren
FMOD Studio gibt uns die Möglichkeit, Busse an bestimmten VCAs zu koppeln. Das ist z.B. nützlich, wenn wir die Lautstärke von Musik und Sound Effekte separat regeln möchten. Aus der Code-Perspektive funktioniert die Lautstärkeeinstellung genauso wie bei den Bussen. Wir deklarieren diesmal aber einen VCA:
FMOD.Studio.VCA vca;
Statt GetBus() verwenden wir GetVCA():
vca = FMODUnity.RuntimeManager.GetVCA("vca:/MusicVCA");
Anschließend verwenden wir wieder die setVolume()-methode, um die Lautstärke des VCAs zu ändern:
vca.setVolume(volume);
Der vollständige Skript für die VCAs sieht so aus:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class VCA : MonoBehaviour
{
FMOD.Studio.EventInstance instance;
FMOD.Studio.VCA vca;
[FMODUnity.EventRef]
public string fmodEvent;
[SerializeField]
[Range(-80f, 10f)]
private float vcaVolume;
private float volume;
void Start()
{
instance = FMODUnity.RuntimeManager.CreateInstance(fmodEvent);
instance.start();
vca = FMODUnity.RuntimeManager.GetVCA("vca:/MusicVCA");
}
void Update()
{
volume = Mathf.Pow(10.0f, vcaVolume / 20f);
vca.setVolume(volume);
}
}
FMOD Mixer-Snapshots in Unity triggern
Snapshots kann man sich im Grunde wie ganz normalen Events vorstellen. Das Triggern von Snapshots erfolgt wie das manuelle Abspielen von 2D/3D Events.
Zuerst deklarieren wir die Snapshot-Instanz:
FMOD.Studio.EventInstance snapshot;
Danach erstellen wir die Instanz und spielen bzw. stoppen diese in Unitys Update()-Methode:
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
snapshot = FMODUnity.RuntimeManager.CreateInstance("snapshot:/FilterMusic");
snapshot.start();
}
else if (Input.GetKeyDown(KeyCode.LeftControl))
{
snapshot.stop(FMOD.Studio.STOP_MODE.ALLOWFADEOUT);
snapshot.release();
}
}
Wie du hier siehst, verändert sich nur der Pfad des Events. An Stelle von event:/
verwenden wir nun snapshot:/
, um auf den korrekten Pfad hinzuweisen. Schaue dir die beigelegten Projekte an, um selbst mit den Snapshots zu experimentieren.