Afin de refaire un tour dans les fonctions d’Unity et avec l’espoir de finir un prototype conséquent de gameplay, je m’attaque cette fois à une logique relativement simple, le tower defense. Parce que j’ai toujours du mal à rester simple, ce dernier contiendra du PvP, et un peu de gestion.
Le gameplay rapidement:
- Au moins deux équipes qui s’affrontent
- Un cycle jour/nuit. Les vagues partent à l’aube. Une vague de monstre peu démarrer durant la nuit. Durant la nuit les unités n’avancent plus (ou peut-être dans des zones particulières) et ne font que se défendre
- Les unités ont une sorte de mana qui limite leurs actions chaque jour, et est régénéré durant la phase de sommeil nocturne. Si durant la nuit ils sont attaqués alors ils sont plus faible le lendemain. Ils peuvent se défendre sans mana mais sont moins efficace et/ou peut-être perdraient-ils de la vie.
- Les joueurs placent leurs bâtiments et configurent leur vagues
- Le premier à détruire le QG ennemi gagne
C’est donc parti pour ce nouveau prototype de gameplay ! Et cette fois, pour la première fois, je vous raconte comment je procède.
Il faut bien commencer par quelque chose, c’est donc la base du gameplay qui est attaquée. On va faire un petit brouillon de la logique de base, nous aurons donc une unité simple et un quartier général (QG). Pour la logique, l’unité à sa création ( Start() ) cherchera le QG ennemi le plus proche, et cherchera à l’atteindre.
Ok maintenant que nous avons cette unité simple qui cherche à atteindre le quartier général ennemi, nous allons faire en sorte que chaque QG fasse apparaître des unités.
Pour travailler avec des composants de façon à séparer et réutiliser facilement les scripts, nous allons sortir dès maintenant le script de spawn du Headquarter. Ceci car nous avons prévu la possibilité de placer plusieurs points de création d’unité sur la carte. Cependant la vague sera gérée à un seul endroit, les spawn n’étant que des “slots” disponibles à chaque tick.
Le générateur d’unité va donc gérer le type d’unité qu’il peut instancier, le nombre en un tick, et la position des apparitions. On l’appellera de la façon suivante UnitSpawner.Spawn(GameObject[] unitPrefabs)
, et il se chargera de faire apparaître les unités correctement.
Maintenant que les unités cherchent et atteignent le QG ennemi, il est temps que chacun attaque et se défende. Nous allons commencer par ajouter la notion de PV aux unités et bâtiments, puis la notion d’attaque. On peut dès maintenant observer qu’il y a des propriétés communes sur les unités et les bâtiments, et tout de suite créer une class abstraite d’où les objets d’équipe hériterons.
La notion de PV est très simple pour l’instant, des points de vie maximum et courant, ainsi qu’une fonction AddDamage(float power)
avec laquelle les ennemis pourront frapper.
Ensuite, je commence par l’attaque du QG. Elle est très sommaire pour l’instant. Le QG a une puissance, une cadence, une distance et un mask de tir, ainsi qu’une cible. Si il n’y a pas de cible, on en cherche une. Une fois une cible trouvée on commence une coroutine d’attaque qui cessera à la destruction de l’ennemi ou lorsque la cible sortira du rayon de tir.
Par simple héritage, l’attaque étant la même pour l’instant, il va être possible en déplaçant le script de coroutine dans la classe commune de rendre ces pauvres petites unités agressives. Ensuite il suffit de gérer l’arrêt des unités lorsqu’elles attaquent, et le redémarrage de leur marche une fois la cible vaincue.
Il s’agit bien d’un tower defense à la base. Il est donc temps de créer des tours ! Le code est déjà là avec les QG, il n’y a qu’a factoriser tout ça et nous aurons un début de tour rapidement.
Avec les paramètres de puissance de tir, de distance et de cadence il est déjà possible d’avoir plusieurs types de tours. Ci dessous par exemple je paramètre 3 tours :
- (Cylindre) Classique / Mitrailleuse, elle tir avec une bonne cadence et fait des dégâts moyens
- (Cube) Laser, elle a une très grosse cadence pour une puissance et portée plus faible
- (Sphere) Sniper, elle a une cadence très faible mais tue presque du premier coup une unité et a une portée très large
Voilà qui pose une base sympatique pour ce tower defense. Dans la prochaine partie je m’attaquerais à la carte, à l’influence du terrain sur le pathfinding et au placement de tours et bâtiments par le joueur. Pour cela les NavMeshComponents feront gagner du temps avec le nouveau baking à la volée.
To be continue…