Bolt & Nut :

Ferrailleurs de l’espace

Shoot’em up 3D développé sous Unity en 2024


0:00
0:00

Langage :

C#

Rôles :

Chef de projet

Chargé de toute la programmation ainsi que de l’intégration

Participation au game design et level design

Durée :

Projet sur 6 semaines

Equipe :

Equipe de 4 personnes

Concept :

Shoot ‘Em Up en vue à la troisième personne avec

défilement vertical.

Dans ce jeu, les joueurs doivent naviguer à travers trois

environnements différents, en survivant à des vagues

de vaisseaux ennemis.

Ils devront utiliser les ressources récupérées sur les

ennemis pour gagner en puissance, atteindre et vaincre

le boss final, et gravir les échelons pour devenir le

meilleur récupérateur.


Personnage Jouable, le vaisseau :

Déplacement :

J’ai développé un système complet de déplacement du vaisseau en 3D

avec une approche orientée game feel : fluide, limité, lisible et agréable à

contrôler.

  • Physique contrôlée (Rigidbody)pour une sensation demouvement progressive et naturelle.
  • Vitesse maximale.
  • Zone de déplacement limitée dans un espace défini (X / Z).
  • Lissage de l’arrêt (SmoothStop).
  • Animations dynamiques : Le vaisseau s’incline selon l’input et moteurs latéraux activés/désactivés selon l’état de mouvement.

Système de tir :

Le tir est au cœur du gameplay de Bolt & Nut.

J’ai conçu un système de tir évolutif en C# intégrant plusieurs modes

d’attaque, un système de progression ainsi que des effets visuels.

Ces modes de tir sont utilisé dans le Game Manager en fonction de l’experience accumulé par le joueur.

Le vaisseau dispose de 6 modes de tir progressifs, débloqués

automatiquement avec l’XP.

Chaque mode ajoute de la puissance ou de la dispersion, avec un pattern

codé à la main.

Ultimate :

L’ultimate est une attaque de zone surpuissante, disponible à partir du

niveau 2.

Cette attaque est unique par niveau et agit comme un “panic button”

lorsque le joueur se sent dépassé par les vagues d’ennemis

J’ai créé un VFX marquant qui apparaît au centre du joueur accompagné

d’une secousse caméra, le tout rendant son utilisation satisfaisante.

Dégâts continus en zone sur :

  • Tout les ennemis (tick damage).
  • Tous les projectiles ennemis (clear bullet hell).
  • Les boss : dégâts en % en fonction de leur vie max.

Bouclier :

J’ai mis en place un bouclier unique qui protège le joueur contre un coup

et se recharge automatiquement après un délai.

Apparition et destruction du bouclier sont accompagnées de Effets visuels (VFX), Sons dédiés, Fragments 3D en cas de break.


Les ennemis communs :

Classe de base - Héritage :

J’ai développé un système modulaire et extensible d’ennemis basé sur une classe mère Enemy.

Ce système permet une intégration rapide de nouveaux types, très facilement et rapidement tout en garantissant cohérence, feedback et récompense.

Méthodes virtual / abstract permettent à chaque type d’ennemi de surcharger ses déplacements et comportements spécifiques (Move(), Fire(), Die()).

Fonctions générales intégrées :

  • Points de vie / barre de vie dynamique.
  • Système de tir configurable(canShoot, fireRate, bulletPrefab, etc.).
  • Comportement de mort et explosion (son, FX, fragment).
  • Distribution d’XP via orbes dropées.
  • Système de flash visuel à l’impact (_HitPow shader).
  • Rotation UI barre de vie face caméra.
  • Récompenses (score / XP) configurables individuellement.

Chasseur :

Comportement :

  • Se déplace en ligne droite de d’un point a un autre.
  • Tire à distance vers le joueur en visant dynamiquement dans sa direction via une tourelle rotative.
  • Despawn automatique au point d’arrivé.

Tourelle Mobile :

Comportement :

  • Déplacement géré par spline externe (non contrôlé par code via Move()).
  • Se déplace lentement de gauche à droite (ou inverse) en suivant une spline d’animation sinusoïdale en haut de l’écran.
  • Tire en continu vers l’avant pendant sa traversée.

Nuées :

Comportement :

  • Se dirigent en continu vers le joueur, avec rotation fluide.
  • Utilisent une logique de séparation locale pour ne pas se superposer aux autres Nuées.
  • Ne tire pas, mais inflige des dégâts en collision.
  • Calcul en temps réel d’un “flocking behavior” simplifié (Comportement vol d’oiseaux).

Brise coque :

Comportement :

  • Se positionne puis charge en ligne droite sur la position du joueur après une phase de préparation.
  • Chaque charge est précédée d’un alignement vers le vecteur joueur et d’une animation sur chaque piques (via shaders).
  • Ne tire pas, mais inflige de lourds dégâts en collision.
  • Répète son pattern en boucle tant qu’il est en vie.

Garde-Bouclier :

Comportement :

  • Tank défensif qui avance en ligne et se synchronise horizontalement avec le joueur.
  • Il ne tire pas et agit comme une barrière physique mouvante pour protéger ses allié.
  • Tant que le composant bouclier est actif, il bloque les dégâts reçus. Une fois détruit, le tank devient vulnérable.

Croiseur-Tempête :

Comportement :

  • Déclenche cycliquement un rayon face a lui qui représente une zone de dégâts.
  • Les dégâts sont simulés par des effets visuels + détection de zone (OverlapSphere) et agissent par tick réguliers.
  • Reste en l’air et enchaîne les patterns toutes les X secondes.

Les Boss :

Structure Modulaire :

Les bosses agissentt comme climax du niveau, conçu pour tester les compétences du joueur acquises face aux ennemis rencontrés précédemment

(chasseurs, tourelles mobiles, nuées, etc.).

Son design repose sur une architecture modulaire : un Module Cœur central, entouré de plusieurs Modules d’Armes qui conditionnent son comportement

et sa résistance.

Module Coeur :

Fonctionnement :

  • Composant principal du boss, il possède ses propres points de vie.
  • Il calcule une réduction des dégâts reçus en fonction du nombre de modules d’armes encore actifs (de 80% à 0%) : cela force le joueur à gérer les menaces périphériques avant d’atteindre le cœur.
  • Il orchestre la destruction du boss entier en cascade quand il est vaincu (désactivation des modules, nettoyage des balles ennemies, VFX, score, XP, etc.).

Module Armes :

Chaque module hérite d’un système commun :

  • Barre de vie indépendante, rotation/visée selon le type, flash d’impact
  • Attaque et pattern propres (tir, spawn, zone, etc.).
  • Destruction personnalisée avec effet visuel, et possibilité de déclencher des vagues d’ennemis à sa mort.

Les types de modules utilisés ici simulent les ennemis du niveau :

  • CHSR (Chasseur) : tourelle rotative avec triple tir décalé.
  • TM (Tourelle Mobile) : tir en éventail évolutif.
  • N (Nuée) : spawn direct d’ennemis.
  • BC (Brise-coque) : spawn d’unités kamikazes.
  • CT (Croiseur Tempête) : zone de dégâts alternante, rotation contrôlée.

Prototype :

Je trouve ça cool de montrer la première vidéo prototype boss que j'ai sorti à mon équipe !

Les 3 Boss :

Vaisseau amiral Saul’ty

Raymond Th’a

Le Briseur de monde


Design orienté gameplay :

Wave Manager :

J’ai conçu un gestionnaire de vagues entièrement modulaire, pensé pour orchestrer la progression rythmée des

combats tout au long du niveau, il gère l’entièreté des enchainements d’un niveau.

Outil créé pour facilité l’intégration de vague par scène.

  • Création d’un nombre illimité de vague suivant la structure “Wave”
  • Chaque vague est instancié sur le Spawn Point Transform et s’auto-gère.
  • La vague suivante ne démarre que lorsque tous les ennemis(ou boss) de la précédente sont éliminés.

Wave Structure :

Chaque vague est définie par un Wave contenant :

  • Une liste d’ennemis
  • Un tableau de délais de spawn associés

Système de progression :

J’ai conçu un système de progression simple et visuel pensé pour accompagner la montée en puissance du joueur tout en maintenant un rythme de jeu clair, progressif et engageant.

Accumulation d'expérience :

  • L’XP est automatiquement collectée via les étoiles lâchés par les ennemis à leur mort.
  • Chaque ennemi donne une quantité définie d’XP (configurable individuellement).
  • Les Boss en fin de niveau déclenchent une pluie d’XP à leur destruction.

Calcul de montée de niveau :

  • XP nécessaire par niveau définie dans une liste incrémentale .
  • Si la barre atteint le seuil, le joueur passe de niveau, conserve l’XP restante, et débloque immédiatement des bonus (Amélioration de tirs, Cadence ...).

Une structure optimisée :

Map Infinie (Scrolling Loop) :

J’ai conçu un système de map dynamique qui donne l’illusion d’un scrolling infini vers le joueur, tout en optimisant les performances.

Cela permet également d’avoir un jeu sans limite de temps.

  • La map est constituée de tiles (grands blocs de décor) qui se déplacent en continu vers le bas.
  • Un trigger placé à l’arrière détruit les tiles sortants et en réinstancie un nouveau au début pour simuler une carte sans fin.

Pooling FX :

J’ai mis en place un système de pooling générique pour tous les VFX du jeu via le VfxManager.

Cela permet d’éviter l’instanciation/destruction répétée des effets visuels pour garantir des performances constantes, même en cas de pics d’action (boss, spams de tirs, explosions).

  • Chaque VFX est défini dans une structure Vfx contenant un prefab, un nom d’appel (clé string), un nombre d’instances préallouées (pool size).
  • Tous les effets sont instanciés une fois au lancement, désactivés, et réutilisés dynamiquement à l’appel (PlayVFX()).

Admin Panel (Debug UI) :

Un point important du développement a été de maintenir un panneau administrateur fonctionnel afin de faciliter les itérations et tests en temps réel, sans avoir à relancer la scène ou modifier les scripts manuellement.


Mot de la fin :

Ce projet a été un véritable tremplin de progression, autant en tant que développeur gameplay qu’en tant que chef de projet.

J’y ai conçu l’ensemble des systèmes clés : gestionnaire de vagues, architecture modulaire des boss, système d’XP et de level-up, carte infinie, object pooling, debug panel… avec une priorité constante sur la clarté, la modularité et les feedbacks joueurs (FX, UI, game feel).

Tout a été pensé pour construire une base de gameplay solide, fluide et cohérente.

Mais ce projet m’a surtout permis de travailler en équipe : diriger une petite team, répartir les tâches, gérer les plannings, tout en valorisant les compétences de chacun.

C’est là qu’on comprend à quel point le jeu vidéo est un travail d’équipe passionnant — et qu’un bon projet, c’est aussi savoir tirer le meilleur de

chaque talent autour de soi.

Retour en haut