Culture Geek

Je code, tu codes… vous codez ? #5

Je code, tu codes… vous codez ? #5

Création d’un ennemi et code de la santé

 

Bonjour à toutes et à tous, et bienvenue dans cette nouvelle série d’articles qui traitera – en long, large et autres travers – de la programmation, et puisque nous sommes sur Cleek, nous parlerons bien entendu ici de l’art geek dans toute sa splendeur : le jeu vidéo et les étapes nécessaires pour créer le vôtre de A à Z !

Non, non, ne fuyez pas tout de suite, rassurez-vous, le développement de logiciels n’est en aucun cas, contrairement à certaines idées reçues, une affaire d’intellos reclus et monomaniaques ! En effet, quelques cuillères à soupe de logique, une ou deux onces de patience ainsi que quelques grammes de curiosité sont les seuls ingrédients requis pour développer la base d’un jeu vidéo.

Comme annoncé la semaine dernière, nous allons aujourd’hui nous intéresser à la création d’ennemis pour notre Nyan-Cat. Plusieurs d’étapes sont nécessaires à cela, le point principal de ce tutoriel sera la fabrication du « prefab », un sprite auquel nous ajouterons tout un tas de propriétés avant de l’enregistrer pour le faire apparaître grâce à un « spawner ».

 

 

Le physique, c’est important

 

Pour commencer, trouvez une petite image de vaisseau spatial bien pixellisée (quand on essaye de taper dans le old-school, il faut s’assumer un minimum) ou utilisez celle du tutoriel.

 

 

cleek_image_prog5_littleSpaceship

 

Ajoutez cette image à votre dossier « sprites » dans votre projet, et depuis ce dossier, glissez votre nouveau vaisseau dans la Hierarchy : cela va créer un nouvel objet sur votre scène. Renommez le en « EnnemiPrefab » et modifiez son échelle (« Scale ») pour qu’il soit un peu plus gros sur l’écran.

 

cleek_image_prog5_1

Dans notre projet, l’échelle idéale serait de 2 pour notre petit vaisseau, en X et en Y

 

Sans désélectionner notre objet, toujours dans l’Inspector, cliquez sur « Add component » : nous allons farfouiller dans l’option « Physics ».

En premier lieu, ajoutons un objet « Rigidbody », et décochons la case « Use gravity » de ce composant. Ensuite, nous allons gérer la collision de ce vaisseau. Au vu de sa forme un peu particulière (ce n’est ni une sphère, ni un ovale, ni un rectangle…), nous pouvons simplement utiliser deux composants « Box collider » que nous arrangerons, le premier sur les ailes et le second sur le corps du vaisseau. N’oubliez pas de cocher l’option « Is trigger » pour les deux collider, ce qui nous permettra d’utiliser une méthode spéciale pour gérer la collision dans les scripts.

 

cleek_image_prog5_3

Petite astuce un peu malhonnête, le double collider !

 

Ces deux éléments (les deux « Box collider » comptent pour un seul) vont nous permettre de jouer avec la physique de notre ennemi. Notre principal souci sera de savoir quand il reçoit un projectile de notre héros ou lorsqu’il touche notre Nyan-Cat pour tuer ce dernier (Ô malheur !).

 

C’est une bonne situation ça, script ?

 

Vous savez, moi je ne crois pas qu’il y ait de bons ou mauvais scripts… pour commencer simplement, ajoutons simplement notre script « FreeObject » (qui permet de supprimer les objets une fois qu’ils sont sortis de l’écran, afin de ne point saturer la mémoire) à notre ennemi, soit en le glissant dans les composants, soit en cliquant sur « Add component », puis « Scripts », ce qui va lister tous les scripts que nous avons déjà créés : choisissez alors celui qui nous intéresse. Une petite modification s’impose néanmoins dans ce script, ouvrons-le dans Monodevelop et recopiez le code de l’image ci-dessous (nous verrons plus tard en quoi cette modification est importante), sauvez les modifications, et cochez la nouvelle option « IsEnnemi » qui est apparue sur la description du script dans l’Inspector.

 

cleek_image_prog5_4

 

Maintenant, le mouvement de notre ennemi, qui devra respecter les règles suivantes :

  • aller de la droite vers la gauche (horizontalement parlant, sur l’axe… X !)
  • éventuellement, nous pouvons ajouter un mouvement sur l’axe vertical, et notre petit vaisseau ennemi rebondira sur les bords haut et bas de l’écran

 

Créons donc un nouveau script que nous baptiserons « MoveEnnemi » et ouvrons-le, puis copiez le code suivant que nous allons détailler ensemble.

 

cleek_image_prog5_5

 

  • les variables déclarées en « public » le sont afin que nous puissions modifier leur valeur une fois dans Unity
  • SpeedX et SpeedY (des nombres à virgules, donc des « float ») définissent les vitesses horizontales et verticales du vaisseau
  • topLimit et botLimit servent à préciser les limites verticales à ne pas franchir pour le vaisseau (voir plus bas dans le code, nous les associons à la fonction « Mathf.Clamp() », souvenez-vous du dernier tutoriel)
  • sens est un simple chiffre, qui nous servira de multiplicateur, s’il est positif, le vaisseau monte (on augmente la position.y), s’il est négatif, le vaisseau descend (on diminue la position.y)
  • newPosition (un objet « Vector3 »,  composé de trois coordonnées : x, y et z) sert juste à calculer la nouvelle position du vaisseau dans chaque « Update() ».

 

Sauvegardez et associez ce nouveau script à notre vaisseau ennemi (en glissant le script ou grâce au bouton « Add component » de l’Inspector).

Vous pouvez tester tout ça (le bouton Play de Unity, vous devriez commencer à le connaître celui-là) avant de passer à la suite.

 

Jesus Hanz Hubert Vorm

 

Le dernier point de la journée sera notre préoccupation de la santé de tout ce  beau petit monde : Nyan-Cat en premier lieu, mais aussi ses ennemis et plus bizarre encore, chacun des shoot se verra associer cette notion de « points de vie ».

Créons un nouveau script, appellons-le « GestionSante ». Direction Monodevelop et copions ce code :

 

cleek_image_prog5_6

 

Creusons un peu ce morceau de code :

  • IsEnnemi, un booléen (une variable dont la valeur est soit « True », soit « False ») qui nous permet d’associer à chaque objet du jeu un « camp » (ennemi ou non)
  • Degats correspond aux dégâts que cause l’objet quand il entre en contact avec un autre
  • PointsDeVie représente la santé de l’objet, quand celle-ci atteint le chiffre fatidique de zéro, l’objet « meurt »… quelle tristesse décidément !
  • En associant ce script à chaque objet (Nyan-Cat, le prefab shoot et le EnnemiPrefab), chacun d’entre eux se verra associer ces trois variables, que nous pourrons modifier à loisir, dans la mesure où elles sont déclarées en « public »

 

La partie la plus compliquée de ce code (et la grosse nouveauté de la semaine) se trouve dans la ligne suivante :

other.GetComponent<GestionSante>().Degats

  • « other » correspond à l’objet avec lequel on entre en collision
  • « GetComponent<>() » nous permet d’aller chercher n’importe quel composant associé à cet objet « other ». Son paramètre entre crochets (« GestionSante » dans notre cas) est le nom du script auquel nous souhaitons accéder
  • le dernier terme, ici « Degats » après le symbole « . » est en fait une des variables publiques du script « GestionSante », nous pouvons ainsi aller chercher toutes les variables publiques de cette manière, « IsEnnemi » ou encore « PointsDeVie » si nous le décidons.

 

Une petite sauvegarde du script, et associons-le à nos trois principaux objets (Nyan-Cat, shoot qui se trouve dans le dossier « prefabs », et notre EnnemiPrefab dans la Hierarchy). Pour le Nyan-Cat ainsi que pour le shoot, laissons IsEnnemi décoché. Pour EnnemiPrefab, grosse surprise : cochons ! (aucun rapport avec le porcin, rassurez-vous)

Dernière modification pour que tout cela fonctionne à merveille : nous allons ajouter quelques composants à notre Nyan-Cat pour gérer sa physique, de la même manière que pour EnnemiPrefab.

Ajoutons donc un « Rigidbody » dont nous décocherons l’option « Use gravity ».

Pour gérer la collision, un « Box collider » devrait parfaitement convenir à notre matou, adaptons la boîte de collision à la forme du Nyan-Cat grâce au bouton « Edit collider » comme sur l’illustration suivante :

 

cleek_image_prog5_7

 

Vous pouvez maintenant glisser votre EnnemiPrefab dans le dossier « prefabs » de votre projet, sauvegardant ainsi tout notre travail pour un usage ultérieur.

Voilà, nous en avons terminé pour aujourd’hui ! N’hésitez pas à jouer avec les différentes variables publiques des différents scripts sur lesquels nous avons travaillé, cela vous permettra de mieux appréhender leur impact sur le jeu. La semaine prochaine, nous commencerons le « spawner » qui servira à faire apparaître des ennemis à intervalles réguliers.

 

 

Culture Geek
Plus Culture Geek