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.
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.
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:
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.
Un corp rigid este cel mai important element al unui motor de fizică. Orice GameObject la care este atașat este inclus în simulare.
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ă.
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.
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.
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.
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ă:
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!
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));
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ă.
Acum trebuie să creăm scenariul care va distruge obiectele care se răsfrâng în afara graniței.
clasa publica Limita: MonoBehavior void OnTriggerExit (altul Collider) Destroy (other.gameObject);
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.
Î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");
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.
Î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.
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.
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