Werken met Unity3D Physics

Deze tutorial leert je hoe je een knockdown-game bouwt met Unity3D! Onderweg leer je meer over het belang van het gebruik van een physics-engine en hoe je hierdoor talloze uren aan handmatige animaties bespaart. Lees verder!

Welke moderne game-engine zou compleet zijn zonder een physics-engine? Elke huidige game-engine, of het nu 3D of 2D is, heeft een soort natuurbibliotheek, en Unity is geen uitzondering. Realtime-fysica is ideaal voor het simuleren van complexe interacties tussen objecten in je game. Een physics-engine kan veel van de handmatige codering en animatie besparen om realistische bewegingen te realiseren, kan het uitvoeren van hitdetectie een fluitje van een cent maken en kan snel een groot aantal nieuwe gameplay-mechanismen introduceren in uw games.

In deze zelfstudie gebruiken we de physics-engine in Unity om een ​​3D-knockdown-game te maken die vergelijkbaar is met BoomBlox en Angry Birds. We zullen leren hoe we objecten verschillende fysieke eigenschappen kunnen geven, ze kunnen laten botsen en zelfs toestaan ​​dat ze worden vernietigd als de botsingen sterk genoeg zijn.


Wat is een Physics Engine?

Een physics-engine werkt door te simuleren hoe objecten met elkaar reageren wanneer er krachten op worden toegepast. Deze krachten kunnen constant zijn, zoals de zwaartekracht of het momentum van een voertuig, terwijl andere kort en krachtig zijn, zoals explosies. Een fysica-simulatie wordt soms een "sandbox" genoemd omdat alleen objecten binnen de simulatie worden beïnvloed. Inderdaad, niet elk object in je spel moet deel uitmaken van de simulatie. Dit is belangrijk omdat bewegingen van spelers vaak onrealistisch moeten zijn en toch realistisch reageren op botsingen.


Project Setup

  • Klik op Bestand> Nieuw project
  • Blader naar een geschikte map en noem het project CannonBowl
  • Klik op Maken
  • Klik op GameObject> Create Other> Directional Light
  • Klik op Bestand> Scene opslaan
  • Geef de scène een naam Hoofd
  • Klik op Opslaan

colliders

Colliders zijn wat physics-engines gebruiken om hitdetectie uit te voeren. In tegenstelling tot netobjecten weten ze wanneer ze met elkaar in contact zijn gekomen. Het zijn eenvoudige vormen, zoals dozen, bollen of capsules die zijn toegewezen aan uw GameObjects en volg ze rond. Je kunt ze zien als iets van een "krachtveld".

Handig is dat wanneer een GameObject wordt gemaakt, het automatisch een geschikte collider krijgt toegewezen. Een kubus krijgt een BoxCollider, een bol krijgt een SphereCollider, een cilinder krijgt een CapsuleCollider, enzovoort.

We zullen uiteindelijk enkele blokkades nodig hebben om te verslaan:

  • Klik op GameObject> Maak een ander> Kubus
  • Hernoem de kubus naar Houten blok
  • Stel de positie van het blok in op 0, 0, 0. Hiermee wordt het blok in de wereld gecentreerd
  • Download Wood.jpg
  • Sleep Wood.jpg naar uw Project-paneel om er een textuur van te maken
  • Sleep de houtstructuur naar het blok in de scènemenweergave, dit zal automatisch een houtmateriaal voor ons maken en toepassen op het blok
  • Sleep het blok van het hiërarchisch paneel naar het projectvenster om er een Prefab van te maken

Als we op Afspelen drukken, doet het blok niets. Hoewel het een collider heeft, mist het een rigide lichaam, dus het wordt niet beïnvloed door fysieke krachten.


Rigidbodies

Een rigide lichaam is het meest kritieke element in een fysica-engine. Elk GameObject waaraan het is gekoppeld, is opgenomen in de simulatie.

  • Selecteer de prefab Block in het deelvenster Project
  • Klik op Component> Physics> Rigidbody

Standaard wordt een star lichaam beïnvloed door zwaartekracht en luchtweerstand, ook wel sleep genoemd. Als we op Play drukken, begint het blok te vallen, te versnellen en uiteindelijk de eindsnelheid te raken wanneer de zwaartekracht en de sleep gelijk maken.


Bouw een structuur

We moeten nog een paar elementen maken om een ​​goed niveau te bouwen. Laten we eerst wat grond toevoegen zodat het blok iets heeft om op te landen.

  • Klik op GameObject> Maak een ander> Vliegtuig
  • Hernoem het vliegtuig naar Grond
  • Stel de positie van de grond in op 0, 0, 0
  • Grass.jpg downloaden
  • Sleep Grass.jpg naar uw Project-paneel om er een textuur van te maken
  • Sleep de Grass-textuur naar de grond in de Scene View

De Ground krijgt automatisch een MeshCollider die voorkomt dat rigidbodies er doorheen gaan. Druk op Play en het blok zou moeten vallen en neerkomen op de grond.

Nu hebben we een structuur nodig om te vernietigen. Selecteer het blok en druk op Ctrl + D in Windows of Cmd + D in OSX, om het blok een paar keer te dupliceren. Gebruik de schaal en verplaats hulpmiddelen om de blokken uit te rekken en te positioneren in ongeveer dezelfde configuratie als de onderstaande afbeelding.

NOTITIE: Het is een goed idee om exacte getallen te gebruiken voor uw transformaties. Blokken moeten tegen elkaar aanliggen, maar mogen elkaar niet overlappen. Overlappingen zorgen ervoor dat de physics engine in paniek raakt en onvoorspelbare dingen doen.


Camerabediening

Nu we onze prachtige structuur hebben gemaakt, laten we een script schrijven waarmee we de camera kunnen verplaatsen, zodat we onze creatie vanuit alle hoeken kunnen bewonderen.

  • Klik op Activa> Maken> C # Script
  • Hernoem het script naar Kanon (omdat onze camera uiteindelijk de opnames zal maken)
  • Sleep het script naar de hoofdcamera
  • Dubbelklik op het script om het te bewerken

Het volgende script zorgt ervoor dat de camera het centrum van de wereld in een baan om de aarde draait, maar ook dat de camera op en neer kan kantelen:

 public class Cannon: MonoBehaviour void LateUpdate () float x = Input.GetAxis ("Mouse X") * 2; float y = -Input.GetAxis ("Mouse Y"); // verticale kantelvlotter yClamped = transform.eulerAngles.x + y; transform.rotation = Quaternion.Euler (yClamped, transform.eulerAngles.y, transform.eulerAngles.z); // horizontale baan transform.RotateAround (nieuwe Vector3 (0, 3, 0), Vector3.up, x); 

Laten we als laatste punt het gemakkelijker maken om te richten door een draadkruis toe te voegen aan onze camera:

  • Klik op GameObjects> Maken> Vliegtuig
  • Hernoem het vliegtuig naar crosshair
  • Stel de positie van het dradenkruis in op 0, 0, 0
  • Crosshair.png downloaden
  • Sleep Crosshair.png naar het Project-paneel
  • Sleep de Crosshair-textuur naar het Crosshair-vlak in het scènemeniveau
  • Klik in het infovenster met de rechtermuisknop op het MeshCollider-onderdeel en verwijder het zodat het geen andere fysica-objecten in de scène beïnvloedt

Cannonballs schieten

In staat zijn om naar onze structuur te kijken is goed, maar dit zou over fysica moeten gaan! We hebben een manier nodig om het neer te halen om de natuurkunde in actie te zien. Wat we nodig hebben is iets om te schieten!

  • Klik op GameObject> Maak andere> Bol
  • Hernoem de bol naar Cannonball
  • Stel de positie van de kanonskogel in op 0, 0, 0
  • Als de kanonskogel is geselecteerd, klik je op Componenten> Fysica> Rigidbody
  • Versleep Cannonball vanuit het paneel Hiërarchie naar het paneel Project om er een Prefab van te maken

Omdat we rechtstreeks vanuit de camera kogels kunnen schieten, kunnen we ons bestaande kanonscript bewerken. Eerst voegen we een openbaar attribuut toe aan de bovenkant van de klas voor ons prefab projectiel.

 public class Cannon: MonoBehaviour public GameObject projectilePrefab;

We voegen een FixedUpdate-methode toe om te luisteren naar de knop 'Fire1' die moet worden ingedrukt en een preflight met kanonskogels te maken, deze bij de camera te plaatsen en er vervolgens een kracht aan toe te voegen om deze vooruit te verplaatsen.

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

grenzen

Je hebt misschien gemerkt dat als een kanonskogel ver genoeg wordt afgevuurd, deze van de rand van ons grondvlak kan vallen. Deze kanonskogel blijft bestaan ​​zolang het spel blijft draaien en de fysica zal verder worden berekend, waardoor uiteindelijk de snelheid daalt. We moeten een grens rond het niveau maken en alle spelobjecten vernietigen die deze grens verlaten.

  • Klik op GameObject> Maak leeg
  • Hernoem het naar Grens
  • Stel de x-, y- en z-positie van de grens in op 0
  • Klik met de grens geselecteerd op Componenten> Natuurkunde> Box Collider
  • Controleer in de insepirator of Is Trigger is aangevinkt
  • Zet het vak Collider's Center op 0, 25, 0
  • Stel de grootte van de Box Collider in op 50, 50, 50

Nu moeten we het script maken dat zal vernietigen en objecten die buiten de grens komen.

  • Klik op Activa> Maken> C # Script
  • Hernoem het script naar Grens
  • Sleep het script naar het grensobject in het paneel Hiërarchie
  • Bewerk het script en voeg de volgende code toe
 public class Boundary: MonoBehaviour void OnTriggerExit (Collider overig) Destroy (other.gameObject); 

Vernietiging veroorzaken

We hebben een manier nodig om ons niveau te winnen. Om dit te doen, moeten onze blokken worden vernietigd als ze genoeg schade oplopen door impacts.

  • Klik op Activa> Maken> C # Script
  • Hernoem het script naar Blok
  • Sleep het script naar de prefab Block in het deelvenster Project
  • Dubbelklik op het script in het deelvenster Project om het te bewerken

In het script geven we de prefab een openbare eigenschap Health die kan worden aangepast in de editor. Hierdoor kunnen verschillende blokken verschillende hoeveelheden gezondheid hebben.

 public class Block: MonoBehaviour public float health = 20;

Wanneer een botsing wordt gedetecteerd, wordt de omvang van de impact gemeten. Hoe groter de omvang, hoe meer schade er is aangericht. Alles boven een lichte tik wordt afgetrokken van de gezondheid van het blok. Als de gezondheid van het blok onder 0 komt, vernietigt het blok zichzelf. Vervolgens wordt gecontroleerd hoeveel andere blokken er in de scène overblijven. Als er nog maar één blok over is, is het spel afgelopen en wordt de scène opnieuw geladen om opnieuw te spelen.

 ongeldig OnCollisionEnter (botsing botsing) // pas botsing schade toe als (collision.relativeVelocity.magnitude> 0.5) health - = collision.relativeVelocity.magnitude;  // vernietigen als de gezondheid te laag is als (gezondheid <= 0)  Destroy(gameObject); // restart the scene if this was the last box GameObject[] boxes = GameObject.FindGameObjectsWithTag("Box"); if (boxes.Length <= 1)  Application.LoadLevel("Main");   

Betonblokken

Tot nu toe hebben we alleen houten blokken gebruikt. Ze zijn licht en relatief zwak, waardoor de structuur te gemakkelijk te vernietigen en redelijk voorspelbaar is in hoe het zal bewegen. We moeten een ander type blok maken, een blok dat zowel zwaarder als sterker is.

  • Kopieer in het deelvenster Project de prefab WoodBlock (Ctrl + D in Windows, Cmd + D in OSX)
  • Hernoem het duplicaat in Betonblok
  • Download Concrete.jpg
  • Sleep Concrete.jpg naar het Project-paneel
  • Sleep de textuur Beton naar het prefab ConcreteBlock in het deelvenster Project
  • Met de prefab geselecteerd, gebruikt u de Inspector om de status Health to 50 bij te werken
  • Verhoog de Mass in de Rigidbody-component tot 5 om hem zwaarder te maken
  • Sleep de prefab ConcreteBlock naar de scène

Probeer enkele dwarsbalken te vervangen door betonnen blokken. De betonnen blokken moeten moeilijker te omgooien zijn, vallen met grote impact en zijn moeilijker te vernietigen met kanonskogels.


Voltooid spel

Hieronder ziet u de voltooide game die wordt uitgevoerd in de Unity Web Player. Gebruik de muis om rond de camera te draaien en druk op Ctrl of de linkermuisknop om kanonskogels te schieten.




Conclusie

Deze tutorial krast alleen het oppervlak van wat de Unity physics engine kan. Constante krachten, explosieve krachten, fysieke materialen, scharnieren, veren, ragdolls, enz. Hoewel dit misschien intimiderend lijkt, passen de elementen van de fysica-engine van Unity allemaal bij elkaar, waardoor het gemakkelijk te begrijpen en gemakkelijk te implementeren fysica is in uw games.

Bezoek voor meer informatie over de mogelijkheden van de Unity physics-engine:

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