Hur man använder ljud för att göra 3D geometri i enhet

Vad du ska skapa

I den här handledningen lär du dig hur du gör en enkel ljudvisare i Unity. Vi går igenom koden som läser ut ljuddata och sedan på flera olika sätt att tillämpa dessa data i ett Unity-spel.
Du behöver en grundläggande förståelse för enhet för att uppnå detta. Du behöver också musikfilen för en sång för att visualisera - gå och hitta något på newgrounds.com om du behöver något roligt, som Mission Complete XL.
Projektfilerna finns på GitHub, om du vill kolla in dem, men är inte absolut nödvändiga för att uppnå detta. De .Unity3D fil vi senare använder är också där inne.
Redo? Nu går vi!

1. Line Visualizer

Skapa ett nytt Unity Project, lägg till din musikfil i aktivmappen och skapa en ny JavaScript-fil och namnge den lineVisualizer. Öppna den här filen och lägg till följande kod:

allmänhetens detalj: int = 500; allmän varamplitud: float = 0,1; privat var startPosition: float; funktion Start () startPosition = transform.localPosition.y;  funktion Uppdatering () var info: float [] = ny float [detalj]; AudioListener.GetOutputData (info, 0); var packagedData: float = 0.0; för (var x: int = 0; x < info.Length; x++)  packagedData += System.Math.Abs(info[x]);  

Detta skript tar de tillgängliga ljuddata och tillämpar den på vissa sätt. Detaljeringsvariabeln berättar med vilken "upplösning" för att läsa ut ljuddata. Högre värden på denna plats kan skapa ett mer "jittery" resultat. Du kan experimentera för att ta reda på den bästa inställningen senare och lämna den till grundvärdet för nu.
Just nu gör det ingenting, eftersom vi inte har angett vad det finns att göra och vad man ska lyssna på.
Lägg till följande rad i slutet av Uppdatering() funktion i lineVisualizer manus:

transform.localPosition.y = startposition + packagedData * amplitud;

Skapa sedan en sfär, namnge den LineVisualizer, och lägg till manuset till det. Flytta LineVisualizer framför kameran.

Vi behöver också ha ljudet i scenen, så låt oss ta reda på det. Skapa ett nytt objekt och namnge det Ljudkälla; det blir "högtalaren" som skapar musiken. Du kan dra musikfilen från aktivmappen på den och det börjar börja spela filen omedelbart när du startar scenen.

Innan vi försöker det, ställa in ljudkomponenten till spela omedelbart och till slinga. Gå också till musikfilen själv och ställ den till 2D ljud. Detta kommer att se till att musiken kan höras lika bra, varhelst den Ljudkälla är placerad. Slutligen gör en prefab ur den så att vi kan använda den senare.

Om allt har ställts in korrekt, lineVisualizer ska gå upp och ner. Framgång! Ljuddata läses ut och appliceras på ett roligt och intressant sätt.

Nu ska vi göra det snyggare.

Skapa ett tomt objekt och lägg till en spårleverantör till det och kedja det till lineVisualizer. Dessa spårinställningar kommer att skapa en bra effekt:

Kedja på LineVisualizer till kameran så att den rör sig när kameran rör sig. Inställningen ska se ut så här:

Skapa sedan en liten JavaScript-fil som heter rotation.js, och lägg till följande kod till den:

#pragma sträng varhastighet: float = 15.0; funktion Uppdatering () transform.Rotate (0, hastighet * Time.deltaTime, 0); 

Sätt rotationsskriptet på kameran så att det roterar runt sig själv.

Testa! Sfären ska studsa upp och ner och dra en linje bakom den.

För att göra det snyggare, vrid kuben osynlig genom att avmarkera sin maskinkomponent och placera den lite lägre så att den inte hoppa ut ur skärmen. Ställ också in bakgrundsfärgen på kameran till svart, lägg till ett riktigt ljus i scenen och ge spåret en fin färg och material.

Du borde ha en enkel linjevisualiserare, som kommer att hoppa och ner med musiken och dra en passande linje runt. Prova det i den här byggnaden:

2. Bar Visualizer

Bar visualizers är lite svårare. Vi lägger flera "barer" bredvid varandra, som kommer att hoppa till musiken, var och en på egen väg. Att få en "sann" bar visualizer gjort är väldigt komplicerad än den här ganska enkla introduktionen kan täcka, så vi måste skapa en falsk (vilket kommer att se bra ut i alla fall).

I projektfilerna hittar du en 3D-fil med en speciell kub. Det är inte strikt nödvändigt, så du kan hoppa över det om du vill.

Skapa en ny kub och byt ut det vanliga kubenätet för ovannämnda visualizerCube maska. Den nya har sin mittpunkt i en kant. När vi förstärker kuben under körtiden kommer den då bara att röra sig i en riktning.
Skapa ett nytt skript som heter barVisualizer. Lägg till följande kod:

#pragma strikt offentlig var detalj: int = 500; public var minValue: float = 1.0; allmän varamplitud: float = 0,1; privat var startSkala: Vector3; funktion Start () startScale = transform.localScale;  funktion Uppdatering () var info: float [] = ny float [detalj]; AudioListener.GetOutputData (info, 0); var packagedData: float = 0.0; för (var x: int = 0; x < info.Length; x++)  packagedData += System.Math.Abs(info[x]);  transform.localScale = new Vector3(minValue, (packagedData * amplitude) + startScale.y, minValue); 

Det liknar lineVisualizer script, men kommandona som justerar positionen har ändrats. De justerar nu kubens vertikala höjd.
Skapa en kub, ring den BarVisualizer, ge den en fin färg och sätt på det manus du just skapat på det. Skapa sedan flera kopior av det och placera dem bredvid varandra framför kameran. Det ska se ut så här:

Om du prövar det kommer du att märka att alla kuber rör sig på samma sätt. För att göra varje kub växa och krympa som barer, anpassa koden så här:

#pragma strikt offentlig var detalj: int = 500; public var minValue: float = 1.0; allmän varamplitud: float = 0,1; privat var randomAmplitude: float = 1.0; privat var startSkala: Vector3; funktion Start () startScale = transform.localScale; randomAmplitude = Random.Range (0,5, 1,5);  funktion Uppdatering () var info: float [] = ny float [detalj]; AudioListener.GetOutputData (info, 0); var packagedData: float = 0.0; för (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); 

Detta ger varje bar sin egen "styrka", med vilken den rör sig. Du kan se effekten i den här byggnaden:

3. Visualisering med 3D-skala

Den här är lite annorlunda. I stället för att justera höjd av ett objekt, visar vi visualiseringen genom att skala ett helt objekt upp och ner. Detta kan användas för bakgrundselement i musikbaserade spel, eller för att få partiklar och andra effekter att flytta till musiken.
Koden är ganska mycket densamma som barVisualizer, med skalningskommandona förbättras för att även skala i tre dimensioner:

#pragma strikt offentlig var detalj: int = 500; public var minValue: float = 1.0; allmän varamplitud: float = 0,1; privat var randomAmplitude: float = 1.0; privat var startSkala: Vector3; funktion Start () startScale = transform.localScale; randomAmplitude = Random.Range (1,0, 3,0);  funktion Uppdatering () var info: float [] = ny float [detalj]; AudioListener.GetOutputData (info, 0); var packagedData: float = 0.0; för (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); 

Lägg det på en sfär (eller något annat objekt du väljer), och skapa flera kopior för en bra effekt. Prova det i den här byggnaden:

Slutsats

I den här handledningen lärde du dig att skapa en enkel, fristående ljudvisare inom Unity, som kan tillämpas på många olika sätt. Du kan använda dessa tekniker för att designa psykedeliska ljusföreställningar som rör sig i tid till musik eller som källdata som utgör grunden för ett helt spel, som nivågenerering i Audiosurf, där de hinder du behöver för att undvika visas i tid till slå. Gå vild!