Slik lager du et objekt i mindre fragmenter i enhet

I denne opplæringen vil jeg vise deg hvordan du lager en enkel knusende effekt for ditt Unity-spill. I stedet for å bare "slette" en kasse (eller noe annet objekt) når det blir rammet eller ødelagt, kan vi få det til å splitte seg i mindre stykker.


Krav

For denne opplæringen trenger du den nyeste versjonen av Unity, og noen grunnleggende erfaring med det. For den mer avanserte effekten senere i opplæringen, vil et 3D-modelleringsverktøy også være nødvendig. Hvis du ikke har en tilgjengelig eller ikke vil modellere objektene selv, har jeg tatt med dem i kilde nedlastingene. (The Unity-filene selv er også tilgjengelige der.)

I den grunnleggende versjonen av denne effekten vil en kube bli ødelagt, og etterlate flere fragmenter i kølvandet som faller realistisk til bakken:

Senere bytter vi terningen for en mer komplisert fatemodell:

Du kan prøve det ut selv her:

Klikk for å prøve demoen. (Kubedemoen er også tilgjengelig her.)

Grunnleggende oppsett

Lag et nytt Unity-prosjekt og åpne en ny scene. Lag et fly som vil fungere som vår bakke, og en terning, som vil være det ødeleggeobjektet. Legg også et retningslys for å gjøre ting mer synlige. Lag to nye materialer og tilordne dem til gulvet og terningen, slik at vi kan fortelle dem, og flytte kameraet slik at alt kan sees:


Ødelegge kuben

Det er mange måter å "ødelegge" kuben på. For nå, tar vi den enkleste tilnærmingen mulig.

Opprett en ny JavaScript-fil og navn den destructionController.js. I dette legger vi all funksjonalitet til å fjerne kuben og lage fragmentene. Legg til følgende linjer for det:

 funksjon Update () if (Input.GetKey (Keycode.space)) Destroy (gameObject); 

Legg nå skriptet til kuben ved å dra den på den. Start spillet og ta en prøvekjøring. Hvis du trykker på plass, bør kuben slettes.

Etter at den er fjernet, vil den ikke lenger vises i hierarkiet, som du kan se på skjermbildet.


Opprette fragmentene

Lag nå åtte mindre kuber; Disse vil være "fragmenter" av den nåværende kuben. Gi dem det samme materialet som terningen. (Ikke bekymre deg om utseendet ennå, vi får dem til å se kjempebra senere.) De burde se slik ut:

Stable alle 8 terninger for å danne en større, enkelt kube, uten at de skjærer:

Gi hver terning en stiv kropp, sett deres masse til 22, aktivere bruk tyngdekraften, og deaktivere er kinematisk. Dette vil få fragmentene til å falle ned og bruke fysikk. Hvis du vil, kan du justere disse verdiene senere for å produsere resultater som passer bedre for spillet ditt.

Nå grupperer kubene under en ny tom gameObject og ring det remainsCube. Når den originale kuben blir ødelagt, vil den bli erstattet med dette nye objektet laget av mindre kuber.

Dra remainsCube objekt inn i prosjektmappen for å lage en prefab ut av det. Når det er trygt i prefabmappen, slett den ut av hovedspillet, og den er klar til bruk.


Gjør resten igjen

Legg de uthevede linjene til destructionController manus:

 var rester: GameObject; funksjon Oppdatering () hvis (Input.GetKey (Keycode.space)) Instantiate (remains, transform.position, transform.rotation); Ødelegge (gameObject); 

Dette vil skape en kopi av resterne i den nøyaktige plasseringen av terningen. Etterpå blir kuben fjernet, noe som gir illusjonen om at den nye er faktisk den gamle, men "ødelagte".

For å få dette til å fungere, må du manuelt tildele rester til kuben. Klikk på den, og i Inspektør Du bør se en fane som inneholder Destruction Controller manus. Det skal være et spor som heter Rester, som for øyeblikket skal være tomt. Dra rester prefab fra prosjektmappen til dette sporet. De Destruction Controller skript i Inspektør skal nå se slik ut:


Første optimaliseringer

Lag en prøvekjøring! Hvis alt er satt opp riktig, da når du trykker på plass, skal resterne erstatte kuben. Hvis du er heldig, bør de da rive til bakken.

Så, denne grunnleggende terningen:

... skulle bli noe som ligner på dette:


Jeg var ikke heldig

Dessverre er det ikke garantert at fragmentene vil tommel på en fin måte. Heldigvis finnes det måter å løse det på.

Opprett en ny tom gameObject og gi den en kulekollider, men ingen stivbody. Trekk resterne inn i scenen, slik at du kan redigere dem. Legg kulekolliderobjektet til restene, og legg det slik at det krysser med noen av kubene:

Nå vil fragmentene øyeblikkelig kollidere med sfæren, noe som skaper en tommel-effekt:


Fjerning av fragmentene

Avhengig av spillet du bygger, har vi ikke råd til for mange "splinter" på en gang i en scene. Den enkle løsningen er å slette dem etter noen få sekunder. For å gjøre det, opprett en ny JavaScript-fil og gi den navnet selfDestruct.js. Sett inn følgende kode i den:

 funksjon Start () yield WaitForSeconds (4.0); Ødelegge (gameObject); 

Når objektet er opprettet, venter det i fire sekunder, og deretter slettes det. Legg til denne koden til rester gjenstand. Hvis du nå ødelegger kuben og lager fragmentene, vil resterne ødelegge seg etter fire sekunder.

Og det er det! Nå har du det grunnleggende for å effektivt få et objekt "knuse" i flere mindre stykker når det blir ødelagt. Du kan bruke denne effekten som-er, men la oss ta det litt lenger og se hvordan du bruker det med en mer komplisert gjenstand.


Bruke et faktisk objekt i stedet for kuber

Nå som vi har det grunnleggende systemet på plass, kan vi gjøre det mer pent ved å erstatte kubene med faktiske objekter.

Hvis du er dyktig i et 3D-modelleringsverktøy, kan du lage dine egne objekter. Hvis ikke, eller hvis du ikke har en tilgjengelig, kan du få den forberedte 3D-filen fra kildenedlastingen.

Kopier filen til aktivmappen din, og 3D-modellene blir automatisk importert for bruk. Før du bruker dem, klikk filen i Asset Explorer og sørg for at kildefilene importeres riktig på en skalafaktor på 1 (ikke 0.1 eller 0,001; det kompliserer bare ting).

Hvis du ser på objektene, kan du se et felt som heter meshfilter i Inspektør. Hvis du klikker på det, får du en liste over alle tilgjengelige masker i prosjektet. Bytt nå alle kubene i kubens gjenstander med fatdeler.

Den intakte terningen får Tønne mesh; de mindre kubefragmentene trenger maskene barrel_fragment_01 til barrel_fragment_08. Etter at de er tildelt, still inn sine lokale stillinger til (0, 0, 0). (Deres pivot-poeng er satt slik at de lett kan nullstilles på den måten.)

I stedet for en boksekollider ville en maskekollider være mye mer praktisk. Fjern alle kassekolliderne på fragmentene, og erstatt dem med maskekollider. Kontroller hver maskekollider og sørg for at hver har riktig maske påsatt (det vil si, barrel_fragment_01 trenger barrel_fragment_01 mesh, og så videre).

Når det er gjort, sett alle maskekollider til konveks. (En ikke-konveks maskekollider kan ikke kollidere med andre ikke-konvekse maskekollider. Det er en programmerings ting.) Fjern også kulekollidereren vi lagt til resterne, da det kanskje ikke er nødvendig.

Alt er satt opp riktig, du bør ha en tønne som vil sprenge seg i åtte mindre stykker.


Mulige ytterligere detaljer

Det samme systemet kan også brukes til å legge til andre effekter til ødeleggelsen. Har du en eksplosjon? Legg det til restene! Legg til lyder, for en tilfredsstillende sprekk. Sett en partikkel effekt inn der, og skape en liten pust av røyk.


Konklusjon

I denne opplæringen har jeg vist deg den enkleste måten å gjøre et objekt knust i mindre fragmenter. Nå vet du hvordan du skal ødelegge et objekt, fjerne det fra spillet; hvordan bytte objektet med mindre fragmenter rett før ødeleggelsen; og hvordan å få fragmentene selvdestrudere etterpå.

Dette systemet kan nå endres og tilpasses til mange spesifikke formål. Du kan ha en kasse eller en tønneflis og knuse når du skyter. Du kan skape en eksplosjon etter at et fly er truffet. Eller du kan ha en båt sprekk i to deler. Nyt!