Come utilizzare il suono per creare la geometria 3D in Unity

Cosa starai creando

In questo tutorial, imparerai come creare un semplice visualizzatore audio in Unity. Analizzeremo il codice che legge i dati audio e quindi attraverso diversi modi per applicare questi dati all'interno di un gioco Unity.
Avrai bisogno di una comprensione di base di Unity per realizzare questo. Avrai anche bisogno del file musicale di una canzone per visualizzarlo: vai a trovare qualcosa su newgrounds.com se hai bisogno di qualcosa di divertente, come Mission Completed XL.
I file di progetto possono essere trovati su GitHub, se vuoi verificarli, ma non sono strettamente necessari per farlo. Il .Unity3D il file che utilizzeremo in seguito è anche lì.
Pronto? Andiamo!

1. Visualizer di linea

Crea un nuovo progetto Unity, aggiungi il tuo file musicale alla cartella degli asset, quindi crea un nuovo file JavaScript e chiamalo lineVisualizer. Apri questo file e aggiungi il seguente codice:

dettaglio var pubblico: int = 500; ampiezza pubblica var: float = 0.1; private var startPosition: float; function Start () startPosition = transform.localPosition.y;  function Update () var info: float [] = new float [detail]; AudioListener.GetOutputData (informazioni, 0); var packagedData: float = 0.0; per (var x: int = 0; x < info.Length; x++)  packagedData += System.Math.Abs(info[x]);  

Questo script prenderà i dati audio disponibili e li applicherà in determinati modi. La variabile detail indica con quale "risoluzione" leggere i dati audio. Valori più alti in questo punto possono creare un risultato più "nervoso". Puoi sperimentare per scoprire l'impostazione migliore in un secondo momento e lasciarlo al valore di base per ora.
In questo momento, non fa nulla, poiché non abbiamo specificato cosa c'è da fare e cosa ascoltare.
Aggiungi la seguente riga alla fine del Aggiornare() funzione nel lineVisualizer script:

transform.localPosition.y = startPosition + packagedData * ampiezza;

Quindi, crea una sfera, chiamala LineVisualizer, e aggiungere lo script ad esso. Muovi il LineVisualizer di fronte alla telecamera.

Abbiamo anche bisogno di avere il suono nella scena, quindi andiamo a quello. Crea un nuovo oggetto e chiamalo Sorgente Audio; sarà il "diffusore" che crea la musica. È possibile trascinare il file musicale dalla cartella delle risorse su di esso e inizierà a riprodurre il file immediatamente all'avvio della scena.

Prima di provarlo, però, imposta il componente audio su giocare immediatamente e a ciclo continuo. Inoltre, vai al file musicale stesso e impostalo su Suono 2D. Ciò garantirà che la musica possa essere ascoltata altrettanto bene, ovunque sia Sorgente Audio è posto. Infine, crea un prefabbricato, in modo che possiamo usarlo in seguito.

Se tutto è stato impostato correttamente, il lineVisualizer dovrebbe muoversi su e giù. Successo! I dati audio vengono letti e applicati in modo divertente e interessante.

Ora rendiamolo più carino.

Crea un oggetto vuoto e aggiungi un renderizzatore del percorso ad esso, e incatenalo al lineVisualizer. Queste impostazioni di traccia creeranno un bell'effetto:

Catena il LineVisualizer alla fotocamera, in modo che si muova quando si muove la telecamera. Il setup dovrebbe assomigliare a questo:

Successivamente, crea un piccolo file JavaScript chiamato rotation.js, e aggiungere il seguente codice ad esso:

#pragma strict var speed: float = 15.0; function Update () transform.Rotate (0, speed * Time.deltaTime, 0); 

Metti lo script di rotazione sulla fotocamera, in modo che ruoti su se stesso.

Provalo! La sfera dovrebbe rimbalzare su e giù e tracciare una linea dietro di essa.

Per renderlo più bello, trasforma il cubo invisibile deselezionando il suo componente di rendering mesh e posizionalo un po 'più in basso in modo che non salti fuori dallo schermo. Inoltre, imposta il colore dello sfondo della fotocamera sul nero, aggiungi una luce direzionale nella scena e dai alla traccia un bel colore e materiale.

Dovresti avere un semplice visualizzatore di linee, che salterà e scenderà con la musica, e disegnerà una linea adatta. Provalo in questa build:

2. Visualizzatore barre

I visualizzatori di barre sono un po 'più complicati. Metteremo diverse "barre" una accanto all'altra, che salteranno alla musica, ognuna a modo suo. Ottenere un "vero" visualizzatore di barre è molto più complicato di quanto questa semplice introduzione possa coprire, quindi dovremo crearne uno falso (che sembrerà comunque buono).

Nei file di progetto, troverai un file 3D con un cubo speciale. Non è rigorosamente necessario, quindi puoi saltarlo se vuoi.

Crea un nuovo cubo e sostituisci la mesh cubo standard per il suddetto visualizerCube maglia. Il nuovo ha il suo punto centrale su un lato. Quando scaliamo il cubo durante il runtime, si muoverà solo in una direzione.
Crea un nuovo script chiamato barVisualizer. Aggiungi il seguente codice:

#pragma strict public var detail: int = 500; public var minValue: float = 1.0; ampiezza pubblica var: float = 0.1; private var startScale: Vector3; function Start () startScale = transform.localScale;  function Update () var info: float [] = new float [detail]; AudioListener.GetOutputData (informazioni, 0); var packagedData: float = 0.0; per (var x: int = 0; x < info.Length; x++)  packagedData += System.Math.Abs(info[x]);  transform.localScale = new Vector3(minValue, (packagedData * amplitude) + startScale.y, minValue); 

È simile al lineVisualizer script, ma i comandi che regolano la posizione sono stati modificati. Ora regolano l'altezza verticale del cubo.
Crea un cubo, chiamalo BarVisualizer, dagli un bel colore e metti lo script che hai appena creato. Quindi creane diverse copie e posizionale una accanto all'altra di fronte alla telecamera. Dovrebbe sembrare come questo:

Se lo provi, noterai che tutti i cubi si muovono allo stesso modo. Per fare in modo che ogni cubo cresca e si riduca come barre, adattare il codice in modo che assomigli a questo:

#pragma strict public var detail: int = 500; public var minValue: float = 1.0; ampiezza pubblica var: float = 0.1; private var randomAmplitude: float = 1.0; private var startScale: Vector3; function Start () startScale = transform.localScale; randomAmplitude = Random.Range (0.5, 1.5);  function Update () var info: float [] = new float [detail]; AudioListener.GetOutputData (informazioni, 0); var packagedData: float = 0.0; per (var x: int = 0; x < info.Length; x++)  packagedData += System.Math.Abs(info[x]);  transform.localScale = new Vector3(minValue, (packagedData * amplitude * randomAmplitude) + startScale.y, minValue); 

Ciò conferisce a ciascuna barra la sua "forza", con cui si muove. Puoi vedere l'effetto in questa build:

3. Visualizzazione con scala 3D

Questo è un po 'diverso. Invece di regolare il altezza di un oggetto, mostreremo la visualizzazione ridimensionando un intero oggetto su e giù. Questo può essere usato per elementi di sfondo nei giochi basati sulla musica, o per far spostare particelle e altri effetti sulla musica.
Il codice è praticamente lo stesso di barVisualizer, con i comandi di ridimensionamento potenziati per ridimensionare anche in tre dimensioni:

#pragma strict public var detail: int = 500; public var minValue: float = 1.0; ampiezza pubblica var: float = 0.1; private var randomAmplitude: float = 1.0; private var startScale: Vector3; function Start () startScale = transform.localScale; randomAmplitude = Random.Range (1.0, 3.0);  function Update () var info: float [] = new float [detail]; AudioListener.GetOutputData (informazioni, 0); var packagedData: float = 0.0; per (var x: int = 0; x < info.Length; x++)  packagedData += System.Math.Abs(info[x]);  transform.localScale = new Vector3((packagedData * amplitude) + startScale.y, (packagedData * amplitude) + startScale.y, (packagedData * amplitude) + startScale.z); 

Mettilo su una sfera (o qualsiasi altro oggetto a tua scelta) e crea diverse copie per un effetto piacevole. Provalo in questa build:

Conclusione

In questo tutorial, hai imparato come creare un semplice e autonomo visualizzatore audio all'interno di Unity, che può essere applicato in molti modi diversi. Potresti usare queste tecniche per progettare spettacoli di luci psichedelici che si muovono nel tempo alla musica, o come dati sorgente che servono come base per un intero gioco, come la generazione del livello in Audiosurf, dove gli ostacoli che devi evitare compaiono in tempo per battere. Impazzire!