Costruisci Arkanoid con Unity Block Mechanics, Prefabs e Level Design

Cosa starai creando

In questa serie di tutorial, ti mostreremo come ricreare il classico gioco Arkanoid (o Breakout) in Unity, utilizzando gli strumenti 2D nativi di Unity. In ogni post, ci concentreremo su una parte specifica del gioco; in questo post gestiremo la meccanica dei blocchi e la creazione di prefabbricati.

Da dove siamo partiti

Nelle esercitazioni precedenti, hai impostato il progetto e codificato i comportamenti della pagaia e della palla. Se non hai ancora completato i tutorial precedenti, ti consigliamo vivamente di farlo prima di continuare.

Anteprima finale

Dai un'occhiata a questa demo per vedere a cosa miriamo per l'intera serie:

Ed ecco cosa avremo alla fine di questo post:

Creazione dello script di blocco

Al momento, quasi tutte le meccaniche di base sono pronte. La parte mancante è correlata all'oggetto del blocco. Poiché i blocchi sono una parte importante e attiva del gioco, dobbiamo creare uno script personalizzato per questo. 

Lo script di blocco deve contenere informazioni riguardanti:

  • Colpi totali che può gestire.
  • Punti da assegnare alla rottura.

(Nota che il numero di colpi e punti può cambiare in base al colore del blocco.) Sulla base di questo, diamo al blocco tre variabili:

  • Una variabile per memorizzare il numero di colpi che il blocco può richiedere.
  • Una variabile per memorizzare il valore del punteggio del blocco.
  • Una variabile per memorizzare il numero di volte che il blocco ha già stato colpito.

I primi due saranno pubblico, dato che potresti voler modificare i loro valori nell'editor. Il terzo sarà privato, poiché è solo per uso interno. 

Quindi, crea un nuovo script chiamato BlockScript. Definire quelle variabili e inizializzare il numero di colpi a 0:

classe pubblica BlockScript: MonoBehaviour public int hitsToKill: public int points; private int numberOfHits; // Usa questo per l'inizializzazione void Start () numberOfHits = 0;  // L'aggiornamento viene chiamato una volta per frame void Update () 

Il prossimo passo è rilevare quando le palline colpiscono un blocco. Quando si verifica questa collisione, controlliamo se il blocco è stato colpito abbastanza volte da essere distrutto o se è ancora intatto. Per questo, possiamo usare un metodo specifico chiamato OnCollisionEnter2D, che viene chiamato ogni volta che si verifica una collisione sul tuo oggetto.

Per verificare se questa collisione è tra la palla e il blocco, dobbiamo etichetta l'oggetto palla. Nell'editor, seleziona la palla dal Gerarchia scheda e poi il Ispettore. Sulla cima del Ispettore, proprio sotto il nome dell'oggetto del gioco, c'è un campo chiamato Etichetta che è attualmente definito come Senza tag. Fai clic sul pulsante e apparirà un menu a discesa con le diverse possibilità di tag:

Vogliamo un tag specifico per la palla, quindi colpisci Aggiungi Tag per creare un nuovo tag. Dopo aver premuto l'opzione appare una nuova interfaccia:

Per questo tutorial, ci concentreremo solo su Elemento 0 proprietà. Questo definisce il nome del tag, quindi digita il nome Palla dentro.

Ora che hai il nuovo Palla tag, cambia il tag dell'oggetto palla Palla.


Apri il BlockScript file in modo che possiamo codificare il OnCollisionEnter2D metodo. Per identificare l'oggetto del gioco della palla, controlla se il tag dell'oggetto del gioco è Palla; se è così, allora la collisione era tra il blocco e la palla. Aggiungi il seguente codice al tuo script.

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

Ora puoi rilevare le collisioni con la palla. Ad ogni collisione, vogliamo aumentare il numero di volte in cui il blocco viene colpito e, se il numero di volte in cui il blocco viene colpito è uguale al numero massimo di colpi che il blocco può prendere, distruggi il blocco. Per quest'ultimo, possiamo usare il metodo Destroy.

 L'aggiornato OnCollisionEnter2D per fare questo sembra il seguente:

 void OnCollisionEnter2D (Collision2D collision) if (collision.gameObject.tag == "Ball") numberOfHits ++; if (numberOfHits == hitsToKill) // distrugge l'oggetto Destroy (this.gameObject); 

Ora aggiungi il BlockScript al Palla oggetto (Gerarchia> Impostazioni> Aggiungi componente):

Ora è il momento di verificare che tutto vada bene. Cambiare il Colpi da uccidere valore nell'editor a 1 e Giocare il gioco. Quando la palla ha colpito il blocco, il blocco dovrebbe scomparire.

Creare un prefabbricato

Ora che le meccaniche di blocco sono pronte, compileremo il livello. Dato che userete diversi blocchi per questo, questo è un buon momento per presentare Unity prefabbricati

A Prefab è un oggetto di gioco riutilizzabile che può essere inserito più volte nella stessa scena. Fondamentalmente, questo significa che se vuoi, per esempio, cambiare il valore dei punti dei blocchi blu, non devi farlo per ogni singolo blocco blu sulla scena: se hai un Prefabbricato di un blocco blu, basta regolare il valore Prefab e tutti i blocchi sulla scena verranno aggiornati.

Per creare un prefabbricato per i blocchi blu, iniziare rinominando il Bloccare oggetto a Blue Block. Quindi, crea una nuova cartella in Risorse cartella chiamata prefabbricati. Ora trascina il Blocchi blu oggetto all'interno della nuova cartella.

Come avrai notato, l'icona del cubo in cima al Ispettore ora è blu. Inoltre, il nome dell'oggetto del gioco nella scena Gerarchia è anche blu. Ciò significa che il blocco ora è un prefabbricato. Abbastanza semplice, no? D'ora in poi, selezionando il Prefab e cambiando i suoi valori, si applicheranno tutte le modifiche apportate ai parametri di tutti i nostri blocchi blu.

Per testare il Prefab, trascinalo dalla cartella al nostro Gerarchia scheda. Come puoi vedere, ora abbiamo due blocchi blu, ma condividono la stessa posizione, che è stata definita dal Prefab.

Per avere i due blocchi in posizioni diverse, basta selezionarne uno da Gerarchia scheda e spostarlo nella scena. In questo modo, si modificano i valori di quella copia specifica del blocco e non tutti i blocchi.

Puoi Giocare il gioco e prova i prefabbricati.

Ricostruzione di prefabbricati

Ora creerai le restanti prefabbricate per gli altri blocchi (verde, giallo e rosso). I passaggi principali per ognuno sono:

  1. Crea un nuovo Sprite.
  2. Aggiungi l'immagine corrispondente.
  3. Aggiungi un box Collider 2D.
  4. Aggiungi il BlockScript.
  5. Chiamalo di conseguenza.
  6. Crea un prefabbricato.

Alla fine dovresti avere quattro diversi prefabbricati (uno per ogni tipo di blocco):

Per rendere il gameplay più interessante, cambia il Colpi da uccidere per ogni tipo di blocco in questo modo:

  • Blu: 1 colpire.
  • Verde: 2 colpi.
  • Giallo: 3 colpi.
  • Rosso: 4 colpi.

Aggiungi alcuni blocchi e Giocare il gioco; controlla che tutto funzioni come previsto.

Livello Design

È giunto il momento di creare il tuo primo livello. Usando le prefabbricate, popola l'area di gioco con diversi blocchi. Se hai piazzato tanti blocchi quanti ne abbiamo, il tuo Gerarchia la scheda è probabilmente sovrappopolata con oggetti di gioco a blocchi! Per mantenere il tuo progetto ben organizzato, creiamo oggetti di gioco vuoti per i quattro tipi di blocchi, quindi raggruppiamo i blocchi per colore:

A questo punto, il tuo gioco è quasi pronto, i tuoi meccanismi di base sono implementati e dovrebbe apparire simile alla figura seguente:

Score and Lives System

Il punteggio e il sistema vita sono un modo per testare i giocatori e introdurre nuove dinamiche nei giochi. A questo punto, il tuo gioco non ha alcun modo per i giocatori di progredire o perdere. Cambiamo ora. 

Apri il PlayerScript e aggiungi due variabili: una per il punteggio e una per il numero di vite del giocatore. Lasceremo che il giocatore inizi la partita con tre vite e nessun punto:

player int privatoLives; giocatori privati ​​intPunti; // Usa questo per l'inizializzazione void Start () // ottieni la posizione iniziale dell'oggetto di gioco playerPosition = gameObject.transform.position; playerLives = 3; playerPoints = 0; 

Abbiamo bisogno di un metodo che aumenti il ​​numero di punti che il giocatore ha ogni volta che distruggono un blocco. Crea un nuovo metodo chiamato addPoints per fare questo:

void addPoints (int points) playerPoints + = points; 

Ora abbiamo il nuovo metodo che si aspetta un valore, ma come lo riceverà? Ci sono troppi blocchi per fare riferimenti all'oggetto paddle del giocatore in ogni ...  

Il modo migliore per risolvere questo è inviare un messaggio dall'oggetto del blocco all'oggetto paddle. Come lo facciamo? Bene, per prima cosa devi taggare la pagaia (Gerarchia> Impostazioni> Tag) con il Giocatore etichetta.


Con la paddle taggata, è tempo di passare allo script del blocco, dove cambieremo il metodo OnCollisionEnter2D per inviare i punti all'oggetto giocatore: prima che il blocco venga distrutto, cercheremo un oggetto di gioco con il Giocatore tag usando il FindGameObjectsWithTag metodo; questo restituirà un array di oggetti corrispondenti, poiché c'è un solo oggetto con quel tag, sappiamo che l'oggetto nella posizione 0 dell'array restituito è l'oggetto paddle del giocatore.

Ora che hai il riferimento del tuo giocatore, puoi mandargli un messaggio usando il Invia messaggio metodo. Con questo, puoi chiamare un metodo specifico dell'oggetto giocatore - in questo caso, il addPoints metodo. 

Il frammento successivo mostra come funziona tutto questo:

void OnCollisionEnter2D (Collision2D collision) if (collision.gameObject.tag == "Ball") numberOfHits ++; if (numberOfHits == hitsToKill) // ottiene riferimento dell'oggetto giocatore GameObject player = GameObject.FindGameObjectsWithTag ("Player") [0]; // invia messaggio player.SendMessage ("addPoints", points); // distrugge l'oggetto Destroy (this.gameObject); 

La prossima cosa che dobbiamo fare è modificare i prefabbricati e fornire valori puntuali specifici per ogni tipo di blocco. È possibile utilizzare i seguenti valori:

  • Blu: 10 punti;
  • Verde: 20 punti;
  • Giallo: 35 punti;
  • Rosso: 50 punti;

Ora mostriamo questi punti e vite nell'interfaccia di gioco. Nello script del giocatore, crea un metodo chiamato OnGUI. Questo metodo presenterà la GUI del tuo gioco; è uno dei metodi di base per presentare le informazioni nell'area di gioco. (Nota i caratteri sensibili al maiuscolo / minuscolo).

Per presentare i punti e le vite, dobbiamo creare un Etichetta con il testo desiderato. Nel PlayerScript, Aggiungi il OnGUI metodo e crea questa etichetta in esso:

void OnGUI () GUI.Label (new Rect (5.0f, 3.0f, 200.0f, 200.0f), "Live's:" + playerLives + "Punteggio:" + playerPoints); 

Tu puoi ora Giocare il gioco e l'etichetta saranno presentati nella parte in alto a sinistra dello schermo. Tuttavia, non hai ancora programmato la visualizzazione delle vite e dei punti per aggiornare di conseguenza! 

Usando lo stesso PlayerScript, aggiungi il seguente TakeLife metodo. Il metodo sottrarrà una sola vita dal pool di giocatori ogni volta che viene chiamato:

void TakeLife () playerLives--; 

Infine, passa al BallScript, e, nella sezione in cui si controlla se la palla è caduta dallo schermo, inviare un messaggio all'oggetto giocatore con il tasto TakeLife metodo. Lo snippet completo è presentato di seguito:

// Controlla se la palla cade se (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"); 

Gioca al tuo gioco e verifica che il punteggio e il sistema di vita funzioni come previsto.

La prossima volta

Questo conclude il terzo post della serie. Le meccaniche di base del gioco sono tutte a posto, quindi la prossima volta aggiungeremo audio e nuovi livelli e implementeremo il gioco finito.

Se hai domande o commenti su ciò che abbiamo trattato finora, sentiti libero di lasciare un commento qui sotto.