Arbeider med Unity3D Fysikk

Denne opplæringen vil lære deg hvordan du bygger et spill med Unity3D! Underveis lærer du om viktigheten av å bruke en fysikkmotor, og hvordan gjør du det vil spare mange timer med manuell animasjon. Les videre!

Hvilken moderne spillmotor vil være komplett uten en fysikkmotor? Hver nåværende spillmotor, enten 3D eller 2D, har et fysikkbibliotek av noe slag, og Unity er intet unntak. Realtime fysikk er ideell for å simulere komplekse samspill mellom objekter i spillet ditt. En fysikkmotor kan spare mye av manuell koding og animasjon for å oppnå realistisk bevegelse, gjør det mulig å utføre treffdeteksjon en bris, og kan raskt introdusere en rekke nye spillmekanikk til spillene dine.

I denne opplæringen bruker vi fysikkmotoren i Unity til å bygge et 3D-knockdown-spill som ligner på BoomBlox og Angry Birds. Vi lærer å gi objekter forskjellige fysiske egenskaper, gjøre dem i stand til å kollidere, og til og med la dem bli ødelagt hvis kollisjonene er sterke nok.


Hva er en fysikkmotor?

En fysikkmotor fungerer ved å simulere hvordan objekter reagerer med hverandre når krefter blir påført dem. Disse kreftene kan være konstant, som tyngdekraft eller momentum i et kjøretøy, mens andre er korte og kraftige, som eksplosjoner. En fysikk simulering kalles noen ganger for en "sandkasse" fordi bare objekter i simuleringen påvirkes. Faktisk må ikke alle objekter i spillet være en del av simuleringen. Dette er viktig siden spillerbevegelser ofte må være urealistiske mens de reagerer realistisk på kollisjoner.


Prosjektoppsett

  • Klikk på Fil> Nytt prosjekt
  • Bla gjennom til en passende mappe og navnet på prosjektet CannonBowl
  • Klikk på Opprett
  • Klikk GameObject> Opprett annet> Retningslys
  • Klikk på Arkiv> Lagre scene
  • Gi navnet på scenen Hoved
  • Klikk på Lagre

colliders

Colliders er hva fysikk motorer bruker til å utføre hitdeteksjon. I motsetning til maskeobjekter, vet de når de har kommet i kontakt med hverandre. De er enkle former som bokser, kuler eller kapsler som er tildelt GameObjects og følger dem rundt. Du kan tenke på dem som noe av et "kraftfelt".

Praktisk, når et GameObject er opprettet, tildeles det automatisk en passende collider. En kube får en BoxCollider, en sfære får en SphereCollider, en Cylinder får en CapsuleCollider, og så videre.

Vi vil til slutt trenge noen blokker for å slå ned:

  • Klikk GameObject> Opprett annet> Cube
  • Gi nytt navn til kuben til Tre blokk
  • Still blokkens posisjon til 0, 0, 0. Dette vil sentrere Blokken i verden
  • Last ned Wood.jpg
  • Dra Wood.jpg inn i prosjektpanelet for å gjøre det til en tekstur
  • Dra Wood-tekstur på blokken i scenevisningen, dette vil automatisk lage et tre-materiale for oss og bruke det til blokken
  • Dra blokken fra hierarkipanelet til prosjektpanelet for å gjøre det til en prefab

Hvis vi trykker på Play, vil blokken ikke gjøre noe. Selv om den har en collider, mangler den en stivbody, så den påvirkes ikke av noen fysiske krefter.


Rigidbodies

En stivbody er det mest kritiske elementet i en fysikkmotor. Ethvert GameObject det er knyttet til, er inkludert i simuleringen.

  • Velg Block prefab i Prosjektpanelet
  • Klikk på Komponent> Fysikk> Rigidbody

Som standard påvirkes en stivbody av tyngdekraften og luftmotstanden, også kjent som dra. Hvis vi trykker på Play, vil blokken begynne å falle, akselerere og til slutt treffe terminalhastighet når tyngdekraften og trenden utjevner.


Bygg en struktur

Vi må lage noen flere elementer for å kunne bygge et riktig nivå. Først legger vi til noe bakken slik at blokken har noe å lande på.

  • Klikk GameObject> Opprett annet> Plan
  • Gi nytt navn til flyet til Bakke
  • Still jordens posisjon til 0, 0, 0
  • Last ned Grass.jpg
  • Dra Grass.jpg inn i prosjektpanelet for å gjøre det til en tekstur
  • Dra Grass tekstur på bakken i scenevisningen

The Ground vil automatisk bli gitt en MeshCollider som forhindrer at rigidbodies passerer gjennom den. Trykk på Spill og blokken skal falle og slå seg opp på bakken.

Nå trenger vi en struktur for å slå ned. Velg Blokken og trykk Ctrl + D i Windows, eller Cmd + D i OSX, for å kopiere blokken et par ganger. Bruk skalaen og flytt verktøyene til å strekke og plassere blokkene i omtrent samme konfigurasjon som bildet nedenfor.

MERK: Det er en god ide å bruke presise tall for transformasjonene dine. Blokker skal hvile mot hverandre, men ikke overlappe. Overlapping vil føre til at fysikkmotoren slipper ut og gjør uforutsigbare ting.


Kamerakontroller

Nå som vi har opprettet vår vakre struktur, la oss skrive et skript som gjør at vi kan flytte kameraet slik at vi kan beundre skapelsen vår fra alle vinkler.

  • Klikk på Assets> Create> C # Script
  • Gi nytt navn til skriptet til Kanon (fordi kameraet til slutt skal gjøre skytingen til slutt)
  • Dra skriptet til hovedkameraet
  • Dobbeltklikk på skriptet for å redigere det

Følgende skript vil føre til at kameraet bane midt i verden, samt vippe opp og ned:

 offentlig klasse Cannon: MonoBehaviour void LateUpdate () float x = Input.GetAxis ("Mouse X") * 2; float y = -Input.GetAxis ("Mouse Y"); // vertikal vippeflyt yClamped = transform.eulerAngles.x + y; transform.rotation = Quaternion.Euler (yClamped, transformer.eulerAngles.y, transformer.eulerAngles.z); // horisontal bane transform.RotateAround (ny Vector3 (0, 3, 0), Vector3.up, x); 

Som en endelig berøring, la oss gjøre det lettere å sikte ved å legge et krysshår til kameraet vårt:

  • Klikk GameObjects> Create> Plane
  • Gi nytt navn til flyet til Crosshair
  • Sett Korshårens posisjon til 0, 0, 0
  • Last ned Crosshair.png
  • Dra Crosshair.png til prosjektpanelet
  • Dra Korshårteksturen på Crosshair-planet i scenepanelet
  • I inspektøren, høyreklikk MeshCollider-komponenten og fjern den slik at den ikke vil påvirke andre fysikkobjekter i scenen

Skyting Cannonballs

Å være i stand til å se på strukturen vår er ok, men dette skal være om fysikk! Vi trenger en måte å slå den ned for å se fysikken i aksjon. Det vi trenger er noe å skyte!

  • Klikk GameObject> Opprett annet> Sphere
  • Gi nytt navn til kule til Cannon
  • Sett Cannonball posisjon til 0, 0, 0
  • Med Cannonball valgt, klikk på Komponenter> Fysikk> Rigidbody
  • Dra Cannonball fra hierarkipanelet til prosjektpanelet for å gjøre det til en prefab

Siden vi skal skyte kanonkugler direkte fra kameraet, kan vi redigere vårt eksisterende kanonskript. Først legger vi til en offentlig attributt øverst i klassen for vår prosjektil prefab.

 offentlig klasse Cannon: MonoBehaviour offentlig GameObject projectilePrefab;

Vi legger til en FixedUpdate-metode for å lytte til "Fire1" -knappen som skal trykkes, og deretter ordne en Cannonball prefab, plasser den på kameraet, og legg deretter til en kraft for å flytte den fremover.

 void FixedUpdate () if (Input.GetButtonDown ("Fire1")) GameObject projectile = Instantiate (projectilePrefab, transform.position, transform.rotation) som GameObject; projectile.rigidbody.AddRelativeForce (ny Vector3 (0, 0, 2000)); 

grenser

Du har kanskje lagt merke til at hvis en kanonkule blir sparket langt nok, kan den falle utenfor kanten av vårt bakkeplan. Denne kanonkulen vil fortsette å eksistere så lenge spillet fortsetter å løpe, og dets fysikk vil fortsette å bli beregnet, noe som til slutt senker tingene ned. Vi må skape en grense rundt nivået og ødelegge alle spillobjekter som forlater denne grensen.

  • Klikk GameObject> Create Empty
  • Gi nytt navn til Grense
  • Sett grenseens x-, y- og z-posisjon til 0
  • Med Grense valgt, klikker du på Komponenter> Fysikk> Box Collider
  • I insepektoren må du kontrollere at Is Trigger er sjekket
  • Sett Box Collider senter til 0, 25, 0
  • Still boksen Collider-størrelsen til 50, 50, 50

Nå må vi lage skriptet som vil ødelegge og objekter som går utenfor grensen.

  • Klikk på Assets> Create> C # Script
  • Gi nytt navn til skriptet til Grense
  • Dra skriptet til grenseobjektet i hierarkipanelet
  • Rediger skriptet og legg til følgende kode
 offentlig klasse Grense: MonoBehaviour void OnTriggerExit (Collider andre) Destroy (other.gameObject); 

Forårsaker ødeleggelse

Vi trenger en måte å vinne vårt nivå på. For å gjøre dette må blokkene våre bli ødelagt dersom de tar tilstrekkelig skade.

  • Klikk på Assets> Create> C # Script
  • Gi nytt navn til skriptet til Blokkere
  • Dra skriptet til Block prefab i Prosjektpanelet
  • Dobbeltklikk på skriptet i Prosjektpanelet for å redigere det

I skriptet gir vi prefaben en helsekompleks som kan justeres i redaktøren. Dette tillater forskjellige blokker å ha forskjellige mengder helse.

 offentlig klasse Blokk: MonoBehaviour public float health = 20;

Når en kollisjon oppdages, måles størrelsen på effekten. Jo større størrelsen, jo mer skade som ble gjort. Alt over en lyskran trekkes fra blokkens helse. Hvis blokkens helse faller under 0, ødelegger blokken seg selv. Det sjekker deretter for å se hvor mange andre blokker som er igjen i scenen. Hvis det bare er en blokk igjen, er spillet over, og det lastes opp på scenen for å spille igjen.

 ugyldig OnCollisionEnter (Kollisjonskollisjon) // Påfør kollisionsskade hvis (collision.relativeVelocity.magnitude> 0.5) health - = collision.relativeVelocity.magnitude;  // ødelegge hvis helsen er for lav hvis (helse <= 0)  Destroy(gameObject); // restart the scene if this was the last box GameObject[] boxes = GameObject.FindGameObjectsWithTag("Box"); if (boxes.Length <= 1)  Application.LoadLevel("Main");   

Betongblokker

Så langt har vi bare brukt treblokker. De er lette og relativt svake, noe som gjør strukturen for lett å ødelegge og ganske forutsigbar i hvordan den vil bevege seg. Vi må skape en annen type blokk, en som er både tyngre og sterkere.

  • I Prosjektpanelet dupliserer du WoodBlock prefab (Ctrl + D i Windows, Cmd + D i OSX)
  • Gi nytt navn til duplikatet til Betongblokk
  • Last ned Concrete.jpg
  • Dra Concrete.jpg inn i Prosjektpanelet
  • Dra betongkonstruksjonen til ConcreteBlock prefab i prosjektpanelet
  • Med prefabeten valgt, bruk inspektøren til å oppdatere helsen til 50
  • I Rigidbody-komponenten øker du masse til 5 for å gjøre den tyngre
  • Dra ConcreteBlock prefab i scenen

Prøv å erstatte noen av korsdelene med betongblokker. Betongblokkene skal være vanskeligere å slå over, falle med stor innvirkning, og være vanskeligere å ødelegge med kanonkugler.


Ferdig spill

Nedenfor er det ferdige spillet som kjører i Unity Web Player. Bruk musen til å bane kameraet og trykk Ctrl eller Venstre museknapp for å skyte kanonkugler.




Konklusjon

Denne opplæringen skraper bare overflaten av det som Unity Physics Engine er i stand til. Konstant krefter, eksplosive krefter, fysiske materialer, hengsler, fjærer, ragdolls, etc. Selv om dette kan virke skremmende, passer elementene i Unity Physics-motoren sammen, noe som gjør det enkelt å forstå og enkelt å implementere fysikk i spillene dine.

For å lære mer om egenskapene til Unity Physics Engine, besøk:

http://docs.unity3d.com/Documentation/Manual/Physics.html