Mit den Playback States von FMOD können wir den Abspielzustand eines Events abgreifen. Wird das Event gerade abgespielt? Befindet sich das Event im Start- oder Stoppzustand? Pausiert das Event gerade an einem Sustain-Point?
Lade dir das Unity & FMOD Projekt zu diesem Tutorial herunter.
Die Playback States sind besonders nützlich, wenn wir z.B. vermeiden möchten, dass ein Sound wegen irgendwelchen fehlerhaften Zuständen doppelt abgespielt wird.
Wir deklarieren wie immer zuerst eine FMOD EventInstance und einen String mit dem Pfad zum Event, den wir im Inspector auswählen:
private FMOD.Studio.EventInstance instance;
[FMODUnity.EventRef]
public string fmodEvent;
Wir erstellen eine Methode, die eine EventInstance als Parameter deklariert und lassen uns den PLAYBACK_STATE
der Instanz zurückgeben:
FMOD.Studio.PLAYBACK_STATE PlaybackState(FMOD.Studio.EventInstance instance)
{
FMOD.Studio.PLAYBACK_STATE pS;
instance.getPlaybackState(out pS);
return pS;
}
Eine einfache Anwendung dafür ist wie oben kurz beschrieben die Prüfung, ob eine Instanz schon abgespielt wurde. Wir spielen wieder in Unitys Update()-Methode eine Instanz mit der Leertaste ab und stoppen sie mit der linken Kontrolltaste. Diesmal überprüfen wir aber dank von PlaybackState()
, ob die Instanz gerade schon abgespielt wird:
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
if (PlaybackState(instance) != FMOD.Studio.PLAYBACK_STATE.PLAYING)
{
instance = FMODUnity.RuntimeManager.CreateInstance(fmodEvent);
instance.start();
}
else
{
Debug.Log("Instanz spielt schon gerade!");
}
}
if (Input.GetKeyDown(KeyCode.LeftControl))
{
if (PlaybackState(instance) == FMOD.Studio.PLAYBACK_STATE.PLAYING)
{
instance.stop(FMOD.Studio.STOP_MODE.ALLOWFADEOUT);
instance.release();
}
else
{
Debug.Log("Instanz wird gerade nicht abgespielt!");
}
}
}
Ähnlicherweise können wir die Playback States dazu verwenden, um festzustellen, ob sich die Instanz gerade im Sustain-Modus befinden:
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
if (PlaybackState(instance) != FMOD.Studio.PLAYBACK_STATE.PLAYING && PlaybackState(instance) != FMOD.Studio.PLAYBACK_STATE.SUSTAINING)
{
instance = FMODUnity.RuntimeManager.CreateInstance(fmodEvent);
instance.start();
}
else if (PlaybackState(instance) == FMOD.Studio.PLAYBACK_STATE.SUSTAINING)
{
instance.triggerCue();
}
else
{
Debug.Log("Instanz spielt schon gerade!");
}
}
}
Im Unityprojekt habe ich noch eine Canvas hinzugefügt, um die Informationen über den Playback State zu visualisieren.