I Playback States di FMOD ci permettono di ricevere informazioni sullo stato di riproduzione di un’instanza. L’instanza è attualmente in riproduzione? Oppure è nello stato di attack o arresto/release? L’evento è attualmente in pausa su un sustain point?
Scarica il progetto Unity & FMOD su questo Tutorial.
Gli stati di riproduzione sono particolarmente utili se vogliamo per esempio evitare che un suono venga riprodotto due volte a causa di errori nel codice.
Come negli altri tutorial, dichiariamo prima una FMOD EventInstance e una stringa con il percorso dell’evento che selezioniamo nell’inspector:
private FMOD.Studio.EventInstance instance;
[FMODUnity.EventRef]
public string fmodEvent;
Creiamo un metodo che dichiara un EventInstance come parametro e restituiamo lo Stato di riproduzione dell’istanza:
FMOD.Studio.PLAYBACK_STATE PlaybackState(FMOD.Studio.EventInstance instance)
{
FMOD.Studio.PLAYBACK_STATE pS;
instance.getPlaybackState(out pS);
return pS;
}
Come brevemente descritto sopra, una semplice applicazione è quella di verificare se un’istanza è già in stato di riproduzione. Sempre nel metodo Update() di Unity attiviamo un’istanza con la barra spaziatrice e la fermiamo con il tasto di controllo sinistro. Questa volta verifichiamo se l’istanza è già in riproduzione grazie al metodo PlaybackState()
da noi creato:
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("L'istanza viene già riprodotta!");
}
}
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("L'istanza non viene riprodotta!");
}
}
}
Allo stesso modo, possiamo usare i Playback States per determinare se l’istanza è attualmente in modalità sustain:
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("L'istanza viene già riprodotta!");
}
}
}
Nel progetto allego ho ulteriormente aggiunto una canvas per visualizzare le informazioni sullo stato di riproduzione.