Construisez Arkanoid avec Unity Mécanique de bloc, préfabrication et conception de niveau

Ce que vous allez créer

Dans cette série de didacticiels, nous allons vous montrer comment recréer le jeu classique Arkanoid (ou Breakout) dans Unity, à l'aide des outils 2D natifs de Unity. Dans chaque article, nous nous concentrerons sur une partie spécifique du jeu; dans ce post, nous allons gérer la mécanique des blocs et la création de Prefabs.

Où nous nous sommes laissés

Dans les tutoriels précédents, vous avez configuré le projet et codé les comportements de la raquette et de la balle. Si vous n'avez pas encore terminé les tutoriels précédents, nous vous recommandons fortement de le faire avant de continuer..

Aperçu final

Jetez un coup d'oeil à cette démo pour voir ce que nous visons dans toute la série:

Et voici ce que nous aurons à la fin de ce post:

Création du script de blocage

À l'heure actuelle, presque tous les mécaniciens de base sont prêts. La partie manquante est liée à l'objet bloc. Puisque les blocs sont une partie importante et active du jeu, nous devons créer un script personnalisé pour cela.. 

Le script de blocage doit contenir des informations concernant:

  • Total de coups qu'il peut gérer.
  • Points à attribuer à la rupture.

(Notez que le nombre de résultats et de points peut changer en fonction de la couleur du bloc.) Sur cette base, donnons au bloc trois variables:

  • Une variable pour stocker le nombre de hits que le bloc peut prendre.
  • Une variable pour stocker la valeur du score du bloc.
  • Une variable pour stocker le nombre de fois que le bloc a déjà été touché.

Les deux premiers seront Publique, puisque vous voudrez peut-être modifier leurs valeurs dans l'éditeur. Le troisième sera privé, puisque c'est pour usage interne seulement. 

Ainsi, créez un nouveau script appelé BlockScript. Définissez ces variables et initialisez le nombre de résultats à 0:

Classe publique BlockScript: MonoBehaviour public int hitsToKill: public int points; private int numberOfHits; // Utilisez ceci pour l'initialisation void Start () numberOfHits = 0;  // La mise à jour est appelée une fois par image. Void Update () 

L'étape suivante consiste à détecter le moment où les billes frappent un bloc. Lorsque cette collision se produit, nous vérifions si le bloc a été touché suffisamment de fois pour être détruit ou s'il est toujours intact. Pour cela, nous pouvons utiliser une méthode spécifique appelée OnCollisionEnter2D, qui est appelé chaque fois qu'une collision survient avec votre objet.

Pour vérifier si cette collision est entre le ballon et le bloc, il faut étiquette l'objet balle. Dans l'éditeur, sélectionnez la balle dans la liste. Hiérarchie onglet puis le Inspecteur. Sur le dessus de la Inspecteur, juste sous le nom de l'objet du jeu, il y a un champ appelé Étiquette qui est actuellement défini comme Non étiqueté. Cliquez sur le bouton et un menu déroulant apparaîtra avec les différentes possibilités de tag:

Nous voulons une étiquette spécifique pour le ballon, alors frappez Ajouter une étiquette pour créer une nouvelle étiquette. Une fois que vous avez appuyé sur l'option, une nouvelle interface apparaît:

Pour ce tutoriel, nous ne nous concentrerons que sur les Élément 0 propriété. Ceci définit le nom de la balise, tapez donc le nom Ballon dans ça.

Maintenant que vous avez le nouveau Ballon tag, change le tag de l'objet ball en Ballon.


Ouvrez le BlockScript déposer afin que nous puissions coder le OnCollisionEnter2D méthode. Pour identifier l'objet de jeu de balle, vérifiez si la balise d'objet de jeu est Ballon; Si c'est le cas, la collision a eu lieu entre le bloc et la balle. Ajoutez le code suivant à votre script.

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

Vous pouvez maintenant détecter les collisions avec le ballon. À chaque collision, nous souhaitons augmenter le nombre de fois où le bloc a été touché et, si le nombre de fois où le bloc est touché est identique au nombre maximal de coups que le bloc peut subir, détruisez le bloc. Pour ce dernier, nous pouvons utiliser la méthode Destroy.

 La mise à jour OnCollisionEnter2D faire cela ressemble à ce qui suit:

 void OnCollisionEnter2D (Collision2D collision) if (collision.gameObject.tag == "Ball") numberOfHits ++; if (numberOfHits == hitsToKill) // détruit l'objet Destroy (this.gameObject); 

Maintenant, ajoutez le BlockScript au Ballon objet (Hiérarchie> Inspecteur> Ajouter un composant):

Il est maintenant temps de vérifier que tout va bien. Changer la Frappe à tuer valeur dans l'éditeur de 1 et Jouer le jeu. Lorsque la balle frappe le bloc, le bloc devrait disparaître.

Créer un prefab

Maintenant que les mécanismes de bloc sont prêts, nous allons peupler le niveau. Puisque vous utiliserez plusieurs blocs pour cela, c’est le bon moment pour présenter le programme Unity. Préfabriqués

Un préfabriqué est un objet de jeu réutilisable qui peut être inséré plusieurs fois dans la même scène. En gros, cela signifie que si vous souhaitez, par exemple, modifier la valeur des points des blocs bleus, vous n'avez pas à le faire pour tous les blocs bleus de la scène: si vous avez un préfab du bloc bleu, vous ajustez simplement la valeur Prefab et tous les blocs de la scène seront mis à jour.

Pour créer un prefab pour les blocs bleus, commencez par renommer le nom Bloc objecter à Blue Block. Ensuite, créez un nouveau dossier dans le Les atouts dossier appelé Préfabriqués. Maintenant, faites glisser le Blocs Bleus objet dans le nouveau dossier.

Comme vous l'avez peut-être remarqué, l'icône du cube en haut de l'écran Inspecteur est maintenant bleu. En outre, le nom de l'objet de jeu dans la scène Hiérarchie est aussi bleu. Cela signifie que le bloc est maintenant un Prefab. Assez simple, n'est-ce pas? Désormais, la sélection du préfabriqué et la modification de ses valeurs appliqueront toutes les modifications apportées aux paramètres de tous nos blocs bleus..

Pour tester le préfabriqué, faites-le glisser du dossier vers notre dossier. Hiérarchie languette. Comme vous pouvez le constater, nous avons maintenant deux blocs bleus, mais ils partagent la même position, définie par le préfab..

Pour que les deux blocs occupent des positions différentes, il suffit de sélectionner l'un d'entre eux dans la liste. Hiérarchie onglet et déplacez-le autour de la scène. De cette façon, vous modifiez les valeurs de cette copie spécifique du bloc et non de tous les blocs.

Vous pouvez Jouer le jeu et tester les prefabs.

Recréer des préfabriqués

Vous allez maintenant créer les préfabriqués restants pour les autres blocs (vert, jaune et rouge). Les principales étapes pour chacune d’elles sont:

  1. Créer un nouveau Sprite.
  2. Ajouter l'image correspondante.
  3. Ajouter un Box Collider 2D.
  4. Ajouter le BlockScript.
  5. Nommez-le en conséquence.
  6. Créer un prefab.

Au final, vous devriez avoir quatre préfabriqués différents (un pour chaque type de bloc):

Pour rendre le jeu plus intéressant, changez le Frappe à tuer pour chaque type de bloc comme suit:

  • Bleu: 1 frappé.
  • Vert: 2 les coups.
  • Jaune: 3 les coups.
  • Rouge: 4 les coups.

Ajouter des blocs et Jouer le jeu; vérifier que tout fonctionne comme prévu.

Niveau Design

Il est maintenant temps de créer votre premier niveau. En utilisant les Prefabs, remplissez la zone de jeu avec plusieurs blocs. Si vous avez placé autant de blocs que nous, votre Hiérarchie Onglet est probablement surpeuplé avec des objets de jeu de bloc! Afin de garder votre projet bien organisé, créons des objets de jeu vides pour les quatre types de blocs, puis regroupons les blocs par couleur:

À ce stade, votre jeu est presque prêt, vos mécanismes de base sont mis en œuvre et il devrait ressembler à la figure suivante:

Système de score et de vies

Le système de score et de vie est un moyen de tester les joueurs et d’introduire de nouvelles dynamiques dans les jeux. À ce stade, votre jeu ne permet aux joueurs de progresser ou de perdre. Changeons cela maintenant. 

Ouvrez le PlayerScript et ajoutez deux variables: une pour le score et une pour le nombre de vies du joueur. Nous allons laisser le joueur commencer le jeu avec trois vies et aucun point:

int playerLives privé; private int playerPoints; // Utilisez ceci pour l'initialisation void Start () // récupère la position initiale de l'objet de jeu playerPosition = gameObject.transform.position; playerLives = 3; playerPoints = 0; 

Nous avons besoin d'une méthode qui augmente le nombre de points que le joueur a à chaque fois qu'il détruit un bloc. Créez une nouvelle méthode appelée addPoints pour faire ça:

void addPoints (points int) joueurPoints + = points; 

Nous avons maintenant la nouvelle méthode qui attend une valeur, mais comment va-t-elle la recevoir? Il y a trop de blocs pour faire référence à l'objet Paddle du joueur dans chacun…  

Le meilleur moyen de résoudre ce problème consiste à envoyer un message de l'objet block à l'objet paddle. Comment on fait ça? Eh bien, vous devez d’abord taguer la pagaie (Hiérarchie> Inspecteur> Tag) avec le Joueur étiquette.


Avec la balise taguée, il est temps de passer au script de bloc, où nous allons changer la méthode OnCollisionEnter2D pour envoyer les points à l’objet joueur: avant que le bloc ne soit détruit, nous rechercherons un objet de jeu avec le Joueur tag en utilisant le FindGameObjectsWithTag méthode; cela retournera un tableau d'objet correspondant, et comme il n'y a qu'un seul objet avec cette balise, nous savons que l'objet en position 0 du tableau retourné est l'objet paddle du joueur..

Maintenant que vous avez votre référence de joueur, vous pouvez lui envoyer un message en utilisant le bouton Envoyer le message méthode. Avec cela, vous pouvez appeler une méthode spécifique de l’objet player. Dans ce cas, le addPoints méthode. 

Le prochain extrait vous montre comment tout cela fonctionne:

void OnCollisionEnter2D (Collision2D collision) if (collision.gameObject.tag == "Ball") numberOfHits ++; if (numberOfHits == hitsToKill) // récupère la référence de l'objet joueur GameObject player = GameObject.FindGameObjectsWithTag ("Player") [0]; // envoi du message player.SendMessage ("addPoints", points); // détruit l'objet Destroy (this.gameObject); 

Nous devons ensuite éditer les préfabriqués et attribuer des valeurs de points spécifiques à chaque type de bloc. Vous pouvez utiliser les valeurs suivantes:

  • Bleu: dix points;
  • Vert: 20 points;
  • Jaune: 35 points;
  • Rouge: 50 points;

Maintenant, montrons ces points et ces vies dans l'interface du jeu. Dans le script du lecteur, créez une méthode appelée OnGUI. Cette méthode présentera l'interface graphique de votre jeu. c'est l'une des méthodes de base pour présenter des informations dans le domaine des jeux. (Notez les caractères sensibles à la casse).

Pour présenter les points et les vies, nous devons créer un Étiquette avec le texte souhaité. dans le PlayerScript, ajouter le OnGUI méthode et créer cette étiquette dans celle-ci:

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

Tu peux maintenant Jouer le jeu et l'étiquette seront présentés dans la partie supérieure gauche de l'écran. Cependant, vous n'avez pas encore programmé l'affichage des vies et des points à mettre à jour en conséquence! 

En utilisant le même PlayerScript, ajouter ce qui suit TakeLife méthode. La méthode ne soustraira qu'une vie du groupe de joueurs à chaque appel:

TakeLife () vide () playerLives--; 

Enfin, passez à la BallScript, et, dans la section où vous vérifiez si la balle est tombée de l'écran, envoyez un message à l'objet joueur avec le TakeLife méthode. L'extrait complet est présenté ci-dessous:

// Vérifie si la balle tombe si (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"); 

Jouez à votre jeu et vérifiez que le système Score and Lives fonctionne comme prévu.

La prochaine fois

Ceci conclut le troisième article de la série. Les mécanismes de base du jeu sont tous en place, alors la prochaine fois, nous ajouterons de l'audio et de nouveaux niveaux et déploierons le jeu terminé.

Si vous avez des questions ou des commentaires sur ce que nous avons couvert jusqu'à présent, n'hésitez pas à laisser un commentaire ci-dessous.