• Skip to primary navigation
  • Skip to main content

Alessandro Famà

Technical Audio Design

  • Portfolio
  • Tutorial
  • About
  • Alessandro Famà
  • Tutorial FMOD-Unity
  • Playback States degli eventi FMOD in Unity

    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.