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.
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.
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:
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.
Een rigide lichaam is het meest kritieke element in een fysica-engine. Elk GameObject waaraan het is gekoppeld, is opgenomen in de simulatie.
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.
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.
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.
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.
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:
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!
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));
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.
Nu moeten we het script maken dat zal vernietigen en objecten die buiten de grens komen.
public class Boundary: MonoBehaviour void OnTriggerExit (Collider overig) Destroy (other.gameObject);
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.
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");
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.
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.
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.
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