Versus

Présentation

Ce projet intitulé : "Versus(jeux vidéos)" a été réalisé sur Unity et est un jeu du type Super Smash Bros, mettant en scène deux joueurs qui s’affrontent avec l’aide de différentes armes et pouvoirs. C’est mon premier projet de jeux vidéo en autonomie, et je suis pour l’instant très content du résultat. De plus j’ai fait certains assets moi même(pixel art, effet d’explosion, …).

Objectifs

Mes objectifs à travers ce projet étaient de :

Précision

Ayant beaucoup de choses à dire sur ce projet, je ne vais pas m’attarder à préciser le fonctionnement de chaque script. Je vais surtout parler de la manière dont j’ai voulu faire les choses et organiser le fonctionnement du jeu. De plus, ce jeu est destiné à évoluer, je compte ajouter un menu de démarrage, un bouton restart, etc. Ce qui, en soit, ne me prendrais pas beaucoup de temps, mais, j’ai préféré me tourner vers d’autres projets personnels (afin d’avancer dans mes formations) et professionnels.
Pour ce qui est des personnages, les scripts sont les mêmes pour les deux, je ne vais donc les expliquer que pour le joueur 1. Si vous voulez des précisions ou me contacter afin de parler de ce projet ou d’autres n’hésiter pas à m’envoyer un mail sur constantlescutprive2@gmail.com.

Personnage

Il y a donc 2 joueurs, l’un se contrôle avec le clavier souri et l’autre avec une manette (Système input Manager de Unity), le système de mouvement est assez classique : on applique une gravité et des translations en fonctions des inputs. Pour le saut on applique une force vers le haut (+y) et on permet un double saut, il faut donc retoucher le sol pour pouvoir sauter de nouveau, de plus on réduit notre variable de vitesse ( axe x ) lors du deuxième saut pour plus de réalisme. J’ai séparé ces fonctions en deux scripts : un pour l’input, et un pour le mouvement afin de suivre le design pattern de séparation des préoccupations (Separation of concerns)(SOC). Et, j’ai utilisé le design pattern Observer afin de les faires communiquer (système d’Event).
Pour les assets des personnages je les ai créés sur Aseprite ( Pixel Art ) et j’ai fait en sorte de produire plusieurs versions des personnages : sains, égratignés, blessés, gravement blessés, Afin d’ajuster leur design en fonction de leur vie. Le joueur 2 est simplement une version recolorisée en bleu du joueur 1. Au niveau des animations, le joueur vas clignoter en rouge lorsqu’il prendra des dégâts (période d’invulnérabilité) et émettra un son de douleur (cf. SFX).
Les joueurs ont donc tout deux 5 vies, Le but est de faire tomber son adversaire à 0. J’ai donc implémenté un design pattern Singleton, cela me permet de pouvoir modifier et observer la vie du joueur de n’importe quel autre script et de respecter le design pattern SOC. Sinon, il ne s’agit la que d’une simple variable à incrémenter ou décrémenter. Je vais également faire de ce singleton un Sujet (design pattern Observer) afin de pouvoir déclencher un événement “joueur mort” lorsque la vie tombe à 0. J’ai aussi implémenté une période d’invulnérabilité après la prise d’un dégâts.

Armes et Grenade

Le fusil d’assaut (asset récupéré sur le Unity Assets Store) suit le joueur grâce à un parentage simple et s’oriente en fonction du mouvement du joueur (+ ou - x). lorsque le joueur tire, le fusil lance une balle, émet un son de tire(cf. SFX) et fait trembler la caméra(cf. Game Feel). Le lancement de la balle est simplement un instanciation à laquelle on applique une force et qui se détruit lors du contact avec un joueur, un ennemie ou après un laps de temps de quelques secondes(optimisation). Ici j’aurais pu utiliser le design pattern Object Pool mais j’ai un peu de mal à le maitriser et j’ai faillit perdre mon projet en essayant de l’implémenter. On instancie également un petit effet de particules à la sortie du canon(système de particules de Unity). Pour le système de recharge j’ai simplement créé une variable “chargeur” qui se vide à chaque tirs et qui quand elle tombe à 0 déclenche la recharge. Pendant la recharge le joueur ne peut pas tirer, un son de rechargement(cf. SFX) est émit et une particule(douille qui sort du chargeur) est instanciée. J’ai limité la fréquence de tire lors d’un appuie continu sur l’input. Le joueur peut également utiliser un input afin de recharger à tout moment. On fait également la liaison avec l’UI (cf. UI).
L’épée ( création Pixel Art) est simplement comme le fusil parenté au joueur et s’oriente de la même façon. Le fait de pouvoir frapper est simplement une animation faite sur Unity et est déclenchée par input (ici elle fait une rotation autour d’un point de pivot). Elle émet un son (cf. SFX). J’ai également fait en sorte de limiter la frappe à un cycle complet d’animation.
J’ai également fait en sorte de pouvoir changer d’arme dynamiquement avec un input. en sachant que le joueur ne pourras pas le faire lors du rechargement du fusil.
La grenade (création Pixel Art) peut être jetée avec un input et explose au bout de quelques secondes. Le lancé fonctionne par instanciation et application d’une force relative au vecteur personnage —> curseur. Plus la distance entre le personnage et le curseur est grande plus elle sera tirée loin et elle aura un élan initial dirigé dans le sens et la direction de ce vecteur. Pour le joueur manette (P2) la grenade sera simplement tirée dans la direction du joystick joueur et avec une force constante. On utilise juste une projection de sphère pour savoir quels joueurs seront impactés par l’explosion. On leur applique également un effet de recul relatif au vecteur grenade —> joueur touché. Le tout, avec des SFX, et des effets VFX (particules d’explosions). J’ai finis par ajouter un système de minuteur afin de ne pas abuser du lancer de grenade ainsi qu’un effet de tremblement de caméra(cf. Game Feel).

Power Up

Dans un premier temps, je vais parler des items que l’on vas récupérer au sol afin d’activer le pouvoir. En implémentant un design pattern Factory, je vais créer l’item (pour l’alien : œuf d’alien, bouclier : un bouclier, etc) qui sera le produit, puis une usine pour celui-ci. Dans un script “Générateur d’items” je vais donc appeler ces usines de manière aléatoire ( sauf pour l’alien car plus rare) et je vais choisir un point de spawn aléatoirement.
Ensuite, en détectant le ramassage par le joueur et le type d’item on vas exécuter un effet et détruire l’item au sol : alien —> spawn de l’Alien, flamme —> génération bouclier de feu, bouclier —> bouclier, etc. On vas, évidemment, ne pas permettre le ramassage si le joueur possède déjà un pouvoir, sauf pour l’alien qui se contente d’apparaitre et d’attaquer le joueur adverse. Pour les items limités dans le temps, nous allons ajouter un minuteur et faire le lien sur l’UI. Les pouvoirs en eux même sont également implémentés à l’aide de design pattern Factory.

Evénements

J’ai également créer des événements, ils sont aussi implémentés grâce au design pattern Factory et sont déclenchés de manière aléatoire par un script. Ils implémentent également le design pattern Observer afin de communiquer sur leur apparition.
Le premier événement est la tornade (asset sur le Unity Assets Store), une tornade apparait se balade de droite à gauche et emporte les joueurs avec elle. Elle dure un certain temps avant de disparaître. Afin de faire ça, je génère simplement une force relative au vecteur cyclone—>joueur, donc plus le joueurs est proche du cyclone, plus il est attiré. Nous avons donc un rendu réaliste de tornade. J’ai également ajouté quelques SFX.
Le deuxième événement est le trou noir. Celui si se contente de faire pivoter la caméra sur elle même afin de faire un 360°. Les inputs eux ne changent pas, les joueurs sont donc perturbés et désorientés. J’ajoute également des effets visuels et des SFX. Un trou noirs apparait également en arrière plan (animation 2D en Pixel Art).

Environnement

Pour les tuiles, les arbres et les décorations, elles sont disponibles sur le Unity Assets Store et les points de lumières sont générés par le système de lumière de Unity. Le fond est une image de galaxie libre de droit prise sur internet.

Interface Utilisateur (UI)

Pour l’interface utilisateur j’utilise le système de Canvas de Unity et sa bibliothèque C# dédié. J’ai créer les images (cœur, balle, etc.) en Pixel Art. Les textes et compteurs sont des TextMeshPro avec une police Pixel Art. Plusieurs scripts indépendants et fonctionnant sur la base du design pattern Observer sont chargés de mettre à jours dynamiquement l’UI et de gérer l’apparition de certaines zones.

SFX

Afin de centraliser la gestion des sons j’ai créé un Singleton “Gestionnaire de SFX” qui comprend pour chaque SFX une fonction public qui le joue. On peut donc depuis n'importe quel script simplement lancer la lecture d’un SFX. Cela rentre aussi dans le cadre du SOC.

Game Feel

Afin de rendre le jeux plus attrayant je me suis penché sur la Game Feel, j’ai donc mit en place un singleton “tremblement de caméra” qui permet donc de lancer des effets de tremblements de caméra personnalisé depuis n’importe quel script. J’ai pu faire ça grâce a l’Add-on ITween.
Pour l’UI j’ai utilisé de simples animations : variations de couleurs, de tailles, de rotations grâce au système d’animation de Unity ou à ITween.

Système et autre :

J’ai placé tout autour de l’arène des Triggers qui protège le joueur de l’éjection en dehors de l’arène. En clair, si par malchance un joueur bug, se retrouve sous le sol, ou en dehors des bordures, il sera téléporté au centre de la carte.
J’ai aussi ajouté un générateur de particules afin de faire tomber des feuilles d’arbre.
Pour le Game Over, un script détecte l’arriver à 0 de la vie d’un joueur (Observer) met le déroulement du temps sur 0 et communique avec l’UI(Observer) afin d’afficher le joueur gagnant.

Build et exécutable

Télécharger

Script

Télécharger