Bygg Arkanoid Med Enhet Blokkermekanikk, Prefabs og Level Design

Hva du skal skape

I denne opplæringsserien vil vi vise deg hvordan du gjenskaper det klassiske Arkanoid-spillet (eller Breakout) i Unity, ved hjelp av Unitys innfødte 2D-verktøy. I hvert innlegg fokuserer vi på en bestemt del av spillet; I dette innlegget håndterer vi blokkmekanikkene og opprettelsen av Prefabs.

Hvor vi forlot

I de tidligere opplæringsprogrammene satte du opp prosjektet og kodet oppføringene til padle og ball. Hvis du ikke har fullført de tidligere opplæringene ennå, anbefaler vi sterkt at du gjør det før du fortsetter.

Endelig forhåndsvisning

Ta en titt på denne demonstrasjonen for å se hva vi sikter mot i hele serien:

Og her er hva vi skal ha på slutten av dette innlegget:

Opprette blokkskriptet

Akkurat nå er nesten alle basismekanikene klare. Den manglende delen er relatert til blokkobjektet. Siden blokker er en viktig og aktiv del av spillet, må vi opprette et tilpasset skript for det. 

Blokkerskriptet må inneholde informasjon om:

  • Totalt antall treff som den kan håndtere.
  • Poeng til å belønne ved å bryte.

(Merk at antall treff og poeng kan endres i henhold til blokkfargen.) Basert på dette, la oss gi blokken tre variabler:

  • En variabel for å lagre antall treff blokkene kan ta.
  • En variabel for å lagre poengsummen til blokken.
  • En variabel for å lagre antall ganger blokken har allerede blitt rammet.

De to første vil være offentlig, siden du kanskje vil endre verdiene i editoren. Den tredje vil være privat, siden det kun er til internt bruk. 

Dermed opprett et nytt skript som heter BlockScript. Definer disse variablene og initialiser antall treff til 0:

offentlig klasse BlockScript: MonoBehaviour public int hitsToKill: offentlige int poeng; privat int nummerOfHits; // Bruk dette for initialisering tomt Start () numberOfHits = 0;  // Oppdatering kalles en gang per ramme ugyldig Oppdatering () 

Det neste trinnet er å oppdage når ballene treffer en blokk. Når denne kollisjonen oppstår, kontrollerer vi om blokken er blitt slått nok til å bli ødelagt, eller om den fortsatt er intakt. For det kan vi bruke en bestemt metode som heter OnCollisionEnter2D, som kalles hver gang det oppstår et kollisjon mot objektet ditt.

For å sjekke om denne kollisjonen er mellom ballen og blokken, må vi stikkord ballen objektet. I redaktøren velger du ballen fra hierarki kategorien og deretter Inspektør. På toppen av Inspektør, like under spillobjektnavnet, er det et felt som heter stikkord som for øyeblikket er definert som ukodet. Klikk på knappen, og en rullegardinmeny vil dukke opp med de forskjellige tagmulighetene:

Vi vil ha en bestemt tag for ballen, så hit Legg til tag å opprette en ny tagg. Når du trykker på alternativet vises et nytt grensesnitt:

For denne opplæringen vil vi bare fokusere på Element 0 eiendom. Dette definerer navnet på taggen, så skriv inn navnet Ball i det.

Nå som du har den nye Ball tag, endre ballobjektets tag til Ball.


Åpne BlockScript fil slik at vi kan kode OnCollisionEnter2D metode. For å identifisere ballspillobjektet, sjekk om spillobjekttaggen er Ball; I så fall var kollisjonen mellom blokken og ballen. Legg til følgende kode i skriptet ditt.

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

Nå kan du oppdage kollisjoner med ballen. Ved hvert kollisjon vil vi øke oversikten over hvor mange ganger blokken ble truffet, og hvis nummeret som blokken ble rammet, er det samme som det maksimale antall treff blokkene kan ta, ødelegger blokken. For sistnevnte kan vi bruke Destroy-metoden.

 Den oppdaterte OnCollisionEnter2D å gjøre dette ser ut som følgende:

 void OnCollisionEnter2D (Collision2D kollisjon) if (collision.gameObject.tag == "Ball") numberOfHits ++; hvis (numberOfHits == hitsToKill) // ødelegge objektet Destroy (this.gameObject); 

Legg nå til BlockScript til Ball objekt (Hierarki> Inspektør> Legg til komponent):

Det er nå på tide å sjekke at alt er bra. Endre Hits å drepe verdi i redigeringsprogrammet til 1 og Spille spillet. Når ballen treffer blokken, bør blokken forsvinne.

Opprette en prefab

Nå som blokkmekanikkene er klare, vil vi fylle nivået. Siden du vil bruke flere blokker for dette, er dette en god tid å introdusere Unity prefabs

En Prefab er et gjenbrukbart spillobjekt som kan settes inn flere ganger i samme scene. I utgangspunktet betyr dette at hvis du for eksempel vil endre verdien av punkter i de blå blokkene, trenger du ikke gjøre det til hver eneste blå blokk på scenen: Hvis du har en Prefab med en blå blokk, Du justerer bare Prefab-verdien og alle blokkene på scenen vil bli oppdatert.

For å lage en Prefab for de blå blokkene, start ved å gi nytt navn til Blokkere ha innvendinger Blå blokk. Deretter lager du en ny mappe i Eiendeler mappe kalt prefabs. Dra nå Blå blokker objekt i den nye mappen.

Som du kanskje har lagt merke til, er kubikonet øverst på Inspektør er nå blå. Også navnet på spillobjektet i scenen hierarki er også blå. Dette betyr at blokken er nå en Prefab. Ganske enkelt, ikke sant? Fra nå av velger du Prefab og endrer verdiene sine til enhver endring du gjør til parametrene til alle våre blå blokker.

For å teste Prefab, dra den fra mappen til vår hierarki fane. Som du ser, har vi nå to blå blokker, men de deler samme posisjon, som ble definert av Prefab.

For å ha de to blokkene i forskjellige posisjoner, velg bare en av dem fra hierarki fanen og flytte den rundt scenen. På denne måten endrer du verdiene til den spesifikke kopien av blokken og ikke alle blokkene.

Du kan Spille spillet og test prefabs.

Rekreasjon av prefabs

Nå vil du lage de gjenværende Prefabs for de andre blokkene (grønn, gul og rød). Hovedtrinnene for hver enkelt er:

  1. Lag en ny Sprite.
  2. Legg til tilsvarende bilde.
  3. Legg til en boks Collider 2D.
  4. Legg til BlockScript.
  5. Gi det navnet.
  6. Lag en prefab.

Til slutt bør du ha fire forskjellige prefabs (en for hver type blokk):

For å gjøre spillet mer interessant, endre Hits å drepe for hver type blokk som slik:

  • Blå: 1 truffet.
  • Grønn: 2 treff.
  • Gul: 3 treff.
  • Rød: 4 treff.

Legg til noen blokker og Spille spillet; Kontroller at alt kjører som forventet.

Nivådesign

Det er nå på tide å lage ditt første nivå. Bruk Prefabs, fylle spillområdet med flere blokker. Hvis du har plassert så mange blokker som vi gjorde, din hierarki fanen er trolig overbefolket med blokkspillobjekter! For å holde prosjektet godt organisert, la oss lage tomme spillobjekter for de fire typer blokkene, og grupper deretter blokkene etter farge:

På dette punktet er spillet ditt nesten klart, din grunnleggende mekanikk er implementert, og den skal se ut som den neste figuren:

Resultat og livssystem

Poengsum og livssystem er en måte å teste spillerne på og introdusere ny dynamikk i spill. På dette tidspunktet har spillet ditt ingen rolle for spillerne å utvikle seg eller miste. La oss endre det nå. 

Åpne PlayerScript og legg til to variabler: en for poengsum og en for antall liv spilleren har. Vi lar spilleren starte spillet med tre liv og ingen poeng:

private int playerLives; private int playerPoints; // Bruk dette for initialisering tomt Start () // få startposisjonen til spillobjektet playerPosition = gameObject.transform.position; playerLives = 3; playerPoints = 0; 

Vi trenger en metode som øker antall poeng spilleren har hver gang de ødelegger en blokk. Opprett en ny metode som heter addPoints å gjøre dette:

void addPoints (int poeng) playerPoints + = points; 

Nå har vi den nye metoden som forventer en verdi, men hvordan vil den motta den? Det er for mange blokker å gjøre referanser til spillerens padleobjekt i hver ...  

Den beste måten å løse dette på er å sende en melding fra blokkobjektet til padleobjektet. Hvordan gjør vi det? Vel, først må du merke padlen (Hierarki> Inspector> Tag) med Spiller stikkord.


Med padlen merket, er det på tide å flytte til blokkskriptet, der vi vil endre metoden OnCollisionEnter2D å sende poengene til spillerobjektet: før blokken ødelegges, søker vi etter et spillobjekt med Spiller tag ved hjelp av FindGameObjectsWithTag metode; Dette vil returnere en rekke matchende objekter, siden det bare er ett objekt med den taggen, vet vi at objektet i posisjon 0 av den returnerte arenaen er spillerens padleobjekt.

Nå som du har din spillerreferanse, kan du sende den en melding ved hjelp av Sende melding metode. Med dette kan du ringe en bestemt metode for spilleren objektet - i dette tilfellet, addPoints metode. 

Neste utdrag viser hvordan alt dette fungerer:

void OnCollisionEnter2D (Collision2D kollisjon) if (collision.gameObject.tag == "Ball") numberOfHits ++; hvis (numberOfHits == hitsToKill) // få referanse til spilleren objekt GameObject player = GameObject.FindGameObjectsWithTag ("Player") [0]; // send melding player.SendMessage ("addPoints", poeng); // ødelegge objektet Destroy (this.gameObject); 

Den neste tingen vi må gjøre er å redigere Prefabs og gi spesifikke poengverdier til hver blokktype. Du kan bruke følgende verdier:

  • Blå: 10 poeng;
  • Grønn: 20 poeng;
  • Gul: 35 poeng;
  • Rød: 50 poeng;

La oss nå vise disse punktene og leve i spillgrensesnittet. I spillerens skript, opprett en metode som kalles OnGUI. Denne metoden vil presentere GUI for spillet ditt; Det er en av de grunnleggende metodene for å presentere informasjon i spillområdet. (Merk de bokstavsfølsomme tegnene).

For å presentere poeng og liv, må vi opprette en Merkelapp med ønsket tekst. I PlayerScript, Legg til OnGUI metode, og opprett denne etiketten i den:

ugyldig OnGUI () GUI.Label (ny Rect (5.0f, 3.0f, 200.0f, 200.0f), "Live's:" + playerLives + "Score:" + playerPoints); 

Du kan nå Spille Spillet og etiketten vil bli presentert øverst til venstre på skjermen. Men du har ennå ikke programmert liv og poengvisning for å oppdatere tilsvarende! 

Bruke det samme PlayerScript, legg til følgende TakeLife metode. Metoden vil bare trekke ett liv fra spilleren bassenget hver gang det kalles:

void TakeLife () playerLives--; 

Endelig flytter du til BallScript, og i delen der du sjekker om ballen har falt av skjermen, send en melding til spillerobjektet med TakeLife metode. Den komplette koden er presentert nedenfor:

// Sjekk om ballen faller hvis (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"); 

Spill spillet ditt og kontroller at poengsum og livssystem fungerer som forventet.

Neste gang

Dette avslutter det tredje innlegget i serien. Den grunnleggende spillmekanikken er på plass, så neste gang legger vi til lyd og nye nivåer, og distribuerer det ferdige spillet.

Hvis du har spørsmål eller tilbakemelding på hva vi har dekket så langt, vær så snill å legge igjen en kommentar nedenfor.