Arbetar med Unity3D Physics

Denna handledning kommer att lära dig hur man bygger ett knock-down-spel med Unity3D! Längs vägen kommer du att lära dig om vikten av att använda en fysikmotor och hur man gör det kommer att spara otaliga timmar med manuell animering. Läs vidare!

Vilken modern spelmotor skulle vara komplett utan en fysikmotor? Varje nuvarande spelmotor, antingen 3D eller 2D, har ett fysikbibliotek av något slag, och Unity är inget undantag. Realtime fysik är idealisk för att simulera komplexa interaktioner mellan objekt i ditt spel. En fysikmotor kan spara mycket av manuell kodning och animering för att uppnå en realistisk rörelse, kan göra att detekterar en bris i en träff och kan snabbt introducera en mängd nya spelmekanismer till dina spel.

I denna handledning använder vi fysikmotorn i Unity för att bygga ett 3D-knockdown-spel som liknar BoomBlox och Angry Birds. Vi lär oss att ge objekt olika fysikaliska egenskaper, göra dem kapabla att kollidera och till och med tillåta dem att förstöras om kollisionerna är tillräckligt starka.


Vad är en fysikmotor?

En fysikmotor fungerar genom att simulera hur objekten reagerar med varandra när krafter appliceras på dem. Dessa krafter kan vara konstanta, som gravitation eller momentum i ett fordon, medan andra är korta och kraftfulla, som explosioner. En fysiksimulering kallas ibland en "sandbox" eftersom endast objekt inom simuleringen påverkas. Faktum är att inte alla föremål i ditt spel behöver vara en del av simuleringen. Detta är viktigt eftersom spelarrörelser ofta behöver vara orealistiska samtidigt som de reagerar realistiskt på kollisioner.


Projektinställningar

  • Klicka på Arkiv> Nytt projekt
  • Bläddra till en lämplig mapp och namnge projektet CannonBowl
  • Klicka på Skapa
  • Klicka på GameObject> Skapa annat> Riktigt ljus
  • Klicka på Arkiv> Spara scen
  • Namn på scenen Huvudsaklig
  • Klicka på Spara

colliders

Colliders är vilka fysikmotorer som använder för att utföra träffdetektering. Till skillnad från maskobjekt, vet de när de kommit i kontakt med varandra. De är enkla former som lådor, sfärer eller kapslar som tilldelas dina GameObjects och följer dem runt. Du kan tänka på dem som något av ett "kraftfält".

Bekvämt, när ett GameObject skapas, tilldelas det automatiskt en lämplig collider. En kub får en BoxCollider, en sfär får en SphereCollider, en cylinder får en CapsuleCollider och så vidare.

Vi behöver så småningom några block att slå ner:

  • Klicka på GameObject> Skapa annat> Cube
  • Byt namn på kuben till Trä block
  • Ställ in blockets position till 0, 0, 0. Detta kommer att centrera Block i världen
  • Hämta Wood.jpg
  • Dra Wood.jpg i din projektpanel för att göra det till en textur
  • Dra trätexturen på blocken i scenvyn, så skapas automatiskt ett trämaterial för oss och appliceras på blocket
  • Dra blocket från hierarkipanelen till projektpanelen för att göra det till ett prefab

Om vi ​​trycker på Spela, kommer blocket inte göra någonting. Medan den har en collider saknar den en stel kropp, så den påverkas inte av några fysiska krafter.


Rigidbodies

En stel kropp är det mest kritiska elementet i en fysikmotor. Varje GameObject det är anslutet till ingår i simuleringen.

  • Välj Block prefab på projektpanelen
  • Klicka på Komponent> Fysik> Rigidbody

Som standard påverkas en stel kropp av tyngdkraften och luftmotståndet, även känt som drag. Om vi ​​trycker på Play, kommer blocket att falla, accelerera och så småningom träffa terminalhastigheten när tyngdkraften och draget utjämnar.


Bygg en struktur

Vi måste skapa några fler element för att bygga en riktig nivå. Låt oss först lägga till en mark så att blocket har något att landa på.

  • Klicka på GameObject> Skapa annat> Plan
  • Byt namn på planen till Jord
  • Ställ markens läge till 0, 0, 0
  • Hämta Grass.jpg
  • Dra Grass.jpg i din projektpanel för att göra det till en textur
  • Dra gräset på marken i scenvyn

Marken kommer automatiskt att ges en MeshCollider som förhindrar att styva ämnen passerar genom den. Tryck på Play och blocken ska falla och slå sig upp på marken.

Nu behöver vi en struktur för att slå ner. Välj Block och tryck på Ctrl + D i Windows, eller Cmd + D i OSX, för att duplicera blocket några gånger. Använd skalan och flytta verktygen för att sträcka och placera blocken i ungefär samma konfiguration som bilden nedan.

NOTERA: Det är en bra idé att använda exakta siffror för dina omvandlingar. Block bör ligga mot varandra, men inte överlappa varandra. Överlappningar kommer att få fysikmotorn att freak out och göra oförutsägbara saker.


Kamerakontroller

Nu när vi har skapat vår vackra struktur, låt oss skriva ett manus som tillåter oss att flytta kameran så att vi kan beundra vår skapelse från alla vinklar.

  • Klicka på Tillgångar> Skapa> C # Script
  • Byt namn på skriptet till Kanon (eftersom så småningom kommer vår kamera att göra skytte)
  • Dra skriptet till huvudkameran
  • Dubbelklicka på skriptet för att redigera det

Följande skript kommer att leda till att kameran kretsar runt i mitten av världen, liksom lutar upp och ner:

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

Som en sista touch, låt oss göra det enklare att sikta genom att lägga en crosshair till vår kamera:

  • Klicka på GameObjects> Skapa> Plan
  • Byt namn på planen till hårkors
  • Ställ korshårens läge till 0, 0, 0
  • Hämta Crosshair.png
  • Dra Crosshair.png till projektpanelen
  • Dra Crosshair-konsistensen på Crosshair-planet i scenpanelen
  • I inspektören högerklickar du på MeshCollider-komponenten och tar bort den så att den inte påverkar andra fysikobjekt i scenen

Skytte Cannonballs

Att kunna titta på vår struktur är okej, men det här är tänkt att handla om fysik! Vi behöver ett sätt att slå ner det för att se fysiken i aktion. Vad vi behöver är något att skjuta!

  • Klicka på GameObject> Skapa annat> Sphere
  • Byt namn på sfären till Cannonball
  • Ställ kanonbollens position till 0, 0, 0
  • Med Cannonballen vald, klicka på Komponenter> Fysik> Rigidbody
  • Dra Cannonball från hierarkipanelen till projektpanelen för att göra den till en prefab

Eftersom vi kommer att skjuta kanonkulor direkt från kameran kan vi redigera vårt befintliga kanonskript. Först lägger vi till ett offentligt attribut i toppen av klassen för vår prefabrikerade projektil.

 offentlig klass Cannon: MonoBehaviour public GameObject projectilePrefab;

Vi lägger till en FixedUpdate-metod för att lyssna på "Fire1" -knappen som ska tryckas och sedan inställa en Cannonball prefab, placera den i kameran och lägg sedan en kraft till den för att flytta den framåt.

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

gränser

Du kanske har märkt att om en kanonkula är avfyrade tillräckligt mycket, kan den falla utanför kanten av vårt markplan. Denna kanonkula kommer att fortsätta att existera så länge spelet fortsätter att springa och dess fysik fortsätter att beräknas, så småningom sakta ner det. Vi måste skapa en gräns runt nivån och förstöra alla spelobjekt som lämnar denna gräns.

  • Klicka på GameObject> Skapa tomt
  • Byt namn på den till Boundary
  • Ställ gränsen s x, y och z position till 0
  • Med den markerade gränsen klickar du på Komponenter> Fysik> Box Collider
  • I insepektorn, se till att Is Trigger är kontrollerad
  • Ställ in Box Collider Center till 0, 25, 0
  • Ställ in Box Collider Size till 50, 50, 50

Nu måste vi skapa det manus som kommer att förstöra och föremål som strider utanför gränsen.

  • Klicka på Tillgångar> Skapa> C # Script
  • Byt namn på skriptet till Boundary
  • Dra skriptet till gränsobjektet i hierarkipanelen
  • Redigera skriptet och lägg till följande kod
 allmän klass Gräns: MonoBehaviour void OnTriggerExit (Collider andra) Destroy (other.gameObject); 

Orsakar förstöring

Vi behöver ett sätt att vinna vår nivå. För att göra detta måste våra block förstöras om de tar tillräckligt med skador från påverkan.

  • Klicka på Tillgångar> Skapa> C # Script
  • Byt namn på skriptet till Blockera
  • Dra skriptet till Block prefab i projektpanelen
  • Dubbelklicka på skriptet på projektpanelen för att redigera det

I manuset ger vi prefaben en folkhälsa som kan anpassas i redaktören. Detta gör att olika block kan ha olika mängder hälsa.

 offentlig klass Block: MonoBehaviour public float health = 20;

När en kollision detekteras mäts effektens storlek. Ju större omfattning desto mer skada som gjordes. Allt ovanför en ljuskran subtraheras från blockets hälsa. Om blockets hälsa faller under 0, förstör blocket sig. Det kontrollerar sedan för att se hur många andra block som finns kvar i scenen. Om det bara finns ett block kvar, är spelet över och det laddar om scenen för att spela igen.

 void OnCollisionEnter (Kollisionskollision) // tillämpa kollisionskador om (collision.relativeVelocity.magnitude> 0.5) health - = collision.relativeVelocity.magnitude;  // förstör om hälsan är för låg om (hälsa <= 0)  Destroy(gameObject); // restart the scene if this was the last box GameObject[] boxes = GameObject.FindGameObjectsWithTag("Box"); if (boxes.Length <= 1)  Application.LoadLevel("Main");   

Betongblock

Hittills har vi bara använt träblock. De är lätta och relativt svaga, vilket gör strukturen för lätt att förstöra och ganska förutsägbar i hur den kommer att röra sig. Vi måste skapa en annan typ av block, en som är både tyngre och starkare.

  • I projektpanelen dupliceras WoodBlock prefab (Ctrl + D i Windows, Cmd + D i OSX)
  • Byt namn på duplicatet till Betongblock
  • Hämta Concrete.jpg
  • Dra Concrete.jpg till projektpanelen
  • Dra betongkonstruktionen till ConcreteBlock prefab i projektpanelen
  • Med prefabset valda, använd inspektören för att uppdatera hälsan till 50
  • I Rigidbody-komponenten, öka massan till 5 för att göra den tyngre
  • Dra ConcreteBlock prefab i scenen

Prova att byta ut några av korsdelarna med betongblock. Betongblocken ska vara svårare att slå över, falla med stor inverkan och vara svårare att förstöra med kanonkulor.


Färdigt spel

Nedan är det färdiga spelet som körs i Unity Web Player. Använd musen för att bana om kameran och tryck Ctrl eller Vänster musknapp för att skjuta kanonkulor.




Slutsats

Denna handledning skrapar bara ytan på vad Unity Physics Engine kan. Konstantiska krafter, explosiva krafter, fysiska material, gångjärn, fjädrar, ragdollar osv. Även om det här kan tyckas skrämmande passar elementen i Unity Physics-motorn alla, vilket gör det lätt att förstå och enkelt implementera fysik i dina spel.

För att lära dig mer om egenskaperna hos Unity Physics-motorn, besök:

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