Unity 3D – AAA Sound Manager – JavaScript

Best practices for playing a lot of audio.

Create a Unity 3D Project with:

1. Main Camera

2. Cube, attach the script ‘GetAudioCenter.js’:


#pragma strict

// private to hide in inspector: nome dello script da prelevare
private var audioCenter : AudioCenterScript;

function Start () {
    // inserisco in una variabile l'oggetto con tag AudioCenter
    var audioCenterObject : GameObject = GameObject.FindWithTag ("AudioCenter");
    // se l'oggetto con tag GameController esiste lo inserisco in una variabile
    if (audioCenterObject != null)
    {
        audioCenter = audioCenterObject.GetComponent (AudioCenterScript);
    }
    // se l'oggetto con tag GameController non esiste restituisce un messaggio di errore
    if (audioCenterObject == null)
    {
        Debug.Log ("Cannot find 'AudioCenterScript' script");
    }
}

function Update () {
}


function OnMouseDown ()
{
        // When you click over the object
        Debug.Log('clicked'); // Debug Code, remove in the end
        // invia a AudioCenterScript.js, alla funzione play sound il suono da utilizzare
        var trackValue : int = 1;
        audioCenter.PlayTrack (trackValue);
}

3. Empty Object> Inspector:

a. name it ‘AudioCenter’
b. tag it ‘AudioCenter’
c. Transform> Reset, it puts the object at 0,0,0
d. Add Component> Audio Souce> uncheck ‘Play On Awake’ -> VERY IMPORTANT
e. attach the script ‘AudioCenterScript.js’:


#pragma strict

// assign the audio clips into Inspector START ###########
// NOTICE: the best practice is to use understandable names
// IMPORTANT: you can organize your audio clips into separate AudioCenter, example: dance, classic etc...
var bigJump: AudioClip;        // track 1
var smallJump: AudioClip;      // track 2
var miniJump: AudioClip;       // track 3
var outWaterJump: AudioClip;   // track 4
// assign the audio clips into Inspector END #############

function Start () {

}

function Update () {

}

function PlayTrack (trackValue : int) {
if (trackValue == 1)
    {
        // play the track 1, volume 0-1
        // here you can setup via code volume of the track or SFX
        audio.PlayOneShot(bigJump, 1);
    }
    // if (trackValue == 2) -> it will play track 2 and so on...
}

Inspector assign your SFX (wav or mp3) to vars

4. Play! If you click over the cube, the sfx of AudioCenter(Empty Object)>AudioCenterScript.js plays.

Spiegazioni in italiano:

Immaginiamo di dover realizzare un platform come Super Mario per Wii che contiene centinaia di effetti sonori, differenti per ogni nemico che incontriamo in questo platform. E’impensabile poter gestire una tale quantità di effetti aggiungendoli semplicemente ai singoli prefab sparsi per i livelli, magari alcuni di questi suoni potrebbero essere pure condivisi da diversi oggetti o scaturire in azioni e reazioni varie sparse per decine di mondi virtuali giocabili.

La soluzione è quella di creare un solo oggetto vuoto che ha lo scopo di:

– contenere la lista completa dei suoni all’interno di variabili
– gestirne il volume tramite la funzione di Unity3D, PlayOneShot()
– avere un’unica ‘Audio Souce’ in game. La funzione PlayOneShot() ci permetterà di utilizzare anche più suoni nello stesso istante, sovrapponendoli.

Come funziona il nostro codice?

1. GetAudioCenter.js
a. Rileva l’esistenza dell’oggetto con il tag ‘AudioCenter’
b. Se positiva ottiene lo script ‘AudioCenterScript.js’ attaccato all’oggetto ‘AudioCenter’
c. Invia a AudioCenterScript.js> funzione PlayTrack() un valore ID della traccia
b. Rileva il click del mouse all’oggetto al cui è applicato come componente

2. AudioCenterScript.js
a. Incorpora nelle variabili le tracce sonore
b. Riceve all’interno della funzione PlayTrack(), la variabile trackValue
c. In base a trackValue viene eseguita una specifica traccia utilizzando il componente ‘Audio Source’. Questo ha di default disattivato il parametro ‘Play On Awake’, quindi è muto finchè non arriva l’input di GetAudioCenter.js