[Projet Perso] Je fais un RPG ! (Partie 3)

unity3v2

Hello ! Me revoilà déjà pour une troisième partie sur ce dossier qui vous présente mes avancements sur mon projet de création de jeu de rôle avec le moteur de jeu Unity.

Si vous n’avez pas lu les précédents articles je vous invite à cliquer sur les liens ci-dessous :

 

Bon bon bon, j’ai plutôt bien avancé hier et aujourd’hui, j’ai complété le cours et le prototype tel que le cours le présentais est désormais fini.

Je vous réserve même une petite surprise en fin d’article 😉

loadingmenutogame

Okay, alors commençons dans l’ordre des modifications que j’ai apporté :

Tout d’abord, le choix de sélection de personnages au menu principal est conservé  lorsque le joueur lance le jeu (heureusement me direz vous sinon what’s the point ? x) ).

J’ai aussi réussi à mettre une image de loading assez simpliste mais qui fait le café entre chaque chargement de scènes.

** Attention explication en programmation « chiante pour les non initiés N°1 » **

Pour pouvoir conserver ce choix et aussi garder l’image de chargement entre 2 scènes, j’ai fais en sorte d’appliquer un patron de conception (design pattern) singleton. Tout simplement haha. Pour ceux qui sont perdus il faut savoir qu’un objet peut avoir plusieurs occurrence en programmation, utiliser ce design pattern très simple permet de s’assurer qu’un seul et unique objet de cette classe ne puisse exister au même moment.

Un patron de conception / design pattern ce sont des optimisations de code utiles dans des problèmes qui se présentent régulièrement aux programmeurs et qui facilitent la vie ainsi que les temps de calculs.

Quand au design pattern Singleton, c’est notamment utile pour les objets qui conservent les données utilisateurs d’une scène à une autre (comme dans mon cas) ou encore pour s’assurer qu’un seul objet s’occupera de la musique et on évite ainsi de se retrouver avec 45 fois la même musique en boucle à chaque fois qu’on relance le niveau !

** Attention fin de l’explication en programmation « chiante pour les non initiés N°1 » **

Une fois que le joueur lance la partie il est envoyé dans le hub (pour le moment, je prévois de lancer une petite quête avec un peu de background sur l’histoire que je m’imagine dans la version finale) et peut choisir la porte qui le téléportera dans le monde de son choix (dans la version finale je prévois de verrouiller l’accès aux portes tant que les quêtes dans les autres mondes ne seront pas finies).

Voici un aperçu de l’apparition des portes selon votre placement en face des piédestal :

checkbuttonstoworlds

Le jeu a un système particulier de Lock/delock de souris (un peu à la manière de Dragon Age : Origins) c’est à dire que par défaut la souris n’apparaît pas à l’écran et dans ce mode vous pouvez attaquer et bouger la caméra autour du personnage / zoomer-dézoomer. Mais en appuyant sur la touche Tab vous déverrouillez la souris.

Tab-Key
Pour les personnes pas trop à l’aise avec les noms des touches de leur clavier (et je sais qu’il y en a un grand nombre) la touche tab (le raccourci de « tabulation ») c’est ça !

Une fois la souris déverrouillée vous pourrez cliquer sur le bouton du monde de votre choix. Ca parait compliqué dit comme ça mais en vrai c’est assez intuitif, et je ferais en sorte d’adapter le binding des boutons de manettes dans les prochaines versions :).

Une fois le bouton cliqué vous êtes redirigé dans le monde choisi, j’espère juste que vous n’êtes pas malades en voyages par portails tel Geralt De Riv dans la série de jeux The Witcher:

maxresdefault

 

CFOWu

J’ai aussi implémenté tous les liens de spawn pour faire apparaître les personnages au bons endroits selon le niveau choisi dans le Hub.loadingorcworldtomain

Pour le moment il n’y a pas d’indications visuelle de la téléportation, je compte par la suite mettre un effet visuel au sol pour indiquer une possibilité de retour au village/hub.

Vous l’avez aussi surement remarqué mais il y a aussi des indications pour le joueur en bas à gauche de l’écran, respectivement en rouge la barre de vie du personnage et en bleu sa barre d’énergie.

Pour le moment je n’ai pas encore codé l’application des dégâts appliqués au joueur sur l’interface, mais  j’ai le code d’un autre projet qui traîne dans un coin. Et c’était pas très compliqué à faire non plus, donc je pense pouvoir programmer ça d’ici la prochaine version.

Au dessus des HP/MP (Heal Points/ Mana Points) il y a plusieurs icônes pour faciliter la vie au joueur :

  • Status : (Pas encore implémenté) A terme, ce panneau permettra au joueur de voir son statut et ses altérations d’état ainsi que son niveau et son argent.
  • Skills : (Pas encore implémenté) j’avais prévu de permettre au joueur de découvrir de nouvelles techniques au fur et à mesure du jeu pour débloquer des coups et des pouvoirs différents. Une fois ces pouvoirs trouvés dans le monde, le joueur pourra les « équiper » et les changer à volonté depuis ce menu. Évidemment, c’est encore au stade de l’idée à l’heure actuelle.
  • Items : (Implémenté) Ce menu permet au joueur de voir les objets qu’il a réussi à récupérer au cours du jeu, utiliser des potions (pas  encore implémenté) et changer d’armes par exemple. A terme je pense que le changement d’armes se fera depuis le menu Status avec un procédé similaire à une feuille d’équipement ou on pourra glisser déposer les objets pour les équiper… à voir selon mes envies/capacités à ce moment là.
  • Quests : (pas implémenté) Le journal de quêtes… là j’avoue que ça va être un grooos morceau à faire.

changeWeapons

Le menu très basique pour le moment des objets. Néanmoins, comme vous pouvez le voir ça marche et le joueur peut déjà choisir son skin simplement en cliquant sur l’arme de son choix.

changeWeaponstestMagicSword

Animations avec l’arme 2 – Magic Sword.

changeWeaponstestFireSword

Animations avec l’arme 3 – Fire Sword.

J’ai aussi inséré des PNJ (Personnages Non Joueurs) avec un comportement très simple dans le village, qui se baladent selon des points navigations que je leur attribue.

Certains PNJ sont « idle », c’est à dire qu’il ne bougent pas et se reposent. Idéalement, lors des prochains builds du jeu je compte faire en sorte que lorsque le personnage est près d’eux les PNJ s’arrêtent pour lui parler.

navMeshtest1

Voilà un aperçu du village vue de dessus avec les PNJ qui se baladent selon les points que je leur ai appliqué.

Il faut savoir que Unity rend très simple le comportement de ces PNJ grâce aux Navmesh et NavAgent des fonctions qui permettent de paramétrer facilement de tels comportements.

La création d’un NavMesh permet aux PNJ de « savoir »  où il peuvent naviguer dans le monde, cela se représente comme la zone bleue ci-dessous :

navMeshTest2

Petite histoire du développement de jeux-vidéos, il faut savoir qu’avant l’avènement des jeux 3D, plusieurs algorithmes de plus courts chemins et de déplacements d’IA étaient programmés selon un système de graphes avec des coûts sur les arêtes qui représentent les distances pour aller d’un nœud A à un nœud B, comme l’algorithme A* (prononcé A étoile / A star).

AstarExampleEn
Un exemple de l’algorithme en action.

S’il est toujours possible de programmer des IA de cette manière dans les jeux en 3D l’utilisation de Navmesh permet de complétement rendre obsolète ce système.

Par exemple dans le jeu en ligne Final Fantasy XIV, un long article (en anglais) dévoile comment les programmeurs ont su adapter et créer leurs Navmesh de manière à ce que les personnages/ennemis ne tombent pas dans des ravins. Et ils ont ensuite pu utiliser les NavMesh générés par programmation pour créer la carte des zones dans l’interface des joueurs (c’est fou non ? x) ).

(Si vous êtes intéressés, je vous invite à lire ces liens très instructifs / et à 100% en langage technique haha =>

Attention, cet algo du A* est toujours utile dans des cas particuliers, par exemple si on veut une flèche qui laisse une trainée derrière elle pour montrer les endroits accessibles pour envoyer un personnage d’un point A a un point B.

Un peu comme ça :

la-pucelle-tactics-200405070433059-823110_320w
Jeu : La Pucelle Tactics sur Psp

Et avec tout ça de rajouté … mon jeu n’arrêtais pas de crasher encore et encore lorsque j’étais dans le village. Je pense que le nombre de polygones à afficher était trop imposant pour ma carte graphique sur le déclin.

Après avoir demandé conseil à mon prof sur Udemy (sans aucune réelle réponse haha), j’ai finalement opté pour appliquer de l’Occlusion Culling dans ma scène.

Mais qu’est-ce que l’occlusion culling ma bonne dame ?

Une image (en l’occurence une vidéo) valant mille mots voici grosso modo à quoi sert l’occlusion culling :

occlusionCullingHorizon
Application de l’occlusion culling dans le très récent (et très cool) Horizon : Zero Dawn.

Grosso modo, l’occlusion culling est un algorithme qui ne va rendre /afficher dans le monde (render) que ce qui est en face de la caméra du joueur, le reste existe toujours dans le code mais ne pas avoir à l’afficher permet d’optimiser CONSIDÉRABLEMENT les performances dans un jeu.

2 points négatifs à son utilisation:

  • Ce que l’on gagne en performance pure on le perd en espace de stockage car il faut conserver les données de la carte/scène qui est sous occlusion culling dans un fichier séparé en plus de la carte en elle-même.
  • L’algorithme est une purge à créer de soi-même… genre VRAIMENT une grosse purge. En soi l’exercice est intéressant et super gratifiant mais tellement complexe pour moi pour le moment :O.

Mais alors comment se fait il que j’ai réussi à appliquer cet algo sans problème dans mon jeu ? Encore une fois toute la puissance de Unity permet de faciliter la vie des développeurs grâce à une implémentation déjà toute prête de cet algo dans le moteur = Insta Win.

Depuis, je n’ai plus aucun problème de crash. Le seul inconvénient c’est que lorsque l’on regarde l’eau tous les éléments ne s’affichent pas dans le reflet ou alors s’affichent avec du retard et on voit littéralement des murs de bâtiments/arbres qui apparaissent de nulle part  x) Mais c’est un bien piètre prix à payer pour que je puisse continuer à vagabonder dans le village de mon jeu haha !

Bref ! C’est tout pour cette fois, j’espère que ça vous aura été instructif autant que pour moi ^^

Ah ! Et oui la petite surprise !

Voici une pré-alpha de ma démo (grosso modo 25% de ce à quoi ressemblera le jeu au final, ne me remerciez pas, c’est gratos !)

Alors ouip, ça pue encore un peu du boudin, il n’y a aucune musique, les animations sont cheloues et ressemblent un  peu à ça, et les ennemis vous font l’amour quand ils viennent vous taper :

tumblr_inline_om5lcaW8IL1syf2yq_500

Mais voilà pour vous quand même pour vous remercier d’avoir lu jusque là ! haha :

Cliquez sur moi pour télécharger la version v0 !

Enjoy ! Et je suis ouvert à toutes suggestions (considérez bien que c’est pas du tout représentatif de la qualité finale, mais juste un petit apéro si je puis dire haha x) ) !

Bye bye ! A la prochaine !

giphy (1)


Laisser un commentaire