Riprodurre gli eventi FMOD in Unity non è particolarmente difficile, ma abbiamo a disposizione una serie di metodi che potrebbero fare più o meno senso a seconda della nostra applicazione. In questo tutorial presenterò una panoramica dei metodi disponibili per attivare e riprodurre i nostri eventi.
Scarica il progetto Unity & FMOD per questo tutorial.
Come possiamo riprodurre gli eventi FMOD in Unity?
Possiamo riprodurre gli eventi FMOD in tre modi diversi:
- Con l’aiuto del component FMOD Studio Event Emitter.
- Con la funzione di supporto PlayOneShot nel codice.
- Con dichiarazione manuale e start/stop dell’evento nel codice.
Tutte queste possibilità hanno vantaggi e svantaggi pratici:
- L’Event Emitter ci permette di riprodurre eventi senza codice. In combinazione con il component Studio Parameter Trigger è ulteriormente possibile modulare i parametri di un evento.
- Con la funzione di supporto PlayOneShot possiamo riprodurre un evento con una riga di codice. FMOD si occupa automaticamente della riproduzione e ferma o libera l’istanza sonora dalla memoria. Uno svantaggio di questo metodo è che non sono possibili modifiche dei parametri di un evento. Se il suono deve essere modificato da un parametro di gioco, PlayOneShot non è un metodo adatto.
- La riproduzione manuale degli eventi, d’altra parte, richiede più codice, ma è molto più flessibile, poiché è possibile definire esattamente quando un suono o un loop deve essere riprodotto e fermato, e dove devono essere effettuate le modulazioni dei parametri.
Riprodurre eventi FMOD con il component Studio Event Emitter
Per una riproduzione semplice degli eventi creiamo un nuovo GameObject e inseriamo il component Studio Event Emitter nell’inspector di Unity:
Qui troviamo diverse impostazioni con le quali possiamo influenzare la riproduzione degli eventi. Con Play Event e Stop Event determiniamo quando l’evento deve essere attivato e fermato. Con Event selezioniamo l’evento da una lista di eventi creati in precedenza. Attiva e disattiva questo GameObject per ascoltare il suono.
PlayOneShot
Il metodo PlayOneShot crea immediatamente un’istanza di un evento in un luogo specifico (per impostazione predefinita, l’origine del GameObject). Il suono verrà riprodotto completamente e i parametri non possono essere impostati come sopra indicato. Il codice per PlayOneShot è:
FMODUnity.RuntimeManager.PlayOneShot("event:/Esempio");
event:/Esempio
è un percorso che si riferisce all’evento che abbiamo creato in FMOD Studio. I percorsi seguono la struttura delle cartelle in FMOD Studio e quindi possiamo semplicemente inserirli manualmente nel codice. In alternativa, è possibile fare clic con il tasto destro del mouse su un evento in FMOD Studio per copiarne il percorso.
Inseriamo il codice nel metodo Update() dello script. Nell’istruzione condizionale if, controlliamo se la barra spaziatrice è stata premuta e in questo caso, il suono verrà riprodotto:
if (Input.GetKeyDown(Keycode.Space))
{
FMODUnity.RuntimeManager.PlayOneShot("event:/Esempio");
}
Il codice completo per utilizzare la funzione PlayOneShot è:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayOneShotEsempio : MonoBehaviour
{
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{ FMODUnity.RuntimeManager.PlayOneShot("event:/Esempio");
}
}
}
Se ora vai in modalità Play e premi la barra spaziatrice, sentirai il suono che hai inserito nell’evento creato in FMOD Studio. Nell’angolo in alto a sinistra vedrai anche una piccola finestra di debug che mostra il volume in RMS e il numero di voci attive:
Qual è la differenza tra un evento e un’istanza?
Un evento è un’unità audio creata in FMOD Studio che può contenere varie tracce, parametri e automazioni. Una copia o istanza dell’evento viene creata nel gioco. Nel gioco, non si avvia l’evento in sé, ma piuttosto l’istanza di un evento. Ciò consente di avere più copie di un evento in riproduzione contemporaneamente.
Riproduzione e controllo manuale degli eventi FMOD tramite codice
Cinque passi sono necessarie per riprodurre e controllare manualmente un evento FMOD in Unity:
- Dobbiamo dichiarare un istanza dell’evento FMOD
- Indicare a Unity quando deve essere creata un’istanza dell’evento FMOD e dove si trova questo evento.
- Attivare e/o disattivare l’istanza dell’evento.
- Liberare l’istanza dalla memoria.
Passiamo ora ad esaminare questi punti passo dopo passo.
Dichiarare l’istanza dell’evento FMOD
Dobbiamo dichiarare tutti gli eventi che saranno utilizzati in questo script come istanza prima di procedere. Nel nostro caso, inseriremo questa riga nel codice:
private FMOD.Studio.EventInstance instance;
Creare l’istanza
Nella funziona Start()
di Unity creiamo quindi l’istanza dell’evento:
void Start()
{
instance = FMODUnity.RuntimeManager.CreateInstance(“event:/Esempio”);
}
Riprodurre l’istanza
Dopodiché il suono può essere riprodotto tramite il metodo instance.start()
. Ho anche inserito la riga di codice nel metodo Update() all’interno di un’istruzione if, in modo che il suono venga riprodotto solo quando si preme la barra spaziatrice:
if (Input.GetKeyDown(KeyCode.Space))
{
instance.start();
}
Se osserviamo di nuovo la finestra di debug FMOD nell’angolo in alto a sinistra, probabilmente noterai che rispetto a PlayOneshot, premendo più volte la barra spaziatrice, solo un’istanza dell’evento verrà riprodotta. Il suono verrà interrotto ogni singola volta che ri-premiamo la barra spaziatrice. Questo accade perché abbiamo creato l’istanza nel metodo Start()
di Unity. Questa funzione viene eseguita una volta all’inizio del gioco. Se vogliamo avere un’istanza separata per ogni suono riprodotto, dobbiamo anche inserire il codice di creazione dell’istanza nel blocco dell’istruzione if.
Attenzione: con questo metodo manuale, le istanze non vengono automaticamente liberate dalla memoria. Questo può causare problemi. Aggiungiamo il codice instance.release()
dopo aver eseguito l’istanza, in modo che l’istanza sia liberata dopo essere stata riprodotta.
Il codice completo per questo esempio:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EsempioManuale : MonoBehaviour
{
private FMOD.Studio.EventInstance instance;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
instance = FMODUnity.RuntimeManager.CreateInstance("event:/Esempio");
instance.start();
instance.release();
}
}
}
Come riprodurre Loop tramite FMOD e Unity?
I loop possono essere eseguiti in maniera sicura utilizzando il metodo manuale. Ma come si creano i loop e come li fermiamo?
Torniamo su FMOD Studio e diamo un’occhiata all’evento LoopEvent nel progetto. È possibile creare una regione di loop facendo clic con il tasto destro del mouse sulla voce Add Loop Region:
Possiamo spostare la regione del loop quanto vogliamo, in modo simile alla funzione Loop di alcune DAW. Spostiamo la regione del loop per includere l’intero file audio, salvare e generiamo il progetto.
Nel progetto Unity avvia la scena Loop e premi la barra spaziatrice. L’evento verrà riprodotto in un loop continuo.
Come fermare un loop in Unity?
Con la riga di codice:
instance.stop(FMOD.Studio.STOP_MODE.ALLOWFADEOUT);
possiamo fermare l’istanza dell’evento. Nella funzione Update() inseriamo di nuovo un’istruzione if che fermerà il nostro suono premendo il tasto di control sinistro (CTRL):
if (Input.GetKeyDown(KeyCode.LeftControl))
{
instance.stop(FMOD.Studio.STOP_MODE.ALLOWFADEOUT);
instance.release();
}
STOP_MODE.ALLOWFADEOUT
rispetta il tempo di release nella modulazione ADSR dell’evento (se presente). Se invece vogliamo che il suono si arresti immediatamente usiamo STOP_MODE.IMMEDIATE
.
Il codice completo per un loop è questo:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EsempioLoop : MonoBehaviour
{
private FMOD.Studio.EventInstance instance;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
instance = FMODUnity.RuntimeManager.CreateInstance("event:/LoopEvent");
instance.start();
}
if (Input.GetKeyDown(KeyCode.LeftControl))
{
instance.stop(FMOD.Studio.STOP_MODE.ALLOWFADEOUT);
instance.release();
}
}
}
Ora possiamo riprodurre e fermare il loop alternativamente con la barra spaziatrice e il tasto control sinistro.
Riprodurre suoni 3D con FMOD in Unity
Gli eventi 3D differiscono dagli eventi 2D in quanto riproducono un suono 3D con spazializzazione (effetto Spatializer). Ha uno attenuazione di volume basato sulla distanza dall’istanza e dall’ascoltatore e un panning basato sulla posizione dell’istanza nella direzione in cui l’ascoltatore è diretto.
Un evento non ha necessariamente bisogno di un effetto di spazializzazione per essere un evento 3D. Può anche utilizzare parametri incorporati (come distanza, direzione, ecc.) per automatizzare proprietà come il volume e filtri per dare l’impressione di spazializzazione.
In FMOD Studio, un evento 2D può essere facilmente convertito in un evento 3D aggiungendo l’effetto Spatializer alla traccia master:
Ora spiegherò brevemente le impostazioni più importanti dello Spatializer:
- Min & Max Distance und curva Distance Attenuation : Queste proprietà dello Spatializer determinano quanto il segnale viene attenuato a distanze diverse. Il segnale non viene attenuato se l’ascoltatore si trova entro la distanza minima dello spazializzatore, è -oo dB se l’ascoltatore si trova al di fuori della distanza massima, e scende secondo una curva quadratica lineare mentre l’ascoltatore si sposta dalla distanza minima alla distanza massima. A seconda della curva, il segnale viene attenuato in modo diverso.
- Envelopment: Envelopment determina l’estensione dell’evento a qualsiasi distanza dall’ascoltatore. La modalità Auto imposta l’espansione minima a 0 gradi e imposta la Sound Size (dimensione del suono) al doppio della proprietà Min-Distance dello Spatializer.
- La modalità User ci permette di impostare manualmente la dimensione del suono e l’espansione minima dello Spatializer, mentre la modalità Off disabilita la dimensione del suono e l’espansione minima.
Nel codice stesso, abbiamo solo bisogno di fare una piccola modifica, cioè di dire a FMOD dove si trova l’istanza nello spazio 3D. Abbiamo anche qui due diverse opzioni. O impostiamo gli attributi 3D direttamente nella funzione Update() di uno script con questa riga di codice:
instance.set3DAttributes(FMODUnity.RuntimeUtils.To3DAttributes(gameObject));
Oppure aggiungiamo le informazioni all’oggetto GameObject una volta che abbiamo creato l’istanza:
FMODUnity.RuntimeManager.AttachInstanceToGameObject(instance, GetComponent<Transform>(), GetComponent<Rigidbody>());
A seconda che il GameObject abbia o meno un Rigidbody, possiamo usare uno dei due metodi. Il secondo metodo utilizza il Rigidbody per determinare la velocità del GameObject e per attivare un’eventuale effetto Doppler. Il codice per un evento 3D può essere scritto in questo modo:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Esempio3D : MonoBehaviour
{
private FMOD.Studio.EventInstance instance;
void Start()
{
instance = FMODUnity.RuntimeManager.CreateInstance("event:/3DEvent");
// FMODUnity.RuntimeManager.AttachInstanceToGameObject(instance, GetComponent<Transform>(), GetComponent<Rigidbody>());
instance.start();
}
void Update()
{ instance.set3DAttributes(FMODUnity.RuntimeUtils.To3DAttributes(gameObject));
}
}
Nella scena 3DEvent allegata, utilizzare i tasti WASD e il tasto destro del mouse per spostarsi nella stanza e ascolta come il suono reagisce agli spostamenti.