Lucrul cu fizica Unity3D

Acest tutorial vă va învăța cum să construiți un joc cu Unity3D! Pe parcurs, veți afla despre importanța folosirii unui motor fizic și cum acest lucru va salva nenumărate ore de animație manuală. Citește mai departe!

Ce motor de joc modern ar fi complet fără un motor de fizică? Fiecare motor de joc actual, fie 3D sau 2D, are o bibliotecă de fizică de un fel, iar Unity nu face excepție. Fizica în timp real este ideală pentru simularea interacțiunilor complexe dintre obiectele din joc. Un motor de fizică poate salva o mulțime de codificare manuală și de animație pentru a realiza mișcări realiste, poate face detectarea hit-urilor performante o briză și poate introduce rapid o serie de noi mecanisme de joc în jocurile dvs..

În acest tutorial, vom folosi motorul fizic în Unity pentru a construi un joc knockdown 3D similar cu BoomBlox și Angry Birds. Vom învăța cum să dăm obiecte diferite proprietăți fizice, să le facem capabile să se ciocnească și chiar să le permită să fie distruse dacă coliziunile sunt destul de puternice.


Ce este un motor fizic?

Un motor de fizică funcționează simulând modul în care obiectele reacționează unul cu celălalt atunci când forțele le sunt aplicate. Aceste forțe pot fi constante, cum ar fi gravitatea sau impulsul unui vehicul, în timp ce altele sunt scurte și puternice, ca explozii. O simulare de fizică este uneori numită "sandbox" deoarece sunt afectate numai obiectele din simulare. Într-adevăr, nu fiecare obiect din joc trebuie să facă parte din simulare. Acest lucru este important deoarece mișcările jucătorilor trebuie adesea nerealiste, răspunzând în mod realist coliziunilor.


Setarea proiectului

  • Faceți clic pe Fișier> Proiect nou
  • Căutați un dosar potrivit și denumiți proiectul CannonBowl
  • Faceți clic pe Creați
  • Faceți clic pe GameObject> Create Other> Light Directional
  • Faceți clic pe File> Save Scene
  • Denumiți scena Principal
  • Dați clic pe Salvați

acceleratoare

Colizoarele sunt ceea ce motoarele fizicii folosesc pentru a efectua detectarea loviturilor. Spre deosebire de obiectele de plasă, ei știu când au intrat în contact unul cu celălalt. Ele sunt forme simple, cum ar fi cutii, sfere sau capsule, care sunt atribuite GameObjects dvs. și să le urmeze în jurul valorii. Vă puteți gândi la ele ca la un "câmp de forță".

În mod convenabil, ori de câte ori este creat un GameObject, îi este atribuit automat un collider adecvat. Un cub primește un BoxCollider, o sferă primește un SphereCollider, un Cilindru primește un CapsuleCollider și așa mai departe.

În cele din urmă vom avea nevoie de niște blocuri pentru a bate:

  • Faceți clic pe GameObject> Create Other> Cube
  • Redenumiți Cube-ul Bloc de lemn
  • Setați poziția blocului la 0, 0, 0. Aceasta va centra blocul din lume
  • Descărcați Wood.jpg
  • Trageți Wood.jpg în panoul dvs. de proiect pentru ao face o textură
  • Trageți textura lemnului pe bloc în vizualizarea scenă, aceasta va crea automat un material din lemn pentru noi și îl va aplica blocului
  • Trageți panoul Blochează din panoul Ierarhia în panoul Proiect pentru ao transforma într-o Prefab

Dacă apăsăm pe Play, blocul nu va face nimic. În timp ce are un atacator, îi lipsește un corp rigid, deci nu este afectat de forțele fizice.


Rigidbodies

Un corp rigid este cel mai important element al unui motor de fizică. Orice GameObject la care este atașat este inclus în simulare.

  • Selectați blocul prefabricat din panoul Proiect
  • Faceți clic pe Component> Fizică> Corp dur

Implicit, o carcasă rigidă este afectată de rezistența la gravitație și de aer, cunoscută și sub numele de tragere. Dacă apăsăm Redare, blocul va începe să cadă, să accelereze și, în cele din urmă, să atingă viteza terminală când forța de gravitație și trageți egalizează.


Construiți o structură

Va trebui să creăm câteva elemente pentru a construi un nivel adecvat. Mai întâi, să adăugăm un pământ, astfel încât blocul să aibă ceva de aterizare.

  • Faceți clic pe GameObject> Create Other> Plane
  • Redenumiți planul la Sol
  • Setați poziția Ground la 0, 0, 0
  • Descărcați Grass.jpg
  • Trageți Grass.jpg în panoul dvs. de proiect pentru ao face o textură
  • Trageți textura iahtului pe sol în vederea scenei

La sol se va da automat un MeshCollider care va împiedica trecerea prin el a unor rigide. Apăsați pe Redare și Blocul trebuie să cadă și să se așeze pe partea de sus a solului.

Acum avem nevoie de o structură pentru a bate. Selectați blocul și apăsați Ctrl + D în Windows, sau Cmd + D în OSX, pentru a duplica blocul de câteva ori. Utilizați scalele și deplasați uneltele pentru a întinde și poziționa blocurile în aproximativ aceeași configurație ca imaginea de mai jos.

NOTĂ: Este o idee bună să folosiți numere precise pentru transformările voastre. Blocurile trebuie să se sprijine reciproc, dar să nu se suprapună. Suprapunerile vor provoca motorul fizicii să se sperie și să facă lucruri imprevizibile.


Controlul camerei

Acum că am creat structura noastră frumoasă, să scriem un scenariu care ne va permite să mutăm camera astfel încât să putem admira creația noastră din toate unghiurile.

  • Faceți clic pe Active> Creare> Script C #
  • Redenumiți scriptul la Tun (pentru că în cele din urmă camera noastră va face fotografia)
  • Trageți scenariul pe camera principală
  • Faceți dublu clic pe script pentru ao edita

Următorul scenariu va determina aparatul foto să orbiteze centrul lumii, precum și să înclină în sus și în jos:

 clasa publica Cannon: MonoBehour void LateUpdate () float x = Input.GetAxis ("Mouse X") * 2; float y = -Input.GetAxis ("Mouse Y"); // flotor vertical înclinat yClamped = transform.eulerAngles.x + y; transform.rotation = Quaternion.Euler (yClamped, transform.eulerAngles.y, transform.eulerAngles.z); // orizontală orbitează transform.RotateAround (Vector3 nou (0, 3, 0), Vector3.up, x); 

Ca o atingere finală, hai să facem mai ușor să țintim adăugând o cruce la camera noastră:

  • Faceți clic pe GameObjects> Create> Plane
  • Redenumiți planul la Crosshair
  • Setați poziția Crosshair la 0, 0, 0
  • Descărcați Crosshair.png
  • Trageți Crosshair.png în panoul Proiect
  • Trageți textura Crosshair pe planul Crosshair din panoul Scene
  • În Inspector, faceți clic dreapta pe componenta MeshCollider și eliminați-o astfel încât să nu afecteze alte obiecte de fizică din scenă

Tragere cu tunuri

Fiind capabil să ne uităm la structura noastră este bine, dar se presupune că este vorba despre fizică! Avem nevoie de o modalitate de ao bate pentru a vedea fizica în acțiune. Avem nevoie de ceva de filmat!

  • Faceți clic pe GameObject> Create Other> Sphere
  • Redenumiți sfera la Cannonball
  • Setați poziția Cannonball la 0, 0, 0
  • Cu Cannonball selectat, faceți clic pe Components> Physics> Rigidbody
  • Trageți Cannonball din panoul Ierarhie în panoul Proiect pentru ao transforma într-o Prefab

De vreme ce vom trage cu tunuri direct de la aparatul de fotografiat, putem edita scenariul Cannon existent. În primul rând, adăugăm un atribut public în partea de sus a clasei pentru prefabul nostru de proiectile.

 clasa publica Cannon: MonoBehour public GameObject projectilePrefab;

Adăugăm o metodă FixedUpdate pentru a asculta butonul "Fire1" care urmează să fie apăsat și apoi instanțiați un prefab Cannonball, poziționați-l la aparatul de fotografiat și apoi adăugați o forță la acesta pentru al mișca înainte.

 void FixedUpdate () if (Input.GetButtonDown ("Fire1")) GameObject projectile = Instantiate (proiectilPrefab, transform.position, transform.rotation) ca GameObject; proiectil.rigidbody.AddRelativeForce (nou Vector3 (0, 0, 2000)); 

graniţele

S-ar putea să fi observat că dacă o tună este trasă destul de departe, ea poate cădea de pe marginea avionului nostru de la sol. Acest cannon va continua să existe atâta timp cât jocul continuă să funcționeze, iar fizica sa va continua să fie calculată, eventual încetinind lucrurile. Trebuie să creăm o limită în jurul nivelului și să distrugem orice obiecte de joc care părăsesc această limită.

  • Faceți clic pe GameObject> Creare gol
  • Redenumiți-o Limite
  • Setați pozițiile limitelor x, y și z la 0
  • Cu Boundary selectat, faceți clic pe Components> Physics> Box Collider
  • În insepctor, asigurați-vă că este activat Trigger
  • Setați Centrul Colliderului Boxului la 0, 25, 0
  • Setați mărimea Box Collider la 50, 50, 50

Acum trebuie să creăm scenariul care va distruge obiectele care se răsfrâng în afara graniței.

  • Faceți clic pe Active> Creare> Script C #
  • Redenumiți scriptul la Limite
  • Trageți scriptul pe obiectul Boundary din panoul Ierarhie
  • Editați scriptul și adăugați următorul cod
 clasa publica Limita: MonoBehavior void OnTriggerExit (altul Collider) Destroy (other.gameObject); 

Cauzând distrugerea

Avem nevoie de o modalitate de a ne câștiga nivelul. Pentru a face acest lucru, blocurile noastre trebuie să fie distruse dacă suferă suficiente daune din cauza impactului.

  • Faceți clic pe Active> Creare> Script C #
  • Redenumiți scriptul la bloc
  • Glisați scriptul pe blocul prefabricat din panoul Proiect
  • Faceți dublu clic pe scriptul din panoul Proiect pentru ao edita

În scenariu, oferim prefabricatului o proprietate publică de sănătate care poate fi ajustată în editor. Acest lucru permite blocurilor diferite să aibă diferite cantități de sănătate.

 clasa publica Block: MonoBehavior public float health = 20;

Când se detectează o coliziune, se măsoară amploarea impactului. Cu cât este mai mare magnitudinea, cu atât mai multă pagubă a fost făcută. Orice lucru deasupra unui robinet de lumină este scăzut din sănătatea blocului. Dacă starea de sănătate a blocului scade sub 0, blocul se distruge. Apoi verifică pentru a vedea câte blocuri rămân în scenă. Dacă mai rămâne un singur bloc, jocul se termină și reîncarcă scena pentru a reda.

 void OnCollisionEnter (coliziune coliziune) // aplicați daunele de coliziune dacă (collision.relativeVelocity.magnitude> 0.5) health - = collision.relativeVelocity.magnitude;  // distruge dacă sănătatea este prea scăzută dacă (sănătate <= 0)  Destroy(gameObject); // restart the scene if this was the last box GameObject[] boxes = GameObject.FindGameObjectsWithTag("Box"); if (boxes.Length <= 1)  Application.LoadLevel("Main");   

Blocuri de beton

Până acum, am folosit doar blocuri de lemn. Ele sunt ușoare și relativ slabe, făcând structura prea ușor de distrus și destul de previzibilă în modul în care se va mișca. Trebuie să creăm un alt tip de bloc, unul care este mai greu și mai puternic.

  • În panoul Proiect, duplicați prefabricatul WoodBlock (Ctrl + D în Windows, Cmd + D în OSX)
  • Redenumiți duplicatul la ConcreteBlock
  • Descarcă Concrete.jpg
  • Trageți Concrete.jpg în panoul Proiect
  • Trageți textura de beton în prefabricatul ConcreteBlock din panoul Proiect
  • Cu prefabricatul selectat, utilizați inspectorul pentru a actualiza starea de sănătate la 50
  • În componenta Rigidbody, măriți masa la 5 pentru a deveni mai greu
  • Trageți prefabul ConcreteBlock în scenă

Încercați să înlocuiți niște elemente încrucișate cu blocuri de beton. Blocurile de beton ar trebui să fie mai greu să bată, să cadă cu un impact mare și să fie mai greu de distrus cu ajutorul gloanelor.


Joc finalizat

Mai jos este jocul terminat care rulează în Unity Web Player. Foloseste mouse-ul pentru a orbita camera si apasa Ctrl sau stanga mouse-ul pentru a trage cu tunuri.




Concluzie

Acest tutorial doar zgârie suprafața a ceea ce este capabil de unitatea Physics. Forțe constante, forțe explozive, materiale fizice, balamale, izvoare, ragdoluri etc. Deși acest lucru poate părea descurajant, elementele motorului de fizică Unity se potrivesc împreună, făcând-o ușor de înțeles și ușor de implementat fizica în jocurile tale.

Pentru a afla mai multe despre capabilitățile motorului Unity Physics, vizitați:

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

Cod