PROJET CROSSY ROAD
Introduction
Ce projet intitulé "CROSSY ROAD" consiste à produire un jeu vidéo qui reprend le jeu Crossy Road avec quelques personnalisations. Aussi, comme objectif, ce projet nous incite à développer un robot qui est capable de jouer au jeu malgré la difficulté imposé.

Par ailleurs, ce projet nous permet également de mettre en pratique et d'approfondir nos compétences en gestion de projet en tenant en considération :
- La répartition des tâches sur
GitHub - L'organisation du code source avec
git - Travail en mode
Agileavec la gestion des issues par sprint grâce à des milestones définis. - Maintien du tableau Kanban sur
GitHub
Avant d'entamer le développement du jeu et de mieux appréhender la conception du jeu, des diagrammes UML ont été réalisés dont :
- Diagramme de classe: pour comprendre comment les classes interagissent entre eux, et se baser sur ce diagramme pour développer le moteur du jeu principal.
- Diagramme d'activité 1: pour expliquer la logique de jeu que le joueur fera face par rapport à son environnement.
- Diagramme d'activité 2: spécifique au robot implémentant sa logique de déplacement
- Diagramme de cas d'utilisation: pour détailler les différentes actions que l'utilisateur puisse effectuer sur l'UI du jeu allant du Menu vers l'in-game du jeu
- Diagramme d'états transition
Enfin, une grande partie du projet fut consacrée sur la prise en main et l'apprentissage du moteur de jeu utilisé pour développer le jeu qui est : Unity3D, et des outils de modelisation 3D comme Blender et de Voxel (MagicaVoxel) pour pouvoir répliquer de manière quasi identique le jeu niveau visuel.
📈 Analyse UML
Dans le cadre de l'analyse UML, comme cité précédemment, ci-dessous les différents diagrammes que nous avons réalisé dans le cadre de ce projet dont : diagramme de classe, diagramme d'activité, diagramme de cas d'utilisation, diagramme d'états transition.
Diagramme de classe

Pourquoi classe Player en Singleton ?
Etant la classe central du jeu, et que dans un jeu comme Crossy Road, il n'existe qu'une seule instance de Player. Cette classe n'a pas vocation à être instancié dans d'autres classes. Ainsi, pour ce faire, cette classe a été conçue en tant que classe static dans le code à la manière d'Unity.
Diagramme activite 1: Player

Diagramme activite 2: Robot

Diagramme de cas d'utilisation

Diagramme d'état transition

Gestion du projet
Pour la gestion du projet, plusieurs étapes étaient réalisées, allant de la planification du projet avec les comptes rendus disponibles dans les CR disponible dans le dossier associé, vers la réalisation du projet pilotée avec la gestion des issues et méthologie Agile grâce au milestones sur GitHub.
Planification du projet
Pour façonner la planification du projet, nous avons réalisé un diagramme de Gantt initial pour prévoir les différentes réalisations du projet. Cependant, comme dans tout projet, il existe des aléas qui influencent la réalisation du projet, et créant donc un écart significatif entre le Gantt initial et le Gantt final.
L'un des plus grands écarts remarqués se situent à l'uniformisation du projet auquel nous avons pris du retard dans le fait que chaque membre du groupe ont chacun leur rythme d'apprentissage pour la Prise en main Unity.
Aussi, certaines tâches et réalisations fut ajoutées dans le Diagramme de Gantt, auquel formalisé comme étant une Roadmap sous GitHub. Et réciproquement, certaines tâches ont également était retirés de la planification/Diagramme, notamment ceux qui n'étaient pas de base dans le CAHIER DES CHARGES, ce que donc l'équipe jugeait comme étant optionnel et donc ayant peu d'impact sur le projet.
Ainsi, pour visualiser la planification et la réalité ed la réalisation du projet, ci-dessous le diagramme de Gantt initial et le Diagramme de Gantt final.
Diagramme de Gantt initial

Diagramme de Gantt final
Pour le diagramme final, il est accessible sous notre projet Git via le lien suivant : Diagramme de Gantt final.
Organisation du projet sous Git
Pour l'organisation du projet sous le Git, nous avons suivi une méthodologie structurée comportant plusieurs branches:
- La branche principale (main) est protégée et n'accepte que le code fonctionnel et stable.
- La branche de développement (develop) intègre les avancées du projet et les jalons (milestones).
- En complément, plusieurs autres branches, soit nominatives, soit basées sur des fonctionnalités spécifiques, ont été créées pour permettre des tests approfondis et des modifications susceptibles de casser le code temporairement.
Réalisation du projet
Pour la réalisation du projet, dans son ensemble chacun ont pris leur responsabilité pour développer le jeu et mener à bien le projet:
- @Dinholu, alias Alizée H., dans son rôle de chef de projet, s'occupait majoritairement du pilotage du projet en programmant en avance les différentes réunions hebdomadaires pour la revue des issues et du code. Des sprints ont donc été définies en des milestones, et que chacun devait réussir à clore leur issue pour pouvoir atteindre notre objectif. En terme de développement, elle s'occupait grandement de la gestion du son du jeu, la revue et refactorisation du code pour maintenir la lisibilité du code, la mise en place du menu principal et de ses différentes options et le développement/optimisation de la détection du robot.
- @EpitronX, alias Jérémie M., dans son rôle de développeur, était celui qui se chargeait du développement de l'algorithme de spawn des objets sur le terrain, l'algorithme de détection de train et l'émet de signal d'arrivée du train, la gestion de la caméra du jeu et mise en place des bordures de jeu.
- @WRKT, alias Winness R., dans son rôle de développeur, a pris en charge la modélisation graphique du jeu et des différents modèles avec Blender. Son objectif principal étant de vouloir répliquer à l'identique le jeu originel de son mieux. Aussi, il participait à optimisation de l'algorithme de génération de terrain, création du personnage principal et de son ennemi (aigle), optimisation des différentes collisions du jeu, et développement du robot.
Difficultés rencontrés
Tout au long du projet, plusieurs difficultés ont été rencontrées, notamment dû au manque de compétences sur Unity de l'équipe, et encore le temps de formation sur la technologie. Aussi, dû à ce manque de connaissance, plusieurs bonnes pratiques de Unity n'ont pas été appliquées au projet.
Par ailleurs, des difficultés ont été rencontrés également en terme d'organisation, notamment sur la communication au sein de l'équipe où les disponibilités de chacun n'étaient pas forcément évidente. Aussi, comme chaque membre ont leur propre compétences et capacité sur un sujet donnée, quelques issues ont donc été redistribués et modifiés en assignation pour pouvoir mener à bien le projet.
Enfin, en terme technique, les plus grosses difficultés que nous avons rencontrés sont :
- Non utilisation de l'axe Z comme étant l'axe pour avancer et non l'axe X que nous avions décider
- Mauvaise exploitation des fonctions
Start()etAwake()où normalement,Awakeserait plus optimale pour l'instanciation des variables. - La gestion de la collision avec les
Raycastspour les obstacles - Le développement du robot et la détection précoce des objets mouvants pour optimiser ses décisions
- Algorithme de déplacement du robot sur l'environnment et son implémentation
- Gestion de l'animation du joueur que ce soit pour l'effet de saut et à la mort du personnage
- Gestion du cycle de vie de joueur qui ne devait pas être directement détruit suite à sa mort car pouvant entraver l'animation.
Documentation utilisateur
Comment jouer à notre jeu Crossy Road ? 🔥 Pour ce faire, suivez le guide suivant :
Menu principal

Sur le menu principal, vous pouvez effectuer différentes actions selon le bouton cliqué.
- Cliquez sur le bouton
PLAYpour lancer directement le jeu avec le skin par défaut (Chicken) et les paramètres par défaut (difficulté: medium, volume: 50%) - Cliquez sur le bouton
HIGHSCOREpour accéder au Leaderboard du jeu classé PAR difficulté, détaillé dans la section Highscore. - Cliquez sur le bouton
SKINSpour choisir la mascotte du personnage à jouer, débloquable avec la monnaie du jeu, que vous pourrez gagner en jouant. - Cliquez sur le bouton
OPTIONSpour modifier les paramétrages du jeu, dont la difficulté du jeu, mais aussi le volume des sons du jeu (notamment celui du saut! :trollface:) - Cochez sur
ROBOTpour activer le mode ROBOT et appréciez le robot jouer lui-même, bon il n'est pas parfait, mais parfois agréable à voir ses mouvements. - Cochez sur
EAGLEpour activer ou non l'aigle qui attaque le joueur en cas d'inactivité. ⛔ ATTENTION, si vous aimez le challenge, vaudrait mieux l'activer. - Cliquez sur le bouton
QUITpour quitter le jeu.
In-game

Dans l'in-game, vous trouverez sur l'image précédente les différentes informations nécessaires du Dashboard.
Déplacement du joueur
- Appuyez sur la touche directionnelle
HAUTouZpour avancer - Appuyez sur la touche directionnelle
BASouSpour reculer - Appuyez sur la touche directionnelle
GAUCHEouQpour aller vers le gauche - Appuyez sur la touche directionnelle
DROITEouDpour aller vers la droite.
Evitez les ennemis 💀
Faites de votre mieux pour éviter les ennemis, et portez une attention particulière sur le déplacement des bûches sur l'eau, ils peuvent vous porter défaut si vous ne vous en souciez pas.
Pause du jeu
Appuyez sur la touche ECHAP pour activer mettre le jeu en Pause.

Dans ce menu, vous pouvez :
- Cliquez sur
RETRYpour recommencer le jeu depuis le début. - Cliquez sur
CONTINUEsi vous avez terminer de boire votre café et reprendre le jeu. - Cliquez sur
QUITpour revenir au Menu principal du jeu - Modifier le volume du jeu avec le slider.
Comme dans l'in-game, vous pouvez continuer de visualiser le temps de jeu écoulé, le score, et les pièces que vous avez gagné durant la partie.
Game Over
Dans le cas où vous êtes mort, peu importe la raison, skill issue accepté 😆, l'écran suivant apparaitra avec un son qui devrait vous rappeler votre belle enfance.

Et comme pour le menu Pause précédemment :
- Cliquez sur
RETRYpour recommencer le jeu depuis le début. - Cliquez sur
QUITpour revenir au Menu principal du jeu
Highscore
Maintenant vient le leaderboard! N'hésitez pas à battre votre score et devenir le top 1 dans le leaderboard comme dans les vieux jeux d'arcade 🎮. Mentionné précédemment, le leaderboard est accessible que depuis le menu principal du jeu.

Vous pouvez consulter les différents leaderboards selon la difficulté que vous avez choisi. Ainsi, l'équipe de développement du jeu vous invite à réussir au moins 100 points dans la difficulté Difficile.
Skins

Dans le menu skin, vous pourrez modifier la mascotte de votre personnage. Attention, rien n'est gratuit dans la vie à part les personnages suivants :
- Chicken, personnage principal, qui décide de traverser une route aussi dangereuse...
- Duck, ami du canard et grand rival, qui veut aller toujours plus loin que le poulet, mais à quel prix...
- Penguin, parce qu'on aime les pinguoins, vive les pinguoins! Vive Tux! Vive Linux!!
Si vous êtes assez bon sur le jeu, vous aurez encore plus de choix sur le jeu, il y existe actuellement 21 skins sur le jeu! Ainsi sur ce menu :
- Cliquez sur
BUYpour acheter les skins - Cliquez sur
SELECTpour sélectionner le skin vu sur l'écran. - Cliquez sur
PLAYpour lancer directement le jeu - Cliquez sur
BACKpour revenir au menu précédent pour affiner d'autres réglages.
Options

Sur ce menu, vous pourrez:
- Modifier la difficulté du jeu en cliquant sur les flèches présents
- Modifiez le volume du jeu
- Cliquez sur
BACKpour revenir au menu précédent.
🤖 Le Robot
Le robot, le bot, l'IA, cette partie du projet fut la plus fastidieuse, et celui qui demandait le plus d'attention, de logique, d'algorithme.
En effet, dans le développement du jeu, depuis le début, nous avons choisi de faire recours aux raycasts pour la détection des collisions, mais non uniquement avec les colliders.
En utilisant donc cette même logique de détection, nous avons développé le robot autour des raycasts pour la détection de son envrionnement que ce soit pour les Obstacles, les véhicules, les trains, et l'eau.
Quelques démos:


💻 Technologies utilisées


