Construiți Arkanoid cu unitate Mecanica blocurilor, prefabricate și designul de nivel

Ce veți crea

În această serie de tutorial, vă vom arăta cum să recreați jocul clasic Arkanoid (sau Breakout) în Unity, utilizând uneltele 2D native ale Unity. În fiecare post, ne vom concentra pe o anumită parte a jocului; în acest post, vom gestiona mecanica blocurilor și crearea prefabricatelor.

Unde am plecat

În tutorialele anterioare, ați configurat proiectul și ați codificat comportamentele paletei și mingii. Dacă nu ați terminat încă tutorialele anterioare, vă recomandăm să faceți acest lucru înainte de a continua.

Vizualizare finală

Aruncați o privire la acest demo pentru a vedea ce vrem să urmărim în întreaga serie:

Și iată ce vom avea la sfârșitul acestui post:

Crearea blocului script

Chiar acum, aproape toate mecanicii de bază sunt gata. Partea lipsă este legată de obiectul bloc. Deoarece blocurile sunt o parte importantă și activă a jocului, trebuie să creați un script personalizat pentru acesta. 

Scriptul bloc trebuie să conțină informații despre:

  • Total hit-uri pe care le poate gestiona.
  • Puncte de atribuire la rupere.

(Rețineți că numărul de accesări și de puncte se poate modifica în funcție de culoarea blocului.) Pe baza acestui lucru, să dăm blocului trei variabile:

  • O variabilă pentru a stoca numărul de hit-uri bloc poate lua.
  • O variabilă pentru a stoca valoarea scorului blocului.
  • O variabilă pentru stocarea numărului de blocuri deja fost lovit.

Primele două vor fi public, deoarece este posibil să doriți să modificați valorile acestora în editor. Al treilea va fi privat, deoarece este numai pentru uz intern. 

Astfel, creați un nou script numit BlockScript. Definiți aceste variabile și inițializați numărul de hit-uri către 0:

clasa publica BlockScript: MonoBehour public int hitsToKill: puncte public int; private int numberOfHits; // Folosiți acest lucru pentru inițializare void Start () numberOfHits = 0;  // Actualizarea se numește o singură dată pentru fiecare cadru Anulare () 

Următorul pas este să detectezi când bilele au lovit un bloc. Când apare această coliziune, verificăm dacă blocul a fost lovit suficient de mult pentru a fi distrus sau dacă este încă intact. Pentru aceasta, putem folosi o metodă specifică numită OnCollisionEnter2D, care se numește de fiecare dată când apare o coliziune pentru obiectul dvs..

Pentru a verifica dacă această ciocnire se întâlnește între minge și bloc, trebuie etichetă obiectul mingii. În editor, selectați mingea de la Ierarhie fila și apoi Inspector. În partea de sus a ecranului Inspector, chiar sub numele de obiect de joc, există un câmp numit Etichetă care este definit în prezent ca neetichetate. Faceți clic pe butonul și se va afișa un meniu vertical cu diferitele posibilități pentru etichete:

Vrem o etichetă specifică pentru minge, atât de lovită Adaugă etichetă pentru a crea o etichetă nouă. După ce apăsați opțiunea apare o interfață nouă:

Pentru acest tutorial, ne vom concentra doar pe Elementul 0 proprietate. Acesta definește numele etichetei, astfel că tastați numele Minge în ea.

Acum că ai noul Minge tag, schimbați eticheta obiectului mingii Minge.


Deschide BlockScript astfel încât să putem codifica OnCollisionEnter2D metodă. Pentru a identifica obiectul jocului cu bile, verificați dacă eticheta obiectului de joc este Minge; dacă da, atunci coliziunea a fost între bloc și minge. Adăugați următorul cod în scriptul dvs..

 void OnCollisionEnter2D (coliziune Collision2D) if (collision.gameObject.tag == "Ball") 

Acum puteți detecta coliziuni cu mingea. La fiecare coliziune, dorim sa crestem recordul de numar de ori blocul a fost lovit si daca numarul blocurilor blocate este acelasi cu numarul maxim de lovituri pe care blocul le poate lua, distruge blocul. Pentru acesta din urmă, putem folosi metoda Destroy.

 Actualizată OnCollisionEnter2D pentru a face acest lucru arata ca:

 void OnCollisionEnter2D (coliziune Collision2D) if (collision.gameObject.tag == "Ball") numberOfHits ++; if (numberOfHits == hitsToKill) // distruge obiectul Destroy (this.gameObject); 

Acum adaugati BlockScript la Minge obiect (Ierarhia> Inspector> Adăugați componenta):

Acum este momentul să verificăm că totul este bine. Schimba Hits to Kill valoare în editor la 1 și Joaca jocul. Când mingea a lovit blocul, blocul ar trebui să dispară.

Crearea unui prefabricat

Acum că mecanica blocurilor este gata, vom popula nivelul. Din moment ce veți folosi mai multe blocuri pentru acest lucru, este un moment bun pentru a introduce Unity's prefabricate

Un Prefab este un obiect de joc reutilizabil care poate fi inserat de mai multe ori în aceeași scenă. Practic, aceasta înseamnă că, dacă doriți, de exemplu, să modificați valoarea punctelor blocurilor albastre, nu trebuie să o faceți la fiecare bloc albastru de pe scena: dacă aveți un Prefab al unui bloc albastru, doar ajustați valoarea Prefab și toate blocurile din scenă vor fi actualizate.

Pentru a crea un Prefab pentru blocurile albastre, începeți prin redenumirea bloc obiecte pentru Blocul albastru. Apoi, creați un nou dosar în bunuri director numit prefabricate. Acum trageți Blocuri albastre obiect în interiorul noului dosar.

După cum probabil ați observat, pictograma cub din partea de sus a paginii Inspector este acum albastră. De asemenea, numele obiectului de joc din scenă Ierarhie este, de asemenea, albastru. Aceasta înseamnă că blocul este acum un Prefab. Destul de simplu, nu-i așa? De acum înainte, selectând Prefabul și schimbând valorile acestuia, se va aplica fiecare schimbare făcută parametrilor tuturor blocurilor noastre albastre.

Pentru a testa Prefab-ul, trageți-l din dosar în lista noastră Ierarhie tab. După cum puteți vedea, acum avem două blocuri albastre, dar ele împărtășesc aceeași poziție, care a fost definită de Prefab.

Pentru a avea cele două blocuri în poziții diferite, alegeți una dintre ele din Ierarhie și mutați-o în jurul scenei. În acest fel, modificați valorile acelei copii specifice a blocului și nu toate blocurile.

Poti Joaca jocul și testarea Prefabs.

Refacerea prefabricatelor

Acum veți crea prefabricate rămase pentru celelalte blocuri (verde, galben și roșu). Principalii pași pentru fiecare dintre acestea sunt:

  1. Creați un nou Sprite.
  2. Adăugați imaginea corespunzătoare.
  3. Adăugați o cutie de coliziune 2D.
  4. Adăugați BlockScript-ul.
  5. Denumiți-o în consecință.
  6. Creați un Prefab.

În final, ar trebui să aveți patru prefabricate diferite (câte unul pentru fiecare tip de bloc):

Pentru a face jocul mai interesant, schimbați-l Hits to Kill pentru fiecare tip de bloc ca acesta:

  • Albastru: 1 lovit.
  • Verde: 2 hit-uri.
  • Galben: 3 hit-uri.
  • Roșu: 4 hit-uri.

Adăugați câteva blocuri și Joaca jocul; verificați dacă totul funcționează conform așteptărilor.

Nivelul de design

Acum este momentul să vă creați primul nivel. Folosind Prefabs, populați zona de joc cu mai multe blocuri. Dacă ați plasat cât mai multe blocuri ca noi, dvs. Ierarhie fila este probabil suprapopulată cu obiecte de joc bloc! Pentru a vă păstra bine organizat proiectul, să creăm obiecte de joc goale pentru cele patru tipuri de blocuri și apoi grupați blocurile după culoare:

În acest moment, jocul este aproape gata, mecanica dvs. de bază este implementată și ar trebui să arate similar cu următoarea figură:

Scor și sistem de viață

Scorul și sistemul de viață sunt o modalitate de a testa jucătorii și de a introduce dinamică în jocuri. În acest moment, jocul dvs. nu are nicio cale pentru ca jucătorii să progreseze sau să piardă. Să schimbăm asta acum. 

Deschide PlayerScript și adăugați două variabile: una pentru punctaj și una pentru numărul de vieți pe care le are jucătorul. Vom lăsa jucătorul să înceapă jocul cu trei vieți și fără puncte:

jucator privat intIsunt; private int PlayerPoints; // Folosiți acest lucru pentru inițializare void Start () // obțineți poziția inițială a game player objectPosition = gameObject.transform.position; playerLives = 3; PlayerPoints = 0; 

Avem nevoie de o metodă care mărește numărul de puncte pe care le are jucătorul de fiecare dată când distrug un bloc. Creați o nouă metodă numită addPoints pentru a face acest lucru:

void addPoints (puncte int) playerPoints + = puncte; 

Acum avem noua metodă care așteaptă o valoare - dar cum o va primi? Există prea multe blocuri pentru a face trimiteri la obiectul paletelor jucătorului în fiecare ...  

Cea mai bună modalitate de a rezolva aceasta este trimiterea unui mesaj de la obiectul bloc la obiectul paletei. Cum facem asta? Ei bine, mai întâi trebuie să etichetați paleta (Ierarhia> Inspector> Tag) cu Jucător etichetă.


Cu paleta marcată, este timpul să treceți la scriptul bloc, unde vom schimba metoda OnCollisionEnter2D pentru a trimite punctele către obiectul jucatorului: înainte ca blocul să fie distrus, vom căuta un obiect de joc cu Jucător eticheta folosind FindGameObjectsWithTag metodă; acest lucru va returna o matrice de obiect de potrivire, ans deoarece există doar un obiect cu acea etichetă, știm că obiectul din poziția 0 a matricei returnate este obiectul paletei jucătorului.

Acum, dacă aveți referința jucătorului, puteți trimite un mesaj folosind Trimite mesaj metodă. Cu aceasta, puteți apela o metodă specifică a obiectului jucătorului - în acest caz, addPoints metodă. 

Fragmentul următor vă arată cum funcționează toate acestea:

void OnCollisionEnter2D (coliziune Collision2D) if (collision.gameObject.tag == "Ball") numberOfHits ++; if (numberOfHits == hitsToKill) // obțineți referință pentru obiectul jucătorului GameObject player = GameObject.FindGameObjectsWithTag ("Player") [0]; // trimite mesaj player.SendMessage ("addPoints", puncte); // distruge obiectul Destroy (this.gameObject); 

Următorul lucru pe care trebuie să-l facem este să editați prefabricatele și să dați anumite valori punctuale fiecărui tip de bloc. Puteți utiliza următoarele valori:

  • Albastru: 10 puncte;
  • Verde: 20 puncte;
  • Galben: 35 puncte;
  • Roșu: 50 puncte;

Acum, să arătăm aceste puncte și trăim în interfața de joc. În scriptul player, creați o metodă numită OnGUI. Această metodă va prezenta GUI-ul jocului dvs. este una dintre metodele de bază de a prezenta informații în zona de jocuri. (Notați caracterele sensibile la litere mici).

Pentru a prezenta punctele și viețile, trebuie să creăm a Eticheta cu textul dorit. În PlayerScript, adaugă OnGUI și creați această etichetă în ea:

void OnGUI () GUI.Label (nou Rect (5.0f, 3.0f, 200.0f, 200.0f), "Live's:" + jucatorLife + "Scor: + Puncte Player); 

Acuma poți Joaca jocul și eticheta vor fi prezentate în partea din stânga sus a ecranului. Cu toate acestea, nu ați programat încă viața și afișarea punctelor pentru actualizarea corespunzătoare! 

Folosind același lucru PlayerScript, adăugați următoarele TakeLife metodă. Metoda va scădea numai o singură viață din fondul de jucători de fiecare dată când se numește:

void TakeLife () playerLives--; 

În cele din urmă, treceți la BallScript, și, în secțiunea în care verificați dacă mingea a căzut de pe ecran, trimiteți un mesaj obiectului jucătorului cu TakeLife metodă. Fragmentul complet este prezentat mai jos:

// Verificați dacă mingea cade dacă (ballIsActive && transform.position.y < -6)  ballIsActive = !ballIsActive; ballPosition.x = playerObject.transform.position.x; ballPosition.y = -4.2f; transform.position = ballPosition; rigidbody2D.isKinematic = true; // New code - Send Message playerObject.SendMessage("TakeLife"); 

Redați jocul și verificați dacă scorul și sistemul de viață funcționează conform așteptărilor.

Data viitoare

Acesta încheie al treilea post din serie. Mecanica jocului de bază este pe loc, astfel încât data viitoare vom adăuga niveluri audio și noi și vom implementa jocul terminat.

Dacă aveți întrebări sau feedback despre ceea ce am acoperit până acum, vă rugăm să lăsați un comentariu mai jos.