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.
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.
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:
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.
En stivbody er det mest kritiske elementet i en fysikkmotor. Ethvert GameObject det er knyttet til, er inkludert i simuleringen.
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.
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å.
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.
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.
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:
Å 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!
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));
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.
Nå må vi lage skriptet som vil ødelegge og objekter som går utenfor grensen.
offentlig klasse Grense: MonoBehaviour void OnTriggerExit (Collider andre) Destroy (other.gameObject);
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.
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");
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.
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.
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.
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