Joc 2D pentru unitate în stilul de apărare a turnului

Jocurile în stilul Tower Defense sunt incredibil de populare și nu este deloc surprinzător faptul că nu este nimic mai interesant decât să te uiți la apărarea ta, distrugând invadatorii răi!

În acest tutorial vom crea o apărare impregnabilă de monștri (care vor juca rolul turnurilor) în Unitate! Veți învăța cum.







  • Creați valuri de dușmani și învățați-i să urmeze punctele de trecere (punctele de trecere).
  • Creați și actualizați monștrii și folosiți-i pentru a distruge inamicii prin pixeli.

În final, veți obține un cadru pentru acest gen de joc, pe care îl puteți îmbunătăți ulterior!

Trebuie să cunoașteți elementele de bază ale unității, de exemplu, cum să adăugați ansambluri de jocuri și componente, să înțelegeți ce este prefabricat și să cunoașteți C # -ul de bază.

Eu folosesc versiunea de OS X versiune de Unity, dar puteți lucra, de asemenea, sub Windows.

Descrierea jocului 2D pe unitate în stilul turnului de apărare

In acest tutorial, va construi turnuri de apărare de la dușmani (gândaci mici), târându la ficat, care îți aparține și slujitorii tăi, monștri! Puteți plasa monștrii în puncte strategice importante și le puteți procura pentru aur.

Jucătorul trebuie să omoare insectele înainte de a începe să se sărbătorească cu privire la cookie-uri, iar fiecare nou val de inamici este mai greu de învins. Jocul se termină când ați reușit să supraviețuiți tuturor atacurilor (Victorie!), Sau când cinci dușmani vor ajunge la cookie-ul (Înfrângerea!). Iată o captură de ecran a jocului terminat:

Joc 2D pentru unitate în stilul de apărare a turnului
Un joc în stilul Tower Defense pe unitate. Protejați cookie-urile!

Noțiuni de bază cu Unitatea

Dacă nu ați instalat încă unitatea 5 sau o versiune mai nouă, descărcați-o de pe site-ul oficial Unity. În plus, descărcați acest proiect de pornire. dezarhivați și deschideți proiectul TowerDefense-Part1-Starter în Unity.

Proiectul de pornire include imagini și sonde, precum și semne de animație și câteva scenarii utile. Scripturile nu se referă în mod specific la jocurile unui astfel de plan, deci nu vor fi descrise aici. De asemenea, acest proiect conține prefabricate, pe care în viitor va trebui să creați personaje pentru joc. În cele din urmă, proiectul include o scenă cu fundal și o interfață cu utilizatorul.

Deschideți scena jocurilor. găsite în dosarul Scene. și selectați un raport de aspect 4: 3. astfel încât totul să se potrivească pe ecran. Ar trebui să vedeți următoarele în fila Vizualizare joc:

Joc 2D pentru unitate în stilul de apărare a turnului

Lucrul cu monștrii

Monstrii pot fi plasați numai în locurile marcate cu x. Pentru a le adăuga la scenă, trageți Images \ Objects \ Openspot din Browserul de proiect în fila Scene. În prezent, situația nu contează.

Selectați openspot în ierarhie. Apoi adăugați componenta făcând clic pe Adăugați componenta în Inspector și selectați Fizica 2D \ Box Collider 2D. Unitatea afișează o coliziune a căsuței cu o linie verde în fila Scene. Veți folosi acest coliziune pentru a detecta clicurile mouse-ului în acest loc.

Joc 2D pentru unitate în stilul de apărare a turnului
Unitatea determină automat mărimea potrivită pentru coliziune. Se răcește?

Acum adăugați componenta Audio \ Audio Source la Openspot. Setați sursele de sunet AudioClip la tower_place. pe care îl puteți găsi în folderul Audio și dezactivați Play On Awake.

Trebuie să creați încă 11 locuri. În ciuda tentației de a face din nou acești pași, Unitatea are o soluție mai elegantă: prefabricat!

Trageți Openspot din ierarhie în dosarul Prefabs din Browserul de proiect. Numele lui va deveni albastru în Ierarhie pentru a arăta că el este conectat la prefab:

Acum că aveți un prefabricat, puteți crea câte copii aveți nevoie. Trageți pur și simplu Openspot din folderul Prefabs din Browserul de proiecte în fila Scene. Faceți acest lucru de 11 ori, astfel încât pe scenă să fie 12 obiecte Openspot.

Acum folosiți Inspectorul pentru a seta poziția acestor 12 obiecte în următoarele poziții: (-5.2, 3.5, 0). (-2,2, 3,5, 0). (0,8, 3,5, 0). (3,8, 3,5, 0). (-3,8, 0,4, 0). (-0,8, 0,4, 0). (2,2, 0,4, 0). (5,2, 0,4, 0). (-5,2, -3,0, 0). (-2,2, -3,0, 0). (0,8, -3,0, 0). (3,8, -3,0, 0).

Când ați terminat, scena dvs. ar trebui să arate astfel:

Joc 2D pentru unitate în stilul de apărare a turnului

Am pus monștri

Pentru confort, în folderul Prefab este prefabricat Monster.

Monster pregătit, gata de utilizare

În prezent se compune dintr-un obiect gol al jocului cu trei sprites diferite și animațiile lor ca subobiecte.

Fiecare sprite este un monstru cu diferite nivele de putere. Prefab conține și o componentă audio sursă. pe care o veți lansa pentru a reda sunetul când monstrul împușcă laserul.

Creați un script care poate pune Monster pe Openspot.

În Browserul de proiect, selectați Openspot din folderul Prefabs. În Inspector, faceți clic pe Adăugați o componentă, apoi selectați Script nou și denumiți-o PlaceMonster. Selectați C Sharp ca limbă și faceți clic pe Creare și adăugare. pentru că ați adăugat un script în prefabricarea Openspot toate Openspots va conține, de asemenea, acest script.

Faceți dublu clic pe script pentru al deschide în MonoDevelop. Apoi adăugați aceste două variabile:

Veți crea o copie a obiectului stocat în monsterPrefab. pentru a crea un monstru și a-l păstra în monstru pentru ao controla în timpul jocului.

Un monstru pe locație

Adăugați următoarea metodă, astfel încât în ​​fiecare locație să existe un singur monstru:

În canPlaceMonster (), puteți verifica dacă variabila monstru este gol (null). Dacă încă da, înseamnă că nu există nici un monstru, și puteți plasa încă unul.

Acum adaugati urmatoarele linii, datorita carora monstrul va aparea atunci cand utilizatorul face click pe acest obiect de joc:







Acest cod plasează monstrul la apăsarea unui mouse sau atinge ecranul. Deci, cum funcționează?

  1. Unity apelează automat OnMouseUp când player-ul face clic pe colizorul fizic al obiectului de joc.
  2. Atunci când este apelat, această metodă plasează un nou monstru dacă canPlaceMonster () revine la adevărat.
  3. Puteți crea un monstru folosind metoda Instantiate. care creează o mostră prefabricată cu o anumită poziție și rotație. În acest caz, puteți copia monsterPrefab. Aplicați poziția curentă și rotirea obiectului de joc la ea, atașați rezultatul la GameObject și salvați-l în monstru.
  4. Și, în final, numiți PlayOneShot. pentru a reda efectul audio legat de componenta obiectului AudioSource.

Acum, scriptul PlaceMonster poate pune un nou monstru, dar tot trebuie să desemnați prefabricatul.

Utilizarea prefabricatului necesar

Salvați fișierul și reveniți la Unitate. Pentru a atribui variabila monsterPrefab, selectați mai întâi Openspot din folderul Prefabs din Browserul de proiecte. În Inspector, faceți clic pe cercul din dreapta componentei PlaceMonster (Script) din câmpul Monster Prefab și selectați Monster în dialogul care apare.

Porniți scena și creați monștri în diferite puncte marcate cu x. cu clic sau atingeți ecranul.

Joc 2D pentru unitate în stilul de apărare a turnului
Acum puteți crea monștri. Cu toate acestea, ele arata ca o mizerie ciudata, pentru ca toate spiritele fiice ale monstrilor sunt desenate. O vom rezolva mai târziu.

Aruncă monștri în jocul Unity

În figura de mai jos, vedeți cum monștrii dvs. arată mai îngrozitor la niveluri superioare.

Joc 2D pentru unitate în stilul de apărare a turnului
Ce cutie! Dar, dacă încercați să furi cookie-uri, acest monstru se poate transforma într-un ucigaș.

Scenariul servește drept bază pentru aplicarea sistemului de niveluri de monștri. El urmărește cât de puternic trebuie să fie un monstru pe fiecare nivel și, bineînțeles, nivelul actual al monstruului. Adăugați acest script.

Selectați Prefabs / Monster din Browserul de proiect. Adăugați un nou script C # numit MonsterData. Deschideți-o în MonoDevelop și adăugați următorul cod în fața clasei MonsterData.

Am creat clasa MonsterLevel. Stochează valoarea (în aur, pe care o vom scrie ulterior) și apariția diferitelor tipuri de monștri.

Pentru obiectele care urmează a fi editate în inspector, adăugați linia [System.Serializable] în partea superioară a clasei. Aceasta vă permite să modificați rapid toate valorile din clasa nivel - chiar și atunci când jocul este pornit. Acest lucru este incredibil de util pentru echilibrarea jocului.

Determinarea nivelului unui monstru

În acest caz, veți stoca MonsterLevel predefinit în listă.

De ce nu folosiți doar MonsterLevel []. Cel puțin pentru că avem nevoie de indicii obiectelor MonsterLevel de mai multe ori. Codul pentru acest lucru nu este atât de ușor de scris, deci veți folosi IndexOf (). care implementează funcționalitatea Listelor. Nu este nevoie să reinventezi roata. ]

În partea de sus a MonsterData.cs. adăugați instrucțiunea care utilizează:

Acest lucru vă oferă acces la structurile de date comune, astfel încât să puteți utiliza clasa List în scenariul tău.

Funcțiile generice sunt o mare parte din C #. Cu ajutorul acestora, puteți defini structurile de date în siguranță, fără a recurge la tipul lor. Acest lucru este foarte util pentru clase precum listă și set.

Acum adăugați următoarea variabilă MonsterData pentru a ține lista MonsterLevel:

Cu ajutorul funcțiilor generice, puteți să vă asigurați că lista nivelurilor poate conține numai obiecte MonsterLevel. Salvați fișierul și comutați la Unity pentru a configura fiecare nivel al monștrilor. Selectați Prefabs / Monster din Browserul de proiect. În Inspector, puteți vedea folderul Niveluri din componenta MonsterData (Script). Setați dimensiunea la 3.

Joc 2D pentru unitate în stilul de apărare a turnului

Apoi setați costul pentru fiecare nivel:

Atribuiți acum valori pentru câmpul de vizualizare. În fereastra proiectului, extindeți folderul Prefabs / Monster. pentru a vedea subfolderele. Trageți Monster0 în câmpul de vizualizare a elementului 0.

Repetați același lucru pentru atribuirea Monster1 Elementului 1 și Monster2 pentru Elementul 2. Imaginea GIF de mai jos arată clar acest proces:

Când alegeți Prefabs / Monster. prefab ar trebui să arate astfel:

Joc 2D pentru unitate în stilul de apărare a turnului
Determinarea nivelurilor de monștri în Inspector

Determinarea nivelului curent

Reveniți la MonsterData.cs în MonoDevelop și adăugați o altă variabilă MonsterData.

În variabila privată currentLevel, vom avea ... o secundă ... nivelul curent al monstruului. Nu ma asteptam. ]

Destul de puțin C #, nu-i așa? Iată ce facem aici:

  1. Definiți proprietatea pentru variabila privată currentLevel. Atunci când o proprietate este definită, ea poate fi numită ca orice variabilă: fie ca CurrentLevel (dintr-o clasă), fie ca un monster.CurrentLevel (extern). Puteți specifica comportamentul în getters și setterii unei proprietăți. Folosind doar un getter, doar un setter, sau folosind ambele, puteți face proprietatea numai pentru citire, numai pentru scriere sau accesibilă pentru ambele acțiuni.
  2. În getter, returnați valoarea curentă.
  3. În setter, atribuiți o nouă valoare curentului curent. Apoi veți obține indicele nivelului curent. În cele din urmă, treceți prin toate nivelele și setați randamentul într-o stare activă sau inactivă, în funcție de actualulIndex. Acest lucru este minunat, deoarece înseamnă că ori de câte ori cineva stabilește nivelul curent. Sprite este actualizat automat. Proprietățile de aici sunt foarte utile!

Adăugați următoarele la OnEnable:

Aici setăm CurrentLevel când plasăm, asigurându-ne că arată doar sprite dreapta.

Este foarte important să inițializați proprietatea OnEnable în loc de OnStart. deoarece metodele sunt numite atunci când sunt create prefabs.

OnEnable va fi sunat imediat când prefabricatul este creat (dacă prefabricatul a fost salvat în starea pornit), dar OnStart nu este sunat până când obiectul nu este pornit.

Trebuie să verificați aceste date înainte de a plasa monstrul, pentru aceasta rulați OnEnable.

Salvați fișierul și comutați la Unitate. Rulați proiectul și aranjați monștrii. Acum arată corect.

Joc 2D pentru unitate în stilul de apărare a turnului

Treceți monștri

Reveniți la MonoDevelop și adăugați următoarea metodă la MonsterData:

În getNextLevel, obțineți indexul curent și indicele maxim de nivel. Dacă monstrul nu este încă complet pompat, returnați indexul următorului nivel, altfel este nul.

Puteți folosi această metodă pentru a afla dacă este posibilă actualizarea unui monstru. Adăugați următoarea metodă pentru a crește nivelul monstru:

Aici obțineți indicele nivelului curent și verificați dacă acesta este mai mic decât nivelurile. Count - 1. Dacă da, - monstrul poate fi încă pompat, deci atribuim CurrentLevel următorul nivel.

Testarea posibilității de upgrade

Salvați fișierul, apoi treceți la PlaceMonster.cs în MonoDevelop și adăugați această nouă metodă:

Aici ne uităm dacă există un monstru care poate fi actualizat prin verificarea variabilei monstru la nul. Dacă da, obținem nivelul monstru actual de la MonsterData. După aceasta, verificăm dacă este disponibil un nivel mai înalt, care nu se întoarce la null când getNextLevel (). Dacă "pompați" monstrul este posibil, întoarceți-vă adevăratul. altfel, fals.

Activați upgrade-ul cu aur

Pentru a activa opțiunea de upgrade, adăugați declarația else if la OnMouseUp:

Verificați dacă actualizarea este posibilă cu canUpgradeMonster (). Dacă da, accesați componenta MonsterData cu GetComponent () și call increaseLevel (). care mărește nivelul monștrilor. În cele din urmă, porniți sunetul pentru monstru AudioSource. Salvați fișierul și reveniți la Unitate. Rulați jocul, aranjați și faceți upgrade cât mai mulți monștri. în timp ce este posibil.

Joc 2D pentru unitate în stilul de apărare a turnului
Etapele montajului în Unity

La următoarea lecție despre Turnul de Apărare pe Unitate, vom introduce moneda jocului în joc, vom lucra pe traseul pentru monștri etc.

Joc 2D pentru unitate în stilul de apărare a turnului

  • unitate
Joc 2D pe Unitate. Un ghid detaliat. Partea 1





Articole similare

Trimiteți-le prietenilor: