I denna handledning kommer jag att visa dig hur man skapar en enkel krossande effekt för ditt Unity-spel. I stället för att bara "radera" en kasse (eller något annat objekt) när det slås eller förstörs, kan vi få det att splittras i mindre bitar.
För den här handledningen behöver du den senaste versionen av Unity, och en del grundläggande erfarenheter med den. För den mer avancerade effekten senare i handledningen krävs också ett 3D-modelleringsverktyg. Om du inte har någon tillgänglig eller inte vill modellera objekten själv, har jag inkluderat dem i källnedladdningarna. (Enhetsfilerna är också tillgängliga där.)
I den grundläggande versionen av denna effekt kommer en kub att förstöras, vilket ger flera fragment i sin kölvattning som kommer att falla realistiskt till marken:
Senare byter vi kuben till en mer komplicerad fat modell:
Du kan prova själv här:
Klicka för att prova demo. (Cube demo finns också här.)Skapa ett nytt Unity-projekt och öppna en ny scen. Skapa ett plan som kommer att fungera som vår mark och en kub som kommer att bli det förstörbara objektet. Placera också ett rikt ljus för att göra saker mer synliga. Skapa två nya material och tilldela dem till golvet och kuben så att vi kan skilja dem och flytta kameran så att allt kan ses:
Det finns många sätt att "förstöra" kuben. För tillfället tar vi det enklaste tillvägagångssättet möjligt.
Skapa en ny JavaScript-fil och namnge den destructionController.js
. I detta lägger vi all funktionalitet att ta bort kuben och skapa fragmenten. Lägg till följande rader för det:
funktion Uppdatering () om (Input.GetKey (Keycode.space)) Destroy (gameObject);
Lägg nu skriptet till kuben genom att dra det på det. Starta spelet och kör en testkörning. Om du trycker på mellanslag ska kuben raderas.
Efter att ha tagits bort kommer den inte längre att visas i hierarkin, som du kan se på skärmdumpen.
Skapa nu åtta mindre kuber; Dessa kommer att vara "fragment" av den aktuella kuben. Ge dem samma material som kuben. (Oroa dig inte om utseendet ännu, vi får dem att se fantastiska senare.) De borde se så här ut:
Stack alla 8 kuber för att bilda en större, enkel kub, utan att de korsar:
Ge varje kub en styv kropp, sätt deras massa till 22
, Aktivera använd gravitationen, och inaktivera är kinematisk. Detta gör att fragmenten faller ner och använder fysik. Om du vill kan du justera dessa värden senare för att producera resultat som passar bäst för ditt spel.
Nu gruppera kuberna under en ny tomt gameObject
och kalla det remainsCube
. När den ursprungliga kuben förstörs kommer den att ersättas med det nya objektet som är tillverkat av mindre kuber.
Dra remainsCube
objekt in i projektmappen för att göra en prefab av den. När det är säkert i prefab-mappen, radera det ur huvudscenen och det är klart att använda.
Lägg till de markerade linjerna till destructionController
manus:
var kvar: GameObject; funktion Uppdatering () om (Input.GetKey (Keycode.space)) Instantiate (remains, transform.position, transform.rotation); Förstöra (gameObject);
Detta skapar en kopia av resterna i kubens exakta position. Efteråt kommer kuben att avlägsnas, vilket ger illusionen att den nya är faktiskt den gamla, men "bruten".
För att faktiskt få detta till jobbet måste du manuellt fördela resterna till kuben. Klicka på den och i Inspektör Du borde se en flik som innehåller Destruction Controller manus. Det borde finnas en plats som heter Resterna, som för närvarande borde vara tomt. Dra resterna
prefab från projektmappen i denna slot. De Destruction Controller script i Inspektör ska nu se ut så här:
Gör en testkörning! Om allt är korrekt inrättat, bör resterna ersätta kuben när du trycker på mellanslag. Om du har tur, bör de då rulla till marken.
Så, den här grundläggande kuben:
... skulle bli något liknande det här:
Det är tyvärr inte garanterat att fragmenten kommer att tumla på ett bra sätt. Lyckligtvis finns det sätt att lösa det.
Skapa en ny tom gameObject
och ge den en sfärkollider, men ingen styv kropp. Dra resterna in i scenen så att du kan redigera dem. Lägg sfärkolliderobjektet mot resterna och placera det så att det skärs med några av kuberna:
Nu kommer fragmenten att kollidera direkt med sfären, vilket ger en tumbleffekt:
Beroende på vilket spel du bygger, har vi inte råd med för många "splinter" på en gång i en scen. Den enkla lösningen är att ta bort dem efter några sekunder. För att göra det, skapa en ny JavaScript-fil och namnge den selfDestruct.js
. Lägg följande kod i den:
funktion Start () yield WaitForSeconds (4.0); Förstöra (gameObject);
När objektet skapas väntar det i fyra sekunder och raderas sedan. Lägg till den här koden i resterna
objekt. Om du förstör kuben och skapar fragmenten kommer resterna att förstöra sig efter fyra sekunder.
Och det är allt! Nu har du grunderna att effektivt få ett objekt att "splittras" i flera mindre bitar när det förstörs. Du kan använda denna effekt som-men, men låt oss ta det lite längre och se hur du använder det med ett mer komplext objekt.
Nu när vi har grundsystemet på plats, kan vi göra det vackert genom att ersätta kuberna med faktiska objekt.
Om du är skicklig i ett 3D-modelleringsverktyg kan du skapa egna objekt. Om inte, eller om du inte har någon tillgänglig, kan du få den färdiga 3D-filen från källnedladdningen.
Kopiera filen till din aktivmapp, och 3D-modellerna importeras automatiskt för din användning. Innan du använder dem klickar du på filen i Asset Explorer och se till att källfilerna importeras korrekt med en skalfaktor av 1
(inte 0,1
eller 0,001
; det komplicerar bara saker).
Om du tittar på objekten kan du se ett fält som heter meshfilter i Inspektör. Om du klickar på det får du en lista över alla tillgängliga maskor i projektet. Byt nu ut alla kuber i kubburken med fatdelar.
Den intakta kuben får tunna
maska; de mindre kubfragmenten behöver maskorna barrel_fragment_01
till barrel_fragment_08
. Efter de tilldelas, ställa in sina lokala positioner till (0, 0, 0)
. (Deras svängpunkter är inställda så att de lätt kan nollställas på det sättet.)
I stället för en lådkollider skulle en maskekollider vara mycket bekvämare. Ta bort alla boxkolliderna på fragmenten och byt ut dem med nätkolliderare. Kontrollera varje maskinkollider och se till att var och en har rätt maskintillförsel (det vill säga, barrel_fragment_01
behöver barrel_fragment_01
mesh, och så vidare).
När det är klart, sätt alla nätkolliderare till konvex
. (En icke-konvex nätkolliderare kan inte kollidera med andra icke-konvexa meshkollider. Det är en programmerings sak.) Ta även bort kollens kolliderare som vi lagt till resterna, eftersom det kanske inte är nödvändigt.
Allt är korrekt inställt, du borde ha ett fat som kommer att springa ihop åt åtta mindre bitar.
Samma system kan också användas för att lägga till andra effekter för förstörelsen. Har du en explosion? Lägg det till resterna! Lägg till ljud, för en tillfredsställande spricka. Sätt in en partikel effekt där, skapa en liten puff av rök.
I denna handledning har jag visat dig det enklaste sättet att göra ett föremål splittras i mindre fragment. Nu vet du hur man förstör ett objekt och tar bort det från spelet. hur man byter objektet med mindre fragment direkt innan det förstörs och hur man får fragmenten självförstörande efteråt.
Detta system kan nu modifieras och anpassas för att passa många specifika ändamål. Du kan ha en kista eller en tunn splinter och splittras när du skjuter. Du kan skapa en explosion efter att ett plan träffats. Eller så kan du få en båt i två delar. Njut av!