In questa lezione vedremo come aggiungere audio ad un gioco fatto in Unity, mediante una combinazione di componenti che si usano per riprodurre suoni, ed uno (di solito posto sulla telecamera) che si occupa di ascoltarli.
Importare suoni
Per prima cosa prima di poter mandare in play dei suoni, dobbiamo importare un file audio in un oggetto AudioClip (questo è anche il nome della classe suono, quando ci troveremo a programmare). Unity supporta diversi formati: non compressi come .wav o .aiff, oppure compressi come .mp3
, e .ogg
.
- I suoni salvati in formati compressi occupano meno spazio su disco, perché sono stati compressi, ovvio, e anche perché accettiamo una certa perdità di qualità (questo dipende da quanto era distruttiva la compressione applicata!). Tuttavia essi vanno decompressi prima di essere suonati. Per questo motivo è preferibile utilizzarli per suoni lunghi, come la musica, che dopo la prima decompressione possono essere riprodotti in tranquillità per diversi minuti.
- Viceversa, i file non compressi sono più adatti a suoni brevi, per i quali la compressione non farebbe risparmiare molto spazio. Inoltre, il processore non deve fare lo sforzo di decomprimerli prima di mandarli in play, il che li rende adatti ad un “uso frequente”, come nel caso degli effetti sonori.
Indipendentemente dal formato di origine, in alcuni casi Unity permette di cambiare da compresso a non compresso e viceversa.
Importiamo un file .wav (semplicemente trascinandolo nella cartella del progetto) e selezioniamolo. Questo è quello che appare nell'Inspector:
Come dicevamo, Audio Format ci permette di scegliere fra Native e Compressed. Scegliendo Compressed, abiliteremo l'opzione in basso Compression per decidere a che bitrate comprimere il suono. Come nel caso delle texture, ricordiamo che questa compressione non è distruttiva: Unity conserva in ogni caso una copia dell'asset originale, quindi possiamo sentirci liberi di sperimentare con diversi bitrate (il che vuol dire premere il tasto Apply, altrimenti le modifiche non vengono salvate).
Quando un suono è compresso, alla pressione del tasto Apply, Unity rivela anche la dimensione che questo ha sul disco una volta compresso, in questo caso 153 KB, degli originali 349 KB:
3D Sound è un'opzione molto interessante, che rende il suono localizzabile nello spazio. Vale a dire che quando il suono viene mandato in play da un componente presente su un oggetto, esso verrà trattato come se fosse stato fisicamente emesso precisamente nelle coordinate di quell'oggetto, il che permette tutta una serie di possibilità: in primis, di localizzare il suono (meglio che in maniera stereo!), ridurne il volume in base alla distanza dall'ascoltatore, e di produrre l'effetto Doppler se l'ascoltatore o il suono si stanno muovendo l'uno rispetto all'altro.
Al contrario, un suono 2D (ovvero quando 3D è disattivo) è un semplice suono stereo o mono, che viene suonato in base al suo volume e al suo bilanciamento destra-sinistra, senza avere una collocazione nello spazio. è la scelta più classica per effetti sonori di menu o per la musica, che ha già un bilanciamento di suo dei vari strumenti (a meno che non sia musica proveniente da un oggetto contestualizzato in una scena 3D, come una radio o un grammofono).
Load Type indica il modo in cui il suono viene decompresso, e quando. Decompress on Load indica che il suono viene decompresso appena caricato, ovvero appena la scena viene lanciata, ancora prima di dover essere suonato. In questo modo il suono rimane in memoria occupando “molto” spazio, ma quando sarà necessario suonarlo sarà istantaneamente pronto.
Compressed in memory indica che il suono viene caricato, ma mantenuto in memoria in maniera compressa. Solo quando dovrà essere suonato verrà decompresso ‘al volo’, con una piccola perdita di performance. Se il suono è molto lungo, questa perdita potrebbe diventare un problema.
Infine, Stream from Disc indica che il suono non viene pre-caricato, ma letto da disco solo al momento in cui serve. Qui abbiamo il minore impatto sulla memoria in principio, e poi un po' di lavoro da fare sul disco al momento in cui il suono deve essere suonato. è consigliabile non avere troppi suoni in streaming da disco allo stesso tempo, perché la lettura da disco (specialmente se un hard disk) potrebbe non essere così veloce da supportarli tutti insieme.
Hardware Decoding e Gapless Looping sono opzioni dedicate ai cellulari iOS e Android, utili per ottimizzare i suoni in maniera specifica su queste piattaforme.
Riprodurre i suoni (Play)
Una volta importato un suono, può essere mandato in play da un componente specifico che si chiama Audio Source. Tutti i suoni in Unity partono da un Audio Source, anche se più suoni potrebbero condividere lo stesso Audio Source.
Ad esempio, un oggetto solo potrebbe occuparsi di lanciare la riproduzione di tutti i suoni dell'interfaccia di un menu. L'unico problema sarebbe che in quel caso non si potrebbero sovrapporre due suoni (perché l'Audio Source può suonare un suono alla volta).
Per ascoltare i suoni serve un altro componente, di nome Audio Listener. Questi agisce come un orecchio, o un microfono, ascoltando tutti gli Audio Source nelle vicinanze e nel raggio d'azione (definito dall'Audio Source, dal suo volume, ecc.). Di fatto, il componente Audio Listener non ha opzioni o impostazioni:
Di contro, l'Audio Source ha una marea di impostazioni che permettono di controllare la riproduzione dei suoni nel dettaglio. Creiamo un oggetto vuoto ed assegniamo un AudioSource:
La prima cosa da assegnare è l'Audio Clip, ovvero l'asset sonoro importato prima, altrimenti l'AudioSource non suonerà nulla. Volume, Loop e Pitch sono abbastanza autoesplicativi, ma andiamo a vedere altre proprietà peculiari.
Play On Awake deve essere impostato se vogliamo che l'effetto sonoro suoni appena l'oggetto appare in scena. Se così non fosse, dovremo usare lo scripting per mandare in play il suono in un secondo momento (così come per Mute, se fosse attivo dovremmo agire via programmazione per rimuoverlo e sentire il suono).
Bypass Effects, Bypass Listener Effects e Bypass Reverb Zones servono tutti e tre a rendere l'Audio Source temporaneamente “immune” ad effetti e zone di riverbero.
Priority indica la priorità che questo audio ha nell'essere suonato in caso di situazioni critiche. Vale a dire, ammettiamo che ci siano una miriade di suoni in play e che l'hardware non abbia le risorse per suonarli tutti, Priority indica le chance che questo suono venga suonato rispetto agli altri (maggiore la priorità, più risorse gli verranno dedicate).
Come detto prima, un suono può essere 3D, e sotto 3D Sound Settings possiamo regolare come si comporta rispetto al posizionamento.
Doppler Level indica quanto il suono rispetta l'effetto Doppler, dove 0 = nessun effetto e valori maggiori di 1 indicano un effetto accentuato.
Importantissimo è il Volume Rolloff: indica quanto il volume viene attenuato in base alla distanza fra l'Audio Source e l'Audio Listener. Logarithmic è un rolloff molto brutale, dove il volume decresce rapidamente. Linear è più graduale, il che vuol dire che il suono si sente anche a maggiori distanze.
Il rolloff può essere regolato mediante Min Distance e Max Distance: al di sotto di Min Distance, il suono è a pieno volume. Il volume decresce con la distanza (secondo il grafico in basso) fino a diventare zero in corrispondenza di Max Distance.
Nota: il fatto che Max Distance sia 500
(ad esempio) vuol dire che il suono teoricamente muore a 500
unità dall'emettitore, ma con il Logarithmic falloff già anche a 10 unità potrebbe non sentirsi granché. Come si può vedere dalla figura sopra, la linea verticale rossa nel grafico indica la posizione dell'Audio Listener. Anche se questi è distante circa 15 unità, il volume è già 0.05
, quasi inaudibile. Se nel creare un suono non lo sentite, e questo suono è 3D, controllate per prima cosa se il problema è il falloff (basta impostare temporaneamente il suono come 2D per verificare se il problema è quello).
Zone di riverbero ed Effetti
Le zone di riverbero sono, come suggerisce il nome, delle aree nelle quali i suoni vengono distorti come a simulare il riverbero di ambienti chiusi. Si può creare una zona di riverbero andando su GameObject > Create > Reverb Zone
. Questa verrà visualizzata come due sfere concentriche nella Scene View:
Quando un Audio Listener si trova nella sfera più interna, l'effetto riverbero è al 100%. Va sfumando fino alla sfera esterna, dove diventa 0%
. Mentre l'Audio Listener è all'interno della sfera più esterna, qualunque Audio Source subisce l'effetto riverbero (a meno che su di esso non sia impostato Bypass Reverb Zones).
Visto dall'Inspector, il componente Reverb Zone presenta poche impostazioni: la possibilità di definire l'area del riverbero, ed una serie di parametri (complessi!) per gestire qualunque aspetto del riverbero. Fortunatamente il valore Reverb Preset ci fornisce una nutrita lista di preset fra cui scegliere:
Oltre al riverbero, esistono tutta una serie di effetti audio che si possono aggiungere agli Audio Source, come eco, high pass, ecc. Sfortunatamente, questi sono solo per gli utenti di Unity Pro, quindi non ci soffermeremo molto su di essi. Basterà dire che, come tutti i componenti, si applicano dal menu Component, e possono essere spostati o rimossi dall'Inspector.
L'unica cosa degna di nota è che l'ordine in cui questi appaiono nell'Inspector è importante, perché vengono applicati dall'alto verso il basso (nell'immagine, prima il Low Pass e poi il Chorus):
Nota: I filtri audio sono una feature abbastanza pesante in termini computazionali, rendendone difficile l'uso su mobile.