Rapport-ilovepdf-compressed

9 vues

Publié le

0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
9
Sur SlideShare
0
Issues des intégrations
0
Intégrations
5
Actions
Partages
0
Téléchargements
1
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Rapport-ilovepdf-compressed

  1. 1. D´eveloppement de jeux vid´eo avec Unity - Programmation, Int´egration, Outils propri´etaires Stage r´ealis´e par Arthur Cousseau (Master 2), Du 14 avril au 30 septembre 2016. Sous la tutelle de M. Kien-Van Tram, CEO et directeur des technologies de Vandal Games. Remis le 26 Aoˆut 2016 et soutenu le 7 Septembre 2016.
  2. 2. 1 NOTICE BIBLIOGRAPHIQUE Ann´ee : 2015-2016 Num´ero ´etudiant : 2014-2557 Centre de rattachement du projet : Arts et M´etiers ParisTech Angers Auteur : Arthur Cousseau Titre : D´eveloppement de jeux vid´eo avec Unity - Programmation, Int´egration, Outils propri´etaires Encadrement du projet : Kien-Van Tram Partenaires du projet : Imports Dragon R´esum´e : L’objectif du stage est d’aider au d´eveloppement des projets de Vandal Games, et `a leur maintenance une fois ceux-ci mis en place. Pour ce qui est de la partie d´eveloppement, cela passe par la programmation de fonctionnalit´es `a int´egrer aux projets, que ce soit au niveau front-end (ce que voit l’utilisateur) que back-end (ce qui aide `a am´eliorer la productivit´e en interne, et dont l’utilisateur final n’a pas connaissance). Il y a ´egalement des tˆaches de level design (conception de niveaux), de game design (´equilibrage g´en´eral du jeu), de r´eseau (discussion avec un serveur distant, requˆetes `a une base de donn´ees). Pour ce qui est de la partie maintenance, cela concerne des corrections de bugs, des r´e´equilibrages, et du renforcement de la s´ecurit´e afin d’´eviter tout piratage. Mots-cl´es : programmation, outils, temps-r´eel, mobile, r´eseau Partie `a remplir par le professeur responsable du projet Accessibilit´e de ce rapport (entourer la mention choisie) : Classe 0 = Acc`es libre Classe 1 = Confidentiel jusqu’au Classe 2 = Hautement confidentiel jusqu’au (date de fin de confidentialit´e) Date : Nom du signataire : Signature : Arthur Cousseau Page 1 26 Aoˆut 2016
  3. 3. 2 R´esum´e L’objectif du stage est d’aider au d´eveloppement des projets de Vandal Games, et `a leur maintenance une fois ceux-ci mis en place. Pour ce qui est de la partie d´eveloppement, cela passe par la programmation de fonctionnalit´es `a int´egrer aux projets, que ce soit au niveau front-end (ce que voit l’utilisateur) que back-end (ce qui aide `a am´eliorer la productivit´e en interne, et dont l’utilisateur final n’a pas connaissance). Exemple de fonctionnalit´e front-end : afficher les points de vie des ennemis. Exemple de fonctionnalit´e back-end : un gestionnaire audio. Il y a ´egalement des tˆaches de level design (conception de niveaux), de game design (´equilibrage g´en´eral du jeu), de r´eseau (discussion avec un serveur distant, requˆetes `a une base de donn´ees). Pour ce qui est de la partie maintenance, cela concerne des corrections de bugs, des r´e´equilibrages, et du renforcement de la s´ecurit´e afin d’´eviter tout piratage. Ce rapport traite de deux projets de Vandal Games sur lesquels j’ai eu la chance de travailler, et leur m´ethode de fonctionnement est assez diff´erente ; c’est pourquoi les tˆaches pr´esent´ees dans ce r´esum´e restent relativement g´en´eriques, de fa¸con `a d´ecrire simultan´ement mon activit´e sur ces deux pro- jets. Mots-cl´es : programmation, outils, temps-r´eel, mobile, r´eseau Abstract The objective of the internship is to help in the development of Vandal Games’ projects, and maintaining them once they are set up. For the development part, it means programming features to integrate to the projects, either in front-end (what the user sees), and back-end (which helps improving productivity by internal, and which the end user is not aware). Example of front-end feature : displaying enemies health points. Example of back-end feature : an audio manager. There are also tasks of level design, game design (general balancing of the game), network (discussion with a remote server, requests to a database). For the maintenance part, it is about bug fixing, re-balancing, and reinfor- cing security to avoid hacking. This report deals with two projects of Vandal Games on which I had the chance to work, and their method of operation are pretty different ; that is why the tasks presented in this abstract remain relatively generic, to simultaneously describe my activity on these two projects. Keywords : programming, tools, real-time, mobile app, network Arthur Cousseau Page 2 26 Aoˆut 2016
  4. 4. 3 Remerciements Je tiens ici `a remercier toutes les personnes qui m’ont aid´e durant mon stage, qui m’ont apport´e leurs id´ees et leurs conseils, et toutes les personnes qui ont bien voulu m’accorder ne serait-ce qu’un peu de leur temps pour r´epondre `a mes nombreuses questions ; Je remercie tout particuli`erement mon tuteur de stage, M. Kien-Van Tram, pour sa disponibilit´e, son esprit d’´equipe, son dynamisme et son optimisme sans faille mˆeme dans les moments difficiles, et pour son aide `a tous les niveaux. Et de mani`ere g´en´erale, toute l’´equipe de Vandal Games, les anciens comme les nouveaux, pour leur sympathie et leur exp´erience. Arthur Cousseau Page 3 26 Aoˆut 2016
  5. 5. Table des mati`eres 4 Table des mati`eres 1 Avant-propos 5 2 Heroes Story 7 2.1 Contexte et description du projet . . . . . . . . . . . . . . . . 7 2.2 Enjeux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.2.1 ´Economique . . . . . . . . . . . . . . . . . . . . . . . . 10 2.2.2 Social . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.3 Pr´esentation de l’existant . . . . . . . . . . . . . . . . . . . . 15 2.4 Technologies et outils utilis´es . . . . . . . . . . . . . . . . . . 24 2.5 M´ethodes de gestion de projet . . . . . . . . . . . . . . . . . . 25 2.5.1 Trello . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.5.2 Git, SourceTree et BitBucket . . . . . . . . . . . . . . 27 2.6 M´ethodes de travail . . . . . . . . . . . . . . . . . . . . . . . 30 2.6.1 La structure Client - Serveur - GameCore . . . . . . . 30 2.6.2 La base de donn´ees - WTServer . . . . . . . . . . . . . 32 2.6.3 Les fichiers de traduction . . . . . . . . . . . . . . . . 34 2.7 Mise en œuvre . . . . . . . . . . . . . . . . . . . . . . . . . . 35 2.7.1 Le gestionnaire audio . . . . . . . . . . . . . . . . . . 36 2.7.2 Le script AudioBusiness . . . . . . . . . . . . . . . . . 42 2.7.3 La cam´era . . . . . . . . . . . . . . . . . . . . . . . . . 44 2.7.4 Le glisser-d´eposer des personnages . . . . . . . . . . . 49 2.8 Bilan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 2.8.1 Le projet . . . . . . . . . . . . . . . . . . . . . . . . . 56 2.8.2 Retour d’exp´erience . . . . . . . . . . . . . . . . . . . 56 2.8.3 Poursuites . . . . . . . . . . . . . . . . . . . . . . . . . 57 3 NHL Figures 58 3.1 Contexte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 3.2 Enjeux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 3.3 M´ethodes de fonctionnement . . . . . . . . . . . . . . . . . . 59 3.4 Pr´esentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 3.5 Mise en œuvre . . . . . . . . . . . . . . . . . . . . . . . . . . 61 3.6 Bilan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 4 Glossaire 65 Arthur Cousseau Page 4 26 Aoˆut 2016
  6. 6. 1 Avant-propos 5 1 Avant-propos Dans le cadre de ma derni`ere ann´ee de formation au Master IVI 1, j’ai effectu´e un stage d’une dur´ee de 22 semaines au sein de la compagnie Vandal Games, `a Montr´eal. Bien que la r´ealit´e virtuelle soit au centre de ma for- mation, et bien que j’aie eu l’opportunit´e d’effectuer un stage prestigieux 2 dans ce domaine `a Montr´eal, le monde du jeu vid´eo m’a toujours fortement attir´e et le Master m’a beaucoup appris dans ce domaine ´egalement, raison pour laquelle mon profil ´etait int´eressant pour Vandal Games et raison pour laquelle j’ai aussitˆot accept´e. L’enjeu d’un stage dans le jeu vid´eo `a Montr´eal ´etait tr`es fort, la ville ´etant maintenant largement consid´er´ee comme la capitale mondiale pour l’activit´e en question : c’est donc pour moi un choix de carri`ere `a long terme, qui me permettra je l’esp`ere, d’ouvrir plus facilement de nouvelles portes `a l’avenir. Vandal Games, fond´ee en 2011, est une microentreprise 3 puisqu’elle comptait `a mon arriv´ee au mois d’avril 6 salari´es et un stagiaire. Au fil des mois, la composition de l’´equipe a chang´e et ´etait globalement de 4 salari´es et 5 stagiaires. La hi´erarchie peu complexe (un pr´esident, un vice-pr´esident et des salari´es) et la petite taille de l’´equipe ´etaient des atouts pour faciliter les ´echanges. `A mon arriv´ee, Vandal Games avait d´ej`a `a son actif un jeu massivement multijoueur disponible sur le r´eseau Facebook, un projet de jeu mobile mis de cˆot´e, et deux autres projets en cours de d´eveloppement, qui sont ceux sur lesquels j’ai travaill´e. Ces deux projets fonctionnent diff´eremment, puisque l’un est un projet imagin´e par Vandal Games et dont la compagnie a donc l’enti`ere possession, tandis que l’autre est une commande de la part d’une autre compagnie, Imports Dragon, avec qui l’on faisait r´eguli`erement des r´eunions de mise au point et d’avancement. Les deux projets utilisent activement la connexion internet pour lier les utilisateurs, mais l`a encore, ce sont deux mani`eres de faire auxquelles il a fallu que je m’adapte : tandis que le projet personnel de Vandal Games utilise un framework propri´etaire 4, un serveur et une base de donn´ees payante `a l’usage, le projet command´e par Import Dragons utilise une API 5 nomm´ee PlayFab, disponible pour les entreprises comme pour les particuliers, et dont le site Internet permet de se servir d’une version gratuite mais minimaliste, ou de forfaits aux prix plus ou moins ´elev´es selon les besoins, `a l’instar du moteur Unity3D. 1. Ing´enierie du Virtuel et de l’Innovation. A chang´e de nom depuis. + d’infos 2. Felix & Paul m’avait ´egalement propos´e un stage. + d’infos 3. Anciennement TPE (Tr`es Petite Entreprise). + d’infos 4. Un ensemble de fonctionnalit´es d´evelopp´e par la compagnie pour son propre usage. 5. Abr´eviation anglaise pour Interface de Programmation. + d’infos Arthur Cousseau Page 5 26 Aoˆut 2016
  7. 7. 1 Avant-propos 6 Et pour finir, bien que mon activit´e principale sur ces deux projets a ´et´e la programmation, en tenant compte des diff´erences ´enonc´ees pr´ec´edemment, il apparaˆıt ´evident que les obstacles que j’ai pu rencontrer et les solutions que j’ai pu trouver ´etaient bien diff´erents et tout aussi int´eressants sur l’un comme sur l’autre ; c’est pourquoi ce rapport sera scind´e en deux grandes parties, chacune concernant l’un des projets. La partie concernant le projet command´e par Imports Dragon sera cependant moins volumineuse, puisque j’ai ´et´e assign´e `a ce projet bien moins de temps qu’au premier (4 semaines sur 22). Arthur Cousseau Page 6 26 Aoˆut 2016
  8. 8. 2 Heroes Story 7 2 Heroes Story 2.1 Contexte et description du projet Heroes Story est le successeur spirituel du premier jeu de la compagnie : Big Story Little Heroes, qui est un MOBA 6 jouable sur le r´eseau social Face- book. La compagnie a ´et´e fond´ee en 2011 et le jeu est sorti l’ann´ee suivante, avec parfois des dizaines de milliers de joueurs par mois. Le d´eveloppement de Heroes Story a d´emarr´e en novembre 2015. L’id´ee de d´epart ´etait de reprendre la plupart des ´el´ements de Big Story Little Heroes (´el´ements gra- phiques, certaines m´ecaniques de jeu), afin de faire grandir et ´evoluer l’uni- vers tout en offrant aux joueurs du premier opus une transition en douceur. Figure 1 – Big Story Little Heroes, le premier jeu de Vandal Games. Heroes Story est cependant loin d’ˆetre une simple copie de son aˆın´e : il est plus ambitieux, plus complexe, s’adresse `a un plus large public, et l’´equipe est forte de son exp´erience sur Big Story Little Heroes. Toutefois, de nombreux morceaux de code ont pu ˆetre repris plutˆot que de repartir de z´ero, afin de gagner du temps. Par exemple, le VandalFramework, qui avait ´et´e d´evelopp´e `a l’occasion du premier jeu, est totalement int´egr´e et largement r´eutilis´e dans Heroes Story. Cela concerne notamment des fonctionnalit´es de GUI 7, comme des cr´eations de fenˆetres personnalisables `a la vol´ee, ou encore des m´ethodes dites de pooling 8 afin d’all´eger les performances (le mobile est une plateforme exigeante `a ce niveau, nos smartphones ´etant bien moins puissants que nos ordinateurs). 6. Abr´eviation anglaise d’Ar`ene de Bataille en Ligne Multijoueur. 7. Abr´eviation anglaise d’Interface Graphique. + d’infos 8. Conservation des ressources plutˆot que d’aller les chercher en temps r´eel. + d’infos Arthur Cousseau Page 7 26 Aoˆut 2016
  9. 9. 2 Heroes Story - 2.1 Contexte et description du projet 8 Pour ce nouvel opus, on retrouve une influence de la part de jeux mobiles mondialement connus, influences tant dans le style graphique que dans les m´ecanismes de jeu. Figure 2 – De gauche `a droite : Clash Royale, Heroes Charge, Boom Beach. La m´ecanique principale de ces jeux, et de Heroes Story, est la sui- vante : on effectue des combats (contre une intelligence artificielle ou un autre joueur), on gagne des r´ecompenses, qui nous permettent de devenir plus fort, et donc d’acc´eder `a de nouvelles zones du jeu, voire grimper dans le classement dans le cas d’un jeu massivement multijoueur (c’est le cas de Heroes Story et des 3 jeux pr´esent´es ci-dessus). On peut tester l’efficacit´e de ce genre de mod`eles `a l’aide d’une Core Loop par exemple, un sch´ema qui traduit de la fa¸con la plus simple possible les m´ecanismes du jeu, afin d’en cerner au mieux le potentiel, de d´efinir ses points d’int´erˆets, et enfin et surtout, d’en ´evaluer le capital ludique (Fig. 3). Tous ces jeux font en fait partie d’une mˆeme et grande famille : les jeux de rˆole, dont le tout premier et c´el`ebre repr´esentant est Dungeons & Dragons, cr´e´e dans les ann´ees 1970, qui a pos´e les bases du genre et popularis´e la m´ecanique de Porte-Monstre-Tr´esor. Cette m´ecanique est finalement tr`es ancienne, puisqu’elle-mˆeme fond´ee sur les principes de base d’un roman : la Porte repr´esente la question, l’intrigue, l’´ev´enement qui bouscule le h´eros et le lance `a l’aventure ; le Monstre repr´esente le danger, les p´erip´eties, les d´efis `a relever ; et enfin, le Tr´esor repr´esente l’objectif, la quˆete, l’enjeu, ce pour quoi le h´eros s’´etait mis en chemin au d´epart. Arthur Cousseau Page 8 26 Aoˆut 2016
  10. 10. 2 Heroes Story - 2.1 Contexte et description du projet 9 Figure 3 – La Core Loop de Heroes Story, tir´ee du Game Design Document d’origine. `A partir de ce genre de sch´ema, il est plus facile d’orienter ses id´ees et ses choix pour le jeu. Il peut ´egalement permettre de r´ev´eler certaines failles ou certaines faiblesses, tr`es tˆot dans la conception, puisque le sch´ema concerne le principe mˆeme du jeu (d’o`u le terme Core , qui peut ˆetre traduit par noyau en anglais). Le Game Design Document (commun´ement abr´eg´e en GDD), est essen- tiel pour poser les premi`eres briques du projet et commencer `a d´evelopper un prototype. On peut donc presque dire qu’il est l’´equivalent d’un ´Etat de l’art. Il peut concerner le cheminement du joueur dans les menus, les techno- logies utilis´ees, il peut inclure des croquis, des tableaux de statistiques, etc. Sa structure varie tr`es grandement d’un jeu `a l’autre et d´epend d’un grand nombre de facteurs, par exemple : le budget, le genre abord´e, le public cibl´e. Dans le GDD ´etabli par Vandal Games se trouvent les premi`eres id´ees pour le jeu, depuis la description de certains personnages jusqu’aux valeurs par d´efaut de certaines donn´ees pr´ecises (le montant des r´ecompenses, par exemple). Y sont rassembl´ees ´egalement des r´ef´erences `a ce qui a motiv´e la cr´eation du jeu : visuels de personnages tir´es de films, de bande dessin´ees, de jeux vid´eo... Un aspect important du document est le mod`ele ´economique adopt´e. On ne le retrouve pas dans tous les GDD, puisque tous les jeux ne sont pas `a but lucratif, mais pour le march´e que vise Vandal Games (`a savoir le march´e du mobile), c’est un point essentiel puisqu’il est la principale (si ce n’est l’unique) source de rentabilit´e du projet. Et comme on peut s’en douter, la rentabilit´e d’un projet professionnel est un enjeu crucial. Arthur Cousseau Page 9 26 Aoˆut 2016
  11. 11. 2 Heroes Story - 2.2 Enjeux 10 2.2 Enjeux Comme nous venons de le voir, le GDD permet notamment de d´efinir les enjeux du projet. C’est mˆeme un des points que l’on aborde forc´ement lorsque l’on r´edige ce genre de document, pour une raison simple : s’il n’y a pas d’enjeu, il n’y a pas de projet. 2.2.1 ´Economique Et l’enjeu de Vandal Games est avant tout ´economique : `a partir du moment o`u c’est une entreprise, il va de soi que l’enjeu principal du projet est de pouvoir gagner suffisamment afin que la compagnie puisse continuer `a exercer son activit´e. En cela, les enjeux du projet sont donc bien diff´erents de ceux d’un projet de recherche scientifique, par exemple ; il y a bien sˆur des d´efis techniques `a relever, comme cela peut ˆetre le cas lors d’une d´emarche scientifique, mais l’enjeu premier ici n’est pas de r´ealiser une d´ecouverte, ni de prouver ou r´efuter une hypoth`ese de d´epart. Ici, il n’est pas question de s’interroger sur un sujet : les r`egles de d´eveloppement d’un jeu vid´eo sont bien connues et largement partag´ees `a travers le monde depuis maintenant plusieurs d´ecennies, et l’on se sert de ces connaissances pour faire avancer le projet. Ce qui est, encore une fois, `a l’inverse d’une d´emarche scientifique, qui va parfois poser de nouvelles questions et s’aventurer peut-ˆetre en terrain inconnu afin de tenter de les r´esoudre. Un des m´ecanismes qui sera exploit´e dans le projet au sujet de l’´economie, est un syst`eme d’advertising tr`es typique du monde des jeux pour mobile. Nous le disions pr´ec´edemment, les r`egles de d´eveloppement d’un jeu vid´eo sont d´esormais bien ´etablies et il est possible de trouver sur le web des milliers d’articles traitant de sujets extrˆemement sp´ecifiques, per- mettant de r´epondre `a toutes les questions que l’on pourrait se poser, par exemple : Devrais-je placer ce bouton au centre de ma fenˆetre ou dans un coin ? Existe-t-il un expert qui a pos´e les bases de ce genre de choses ? Et bien souvent, la r´eponse `a cette derni`ere question est oui. L’advertising pour mobile n’´echappe pas `a cette r`egle : on peut trouver tr`es facilement un guide officiel 9 expliquant comment proc´eder afin de rendre la technique la plus ef- ficiente possible (Fig. 4). Ces guides ne semblent pas issus de d´emarches scientifiques, ayant prouv´e le bien-fond´e de leurs m´ethodes, et pourtant les r`egles qu’ils d´ecrivent et imposent sont admis de mani`ere g´en´erale, ce qui pourrait ˆetre sujet `a un d´ebat dans lequel nous n’entrerons pas ici. Mˆeme le g´eant Google poss`ede ses propres recommandations 10. 9. Source : Mobile Advertising Guidelines 10. Source : About mobile ads Arthur Cousseau Page 10 26 Aoˆut 2016
  12. 12. 2 Heroes Story - 2.2 Enjeux 11 Figure 4 – Exemple de m´ethodologie pour une publicit´e sur mobile. Le jeu ´etant d´evelopp´e avec le moteur Unity3D, la solution qui a ´et´e choisie pour int´egrer ces concepts est Unity Ads, syst`eme con¸cu sp´ecialement pour le moteur et donc totalement int´egr´e `a celui-ci, poss´edant donc de nombreux atouts : il est gratuit, poss`ede un support sous forme de forum, et compatible avec tout type de plateforme (iOS, Android). Unity Ads permet d’afficher `a n’importe quel moment du jeu (d´efini dans le code), une vid´eo promotionnelle et un ´ecran de redirection tout `a fait traditionnel et reprenant les codes de communication vus dans la figure pr´ec´edente. L’application du proc´ed´e d’advertising donne donc ce genre de r´esultat : Figure 5 – Exemple type de publicit´e pour mobile. On retrouve certains des ´el´ements de communication pr´esent´es dans la Fig. 4 : le nom du jeu, l’´editeur (en bas `a droite), les liens directs pour obtenir le jeu sur les diff´erentes plateformes mobiles, et un aper¸cu du jeu. Le joueur peut ˆetre forc´e `a regarder ce genre de publicit´es, ou il peut d´elib´er´ement choisir de les regarder. Il peut y ˆetre forc´e `a un moment pr´ecis (`a la fin d’un niveau), ou `a intervalles r´eguliers (toutes les deux minutes, par exemple). Cette pratique est de moins en moins courante car peu appr´eci´ee des joueurs, pour des raisons ´evidentes : le jeune public est vuln´erable face Arthur Cousseau Page 11 26 Aoˆut 2016
  13. 13. 2 Heroes Story - 2.2 Enjeux 12 au contenu (et `a la nature mˆeme d’une publicit´e), et cela casse l’immersion dans le jeu... On utilise donc de plus en plus souvent la seconde m´ethode, `a savoir que le joueur peut express´ement choisir de les regarder. Une telle chose est inconcevable `a la t´el´evision, mais le jeu vid´eo a cette particularit´e qu’il est un m´edia interactif : on peut donc r´ecompenser le joueur s’il accepte de regarder une publicit´e (Fig. 6). Figure 6 – Regarder une publicit´e peut nous faire gagner de l’argent virtuel (bande jaune sur l’image). Pour finir notre tour d’horizon sur les m´ethodes utilis´ees par le projet pour r´epondre `a son enjeu ´economique, nous allons aborder le principe de monnaie secondaire (ou hard currency en anglais). Ce principe de monnaie secondaire est directement li´e `a la tr`es forte inflation qui a lieu depuis quelques ann´ees dans le domaine des jeux vid´eo pour mobile. Avant que les t´el´ephones portables existent, la plupart des jeux vid´eo n’utilisait qu’une seule monnaie, g´en´eralement des pi`eces d’or. Mais avec l’explosion du march´e des smartphones, est n´ee une industrie : le jeu pour mobile. Les jeux ´etaient tout d’abord payants, pour la tr`es grande majorit´e, puis vint le mod`ele d´esormais largement r´epandu de Free-To-Play (abr´eg´e en F2P). Le principe d’un Free-To-Play est simple : plutˆot que de demander `a un utilisateur d’acheter le jeu avant mˆeme de pouvoir y jouer, on lui propose de le t´el´echarger gratuitement, et il aura la possibilit´e une fois en jeu de payer pour des services suppl´ementaires. L’avantage pour le joueur est de pouvoir essayer le jeu avant d’y mettre de l’argent : c’est, pour lui, la preuve que le d´eveloppeur du jeu souhaite faire preuve de transparence. L’avantage pour le d´eveloppeur est de pouvoir proposer `a l’utilisateur de tester son produit sans engagement ni contrepartie, et c’est `a lui de faire en sorte que le joueur voudra investir dans son produit, en le rendant attractif. Arthur Cousseau Page 12 26 Aoˆut 2016
  14. 14. 2 Heroes Story - 2.2 Enjeux 13 Le mod`ele eut un succ`es si d´emesur´e que les d´eveloppeurs de jeu mobile ont rapidement dˆu trouver une solution afin d’ˆetre r´emun´er´es, ayant de plus en plus de mal `a sortir du lot au fur et `a mesure que de nouveaux studios faisaient leur apparition partout sur la plan`ete, envahissant les magasins virtuels de leurs cr´eations. Les applications ´etant d´esormais toutes gratuites et extrˆemement nombreuses, on comprend ais´ement qu’il soit difficile de se faire remarquer. En 2013 d´ej`a, 1250 applications sortaient quotidiennement sur Google Play 11, magasin virtuel comptabilisant aujourd’hui le plus grand nombre d’applications sur la plan`ete (plus de 2 millions). Est alors venue l’id´ee d’utiliser un second type de monnaie, qui se- rait bien plus difficile `a obtenir en jeu, voire impossible. Tout l’int´erˆet des d´eveloppeurs est de proposer au joueur de payer en argent r´eel pour obtenir cette seconde monnaie, qui va lui permettre d’acc´eder `a du nouveau contenu dans le jeu, et/ou de progresser plus vite. Figure 7 – Les transactions propos´ees dans le jeu Clash of Clans. Ce proc´ed´e a vu fleurir des compagnies sp´ecialis´ees dans le consulting, qui ´etudient les ficelles de cette nouvelle m´ecanique et proposent leurs ser- vices afin d’adapter le mod`ele aux besoins des compagnies de jeux vid´eo. Le site internet Gamasutra en est un bon exemple, dont le slogan peut diffici- lement ˆetre plus explicite : The Art & Business of Making Games , et qui publie r´eguli`erement des articles dont les d´eveloppeurs peuvent s’inspirer pour am´eliorer leur syst`eme 12. La monnaie secondaire est devenue aujourd’hui la source principale de rentabilit´e pour les d´eveloppeurs du monde du mobile, puisque le mod`ele de Free-To-Play s’est d´esormais impos´e comme un standard qu’il sera difficile de renverser. 11. Source : Quora.com (calcul bas´e sur une moyenne mensuelle entre 2009 et 2013). 12. Un exemple d’´etude : The Design of Free-to-Play Games Arthur Cousseau Page 13 26 Aoˆut 2016
  15. 15. 2 Heroes Story - 2.2 Enjeux 14 2.2.2 Social L’autre enjeu du projet est aussi social, et directement li´e `a l’enjeu ´economique : un des objectifs du projet est de faire connaˆıtre la compa- gnie par le biais de son jeu, le lien avec l’aspect ´economique ´etant bien sˆur que si elle se fait connaˆıtre, elle g´en´erera plus de revenus. L’entreprise peut, tout comme dans n’importe quel domaine autre que celui du jeu vid´eo, faire appel `a une agence de publicit´e, mais elle peut aussi faire sa publicit´e elle- mˆeme, `a l’int´erieur de son produit. Les liens sociaux `a l’int´erieur du jeu vont conduire les joueurs `a cr´eer des communaut´es, `a interagir entre eux, les joueurs pourront alors en parler `a leurs amis, et c’est toute une base de fans qui va se constituer autour du jeu et donc, de l’entreprise. Ensuite, lorsque la compagnie sortira un nouveau jeu, elle pourra en faire la promotion dans ses autres productions, et il y aura de plus grandes chances pour que des joueurs souhaitent essayer le nouveau jeu. Figure 8 – Pr´esentation d’un clan dans le jeu Clash Royale. Pour faciliter la cr´eation de liens sociaux `a l’int´erieur de l’univers du jeu, il a donc ´et´e mis en place un syst`eme d’alliances, ainsi qu’un chat pour les joueurs membres de chaque alliance. On ne peut donc parler qu’avec les membres de sa propre alliance, ce qui renforce le sentiment d’appar- tenance et les liens sociaux entre les membres. Il y a ´egalement un classement intra-alliance, ce qui accentue l’as- pect de comp´etition et incite les joueurs `a jouer plus pour d´epasser leurs amis. Ce principe d’alliance est ancien, mais pour le d´eveloppement de Heroes Story, son fonctionnement est principalement inspir´e de celui de Clash Royale (Fig. 8). Comme dans Clash Royale, on retrouvera donc dans Heroes Story la pos- sibilit´e de cr´eer un clan, d’en rejoindre un existant, de licencier un membre, de partir de soi-mˆeme... Il existe un chat intra-alliance, une description du clan ainsi que son nom, et la possibilit´e d’investir des sommes d’argent vir- tuel dans l’alliance pour la faire progresser. Arthur Cousseau Page 14 26 Aoˆut 2016
  16. 16. 2 Heroes Story - 2.3 Pr´esentation de l’existant 15 2.3 Pr´esentation de l’existant Maintenant que nous avons d´efini le contexte et les enjeux du projet, nous pouvons nous pencher sur l’aspect plus pratique de la pr´esentation du projet : concr`etement, nous allons ici montrer quelques captures d’´ecran du jeu, afin de mieux comprendre par la suite quelles ont ´et´e les difficult´es rencontr´ees durant la mise en oeuvre, et quelles solutions ont ´et´e trouv´ees. Figure 9 – L’´ecran de d´emarrage du jeu. Cette sc`ene est appel´ee le Lobby : c’est ici que le joueur acc`ede aux diff´erents modes de jeu, qu’il peut aller `a la boutique, discuter avec les autres membres de son alliance, ou encore ´echanger du contenu avec d’autres joueurs. Il peut construire et am´eliorer diff´erents bˆatiments, lui octroyant divers bonus. On voit en haut de l’´ecran, les deux monnaies du jeu, l’or et les couronnes, ainsi que l’´energie (la viande en haut `a gauche). Le joueur doit d´epenser de l’´energie pour jouer une partie. Lorsque l’´energie du joueur n’est pas `a son maximum, il en regagne petit `a petit automatiquement, avec le temps. Il peut en acheter en boutique avec la monnaie secondaire (les couronnes) s’il d´esire rejouer tout de suite. On voit ´egalement `a gauche, une barre d’options qui peut ˆetre masqu´ee. Elle donne acc`es `a l’alliance du joueur, au classement g´en´eral, aux troph´ees et, notamment, `a la col- lection des h´eros. Certaines options sont pr´evues en jeu mais pas encore impl´ement´ees : le mode Joueur contre Joueur, le mode Exploration, les Quˆetes. Arthur Cousseau Page 15 26 Aoˆut 2016
  17. 17. 2 Heroes Story - 2.3 Pr´esentation de l’existant 16 Figure 10 – Le cœur du jeu : les h´eros ! On commence le jeu avec un seul h´eros, et on en acquiert un deuxi`eme `a la fin de la premi`ere partie. Ensuite, il faut les acheter en boutique, avec de l’or ou des couronnes. Certains sont plus rares que d’autres (par exemple, Dylan, le h´eros bleu, en bas `a droite). Chaque h´eros poss`ede ses caract´eristiques propres, et un style de jeu diff´erent. Le joueur les garde `a vie et peut en utiliser jusqu’`a 4 pendant une partie, il doit donc prendre soin `a constituer une ´equipe qui lui donne les meilleures chances de r´eussir en fonction de l’objectif et de la configuration de la partie. Figure 11 – Les caract´eristiques d’un h´eros. Arthur Cousseau Page 16 26 Aoˆut 2016
  18. 18. 2 Heroes Story - 2.3 Pr´esentation de l’existant 17 Sur la Fig. 11, on peut voir les caract´eristiques d’un h´eros en particulier. Sur cet ´ecran, il est possible de lui faire ´equiper des objets, qui sont gagn´es pendant les parties, et on peut am´eliorer son pouvoir sp´ecial moyennant de l’or et des points d’aptitude. Comme pour l’´energie, les points d’aptitude se r´eg´en`erent avec le temps mais on peut aussi en acheter en boutique contre des couronnes. On peut ´egalement promouvoir le h´eros, c’est ce qui corres- pond aux ´etoiles en bas `a gauche. Ici, le joueur poss`ede 0/10 exemplaires du h´eros. En r´ealit´e, les h´eros sont vus comme des cartes `a collectionner : en boutique, le joueur peut acheter un paquet de cartes, contre de l’or ou des couronnes. En ouvrant son paquet, il va alors recevoir diff´erentes cartes choisies al´eatoirement parmi les listes des h´eros du jeu : si c’est un h´eros qu’il n’avait pas d´ej`a, il le d´ebloque et le gardera `a vie, sinon, cela incr´emente ce compteur de promotion que l’on peut voir en bas `a gauche de la figure (0/10). Une fois que le joueur poss`ede au moins autant d’exemplaires de la carte que la promotion lui demande, il peut promouvoir son h´eros et une ´etoile est donc rajout´ee `a son h´eros (ici, il en a d´ej`a 1/5). La promotion d’un h´eros est diff´erente de son niveau : le h´eros gagne de l’exp´erience et donc des niveaux pendant les parties, tandis que son niveau de promotion lui permet de s’´equiper d’objets plus forts. Figure 12 – On peut ´equiper un h´eros de divers objets. Arthur Cousseau Page 17 26 Aoˆut 2016
  19. 19. 2 Heroes Story - 2.3 Pr´esentation de l’existant 18 En cliquant sur un emplacement d’´equipement, on peut ´equiper son h´eros d’un nouvel objet : on peut voir, pour cet emplacement sp´ecifique, quels sont les objets qui existent dans le jeu que l’on pourra ´equiper. Sur la Fig. 12, comme notre h´eros est de promotion 1, il peut voir les objets du jeu qui sont de promotion jusqu’`a 1. S’il ´etait de promotion maximum (5), il pourrait voir tous les objets du jeu qu’il peut ´equiper `a cet emplacement. En plus de voir les caract´eristiques de l’objet, il y a deux possibilit´es : ´equiper ou trouver. Comme pour les cartes de h´eros, les objets s’accumulent et ont tous un compteur : si je poss`ede deux exemplaires de cet objet, je pourrai en ´equiper un sur ce h´eros, et un sur un autre h´eros. Ici, je ne poss`ede pas l’objet demand´e puisque l’icˆone est gris´ee dans la liste des objets (en haut `a droite de la fenˆetre, Fig. 12). Je ne peux donc pas l’´equiper. Je peux cependant cliquer sur le bouton Find , et il m’emm`enera `a une partie o`u il est possible d’obtenir cet objet. Figure 13 – L’´ecran de s´election des niveaux. Cette sc`ene est appel´ee la Campagne : on peut y acc´eder en cliquant sur le bouton Campagne depuis le Lobby (Fig. 9). Chaque bouton num´erot´e est un niveau : la forme du bouton indique la nature de la partie (ici, le niveau 30 contient un boss). Je peux cliquer sur Home pour revenir au Lobby. En cliquant sur un bouton, je peux voir les d´etails du niveau, et constituer une ´equipe en fonction des ennemis et de l’objectif du niveau (Fig. 14). Arthur Cousseau Page 18 26 Aoˆut 2016
  20. 20. 2 Heroes Story - 2.3 Pr´esentation de l’existant 19 Figure 14 – Le panneau de d´etails d’un niveau. Sur ce panneau, je peux voir l’´equipe que j’ai constitu´ee, `a gauche ; la liste des ennemis, et l’objectif, `a droite ; je peux voir le prix en ´energie du niveau (5) ; et enfin, je peux voir les objets qu’il est possible d’obtenir si je termine le niveau, et quelles sont les chances de les obtenir. Comme nous l’avons vu dans la Fig. 12, en cliquant sur le bouton Find , j’aurais donc ´et´e amen´e directement `a cet ´ecran, puisque c’est dans ce niveau que se trouve l’objet que je recherche. En cliquant sur mes h´eros, `a gauche, je peux changer mon ´equipe autant de fois que je le d´esire avant de commencer le niveau (Fig. 15). Figure 15 – L’´ecran de changement d’´equipe. Arthur Cousseau Page 19 26 Aoˆut 2016
  21. 21. 2 Heroes Story - 2.3 Pr´esentation de l’existant 20 L’ordre dans lequel je dispose mes h´eros n’a pas d’importance pour le cours de la partie. Le bouton Get More Heroes m’am`ene directement `a la boutique, puisque c’est le seul endroit o`u je peux obtenir de nouveaux h´eros. En cliquant sur le bouton Go , si je ne poss`ede pas assez d’´energie, une fenˆetre me proposera d’en acheter contre des couronnes ; et si je n’ai pas assez de couronnes, on me proposera de me rendre directement `a la boutique pour en acheter. Si j’ai assez d’´energie, la partie se lancera. Figure 16 – Le d´ebut de la partie. Le jeu charge alors les informations correspondant `a ce niveau depuis la base de donn´ees : ennemis, obstacles, etc. La m´et´eo est al´eatoire. Je dispose d’un certain temps (en haut) pour terminer le niveau : atteindre la limite de temps imparti est la seule condition de d´efaite. Pour commencer `a jouer, je glisse les personnages de mon ´equipe (en bas) sur le champ de bataille, dans la limite de la ligne verte (`a gauche). Le comportement des h´eros est calcul´e automatiquement par un algorithme : je ne peux pas contrˆoler leur trajectoire, je ne d´ecide pas de qui ils vont attaquer. etc. J’ai cependant deux possibilit´es me permettant d’influer sur le cours de la partie. Lorsque j’ai plac´e un h´eros sur la carte, les actions que je peux effectuer sont : le transporter avec le doigt, ou utiliser son sort. La mort d’un h´eros n’est pas une cause de d´efaite : pass´e un certain temps, il est de nouveau disponible et on peut le remettre sur la carte (je dois encore patienter 12 secondes pour ressusciter mon guerrier, Fig. 17). Arthur Cousseau Page 20 26 Aoˆut 2016
  22. 22. 2 Heroes Story - 2.3 Pr´esentation de l’existant 21 Figure 17 – La partie est bien avanc´ee. On peut voir sur la figure ci-dessus, que la ligne verte a avanc´e : elle correspond en effet toujours `a la position du h´eros qui est all´e le plus loin. Si ce h´eros meurt, la ligne revient alors vers la gauche jusqu’au nouveau h´eros qui est le plus loin. Ce syst`eme permet au joueur de faire revenir rapidement ses h´eros sur la carte lorsqu’ils sont morts, sans qu’ils n’aient `a parcourir toute la carte de gauche `a droite : cela g´en´ererait de la frustration `a cause de l’attente, et de l’´enervement parce que la perte de temps nous rapproche un peu plus de la d´efaite. On voit ´egalement que lorsqu’un h´eros est sur le terrain, son icˆone change pour devenir son sort : le bouton est alors cliquable une fois que le sort est prˆet (ici, aucun sort n’est prˆet, mais on peut voir que celui du troisi`eme h´eros est en train de charger et en est `a environ 40%). La barre verte en- dessous de chaque icˆone correspond aux points de vie de chaque h´eros. On retrouve ´egalement ces barres vertes sur la carte, suivant chaque h´eros, afin d’avoir une meilleure vue de l’action et pouvoir ´etablir une strat´egie. Par exemple, si un h´eros est sur le point de mourir, je peux vouloir le prendre pour l’amener en lieu sˆur, en le glissant-d´eposant avec mon doigt. Lorsque tous les ennemis sont vaincus, et la statue d´etruite, l’´ecran de victoire apparaˆıt (Fig. 18). Arthur Cousseau Page 21 26 Aoˆut 2016
  23. 23. 2 Heroes Story - 2.3 Pr´esentation de l’existant 22 Figure 18 – La partie est termin´ee, c’est l’heure des r´ecompenses ! Une fois la partie termin´ee, le joueur gagne de l’exp´erience, et chacun de ses h´eros ´egalement. Il gagne ´egalement de l’or, qui lui permettra d’investir dans des am´eliorations de bˆatiments, ou dans l’achat de nouveaux h´eros. S’il a ´et´e chanceux, il gagne ´egalement les ´equipements associ´es au niveau (ici, il a gagn´e les deux). On voit ´egalement qu’il y a un nombre d’´etoiles associ´e `a chaque niveau. On gagne des ´etoiles en remplissant des objectifs qui ne sont pas propres `a chaque niveau, mais qui sont g´en´eraux : — Une ´etoile pour avoir termin´e le niveau. — Une deuxi`eme ´etoile si tous les ennemis sont morts. — Une troisi`eme ´etoile si aucun des h´eros n’est mort. La base de donn´ees garde en m´emoire le nombre maximal d’´etoiles qui a ´et´e gagn´e sur chaque niveau : si le joueur joue un niveau qu’il avait d´ej`a termin´e avec 3 ´etoiles, mais que cette fois il n’en gagne que 2, le jeu lui affichera toujours 3 ´etoiles. Arthur Cousseau Page 22 26 Aoˆut 2016
  24. 24. 2 Heroes Story - 2.3 Pr´esentation de l’existant 23 Et pour finir, voici deux autres figures qui montrent la boutique, et les troph´ees dont nous aurons l’occasion de reparler dans la section Mise en oeuvre. Figure 19 – La boutique. Figure 20 – Les troph´ees. Arthur Cousseau Page 23 26 Aoˆut 2016
  25. 25. 2 Heroes Story - 2.4 Technologies et outils utilis´es 24 2.4 Technologies et outils utilis´es Nous allons terminer cette introduction par un tour d’horizon des techno- logies et des outils (logiciels...) utilis´es par Vandal Games pour mener `a bien ce projet. Certains de ces outils et de ces technologies seront pr´esent´es plus en d´etails dans quelques instants, dans les sections concernant les m´ethodes de gestion de projet et de travail ; ceci n’est donc qu’un bref aper¸cu. — En premier lieu, on peut citer le logiciel Unity3D. De plus en plus populaire ces derniers temps, ce moteur de rendu a su conqu´erir un public de plus en plus large (tant les particuliers que les entreprises comme c’est notre cas), grˆace `a des arguments de poids : sa por- tabilit´e (possibilit´e de d´evelopper sur plus d’une vingtaine de pla- teformes, allant du mobile `a la console de salon en passant par le web), sa simplicit´e (m´ethode de scripting, interface WYSIWYG 13), son prix (gratuit, ou forfait mensuel pour quelques avantages dispen- sables)... Il est notamment tr`es utilis´e par les petits studios, dans les game jams 14 pour prototyper rapidement un jeu, ou encore pour les exp´eriences scientifiques utilisant des nouvelles technologies (Oculus Rift, Leap Motion, HTC Vive...). — Coupl´e `a Unity3D, la programmation est faite avec l’IDE 15 Visual Studio, qui est devenu gratuit au cours de l’ann´ee 2015. Unity poss`ede un IDE int´egr´e au moteur nomm´e MonoDevelop, mais il est actuel- lement bien moins avanc´e que Visual Studio. — Le langage de programmation utilis´e est le C#. Unity supporte ´egalement le Javascript, le Boo et le UnityScript, mais le C# reste le grand favori, notamment pour sa syntaxe et sa richesse (documen- tation et support en ligne, possibilit´es propres au langage). — C’est Windows qui sera utilis´e pour d´evelopper tout au long du projet, puisque Visual Studio n’est actuellement disponible que sur ce syst`eme d’exploitation. Nul besoin d’adapter le code pour le d´eveloppement sur iOS : Unity le fait automatiquement. Seul un Mac est n´ecessaire pour compiler la version finale. — Les langages utilis´es pour converser avec la partie serveur sont : PHP pour traiter les informations, et MySQL pour modifier la base de donn´ees. — Le projet est g´er´e `a l’aide de Trello et SourceTree. Trello est un site web permettant de g´erer des projets de mani`ere agile (`a la mani`ere de Redmine), et SourceTree est un outil collaboratif permettant `a cha- cun de transf´erer r´eguli`erement son travail sur les postes des autres membres de l’´equipe. 13. Acronyme pour What You See Is What You Get. Sur Unity, en temps r´eel, un aper¸cu du programme est visible `a tout moment, sans compilation pr´ealable. 14. Comp´etition de d´eveloppement de jeux vid´eo en temps limit´e (souvent 24 heures). 15. En fran¸cais EDI, acronyme pour Environnement de D´eveloppement Int´egr´e. Arthur Cousseau Page 24 26 Aoˆut 2016
  26. 26. 2 Heroes Story - 2.5 M´ethodes de gestion de projet 25 2.5 M´ethodes de gestion de projet Dans cette sous-section, seront pr´esent´ees les technologies relatives `a la gestion de projet, et quelle m´ethode de gestion a ´et´e utilis´ee. 2.5.1 Trello Trello est un outil de gestion de projet prenant la forme d’un site web, `a l’utilisation gratuite, bien que certains services (tout `a fait dispensables) demeurent payants. Lanc´e fin 2011, Trello compte d´esormais plus de dix mil- lions d’utilisateurs 16 et est largement utilis´e dans tous types d’entreprises. Il peut tr`es bien ˆetre ´egalement utilis´e dans la vie de tous les jours, pour plani- fier mariages, anniversaires... Son interface en fait un ex´ecutant formidable pour la m´ethode agile Scrum. En effet, un board Trello se pr´esente sous la forme d’un ensemble de cartes, elles-mˆemes regroup´ees dans des listes. Chaque carte repr´esente une tˆache, ou liste de tˆaches `a effectuer. Tout est fait pour coller `a la m´ethode Scrum et son syst`eme de post-it sur tableau. Figure 21 – Aper¸cu du board Trello de Heroes Story au 7 aoˆut 2016. Il est possible d’assigner `a une carte des membres de l’´equipe, des cou- leurs, il est possible d’´ecrire des commentaires, on peut y joindre des fichiers en tout genre : images, vid´eos... Le code couleur utilis´e est `a d´efinir soi- mˆeme. Un simple glisser-d´eposer permet de d´eplacer les cartes d’une liste `a une autre. Voici un exemple de carte, o`u l’on peut voir quelles couleurs sont utilis´ees pour le projet et `a quoi elles correspondent (Fig. 22) : 16. Source : Business Insider UK Arthur Cousseau Page 25 26 Aoˆut 2016
  27. 27. 2 Heroes Story - 2.5 M´ethodes de gestion de projet 26 Figure 22 – Exemple d’une carte avec checklist sur Trello. On peut cependant remarquer qu’il manque `a l’outil certains ´el´ements typiques de la m´ethode Scrum, notamment la notion d’effort, utile pour quantifier le temps qu’il va falloir consacrer `a une tˆache. Fort heureusement, Trello dispose d’un syst`eme de plugins (traductible par extensions ou modules , en fran¸cais) qui permet aux d´eveloppeurs d’ajouter des fonc- tions `a l’outil ; et il en existe un pour rajouter cette notion d’effort ! Un board Trello poss´edant cette extension sera alors tout `a fait utilisable pour la m´ethode Scrum : Figure 23 – Un board Trello fa¸con Scrum. On peut y voir pour chaque liste, la somme des scores d’effort des cartes pr´esentes dans la liste : tr`es utile afin de savoir si le sprint est ´equilibr´e (s’il va prendre trop, ou trop peu de temps `a effectuer). Arthur Cousseau Page 26 26 Aoˆut 2016
  28. 28. 2 Heroes Story - 2.5 M´ethodes de gestion de projet 27 2.5.2 Git, SourceTree et BitBucket SourceTree est un logiciel proposant une interface graphique pour le syst`eme de versionnement Git, qui sans cela, reste assez obscur `a utiliser pour qui ne connaˆıt pas l’invite de commande. Figure 24 – `A gauche, l’utilisation de Git en ligne de commande. `A droite, l’utilisation de Git avec SourceTree. Git permet `a une ´equipe de travailler en collaboration en mettant en commun toutes les donn´ees relatives au projet (ressources graphiques, fi- chiers sources, etc.). Son utilisation s’av`ere donc particuli`erement pratique dans le cas d’un projet Unity comme c’est le cas de Heroes Story : si j’im- porte une image dans mon projet et que je signale `a Git ce changement, mes coll`egues verront alors eux aussi l’image dans leur projet s’ils demandent `a Git quels sont les derniers changements. Chacun travaille sur une copie locale du projet, et envoie r´eguli`erement son travail sur la copie en ligne (op´eration nomm´ee push ). Lorsque l’on veut r´ecup´erer les derniers changements du projet (op´eration nomm´ee pull ), pour se mettre `a jour, on t´el´echarge en fait depuis le serveur seulement les fichiers qui ont ´et´e ajout´es, modifi´es ou supprim´es, et pas l’int´egralit´e du projet. Figure 25 – Fonctionnement simplifi´e de Git. Arthur Cousseau Page 27 26 Aoˆut 2016
  29. 29. 2 Heroes Story - 2.5 M´ethodes de gestion de projet 28 Lorsqu’un membre de l’´equipe a termin´e une tˆache sur Trello, il peut la commit puis la push pour envoyer son travail sur le serveur. Les autres membres de l’´equipe re¸coivent une notification sur SourceTree, leur indi- quant qu’ils peuvent pull. S’ils choisissent de pull, il vont directement re- cevoir les changements dans leur espace de travail. L’int´erˆet de fetch avant de pull, est de pouvoir voir quels changements ont ´et´e effectu´es, et s’il y a interf´erence avec ce que l’on est en train de faire actuellement, on peut effectuer un merge , op´eration qui va combiner les changements que l’on a fait avec ceux que l’on essaye de recevoir, afin de ne pas perdre de travail. Pour ne pas ´ecraser le travail des autres, il n’est pas possible de push si l’on a d’abord quelque chose `a pull. En effet, si je push avant de pull, je vais donc annoncer les changements que je fais avant de recevoir ceux des autres, et il y a donc des chances que j’´ecrase des donn´ees. Cette fa¸con de faire est tr`es s´ecuris´ee, puisqu’au moindre probl`eme, il est possible de revenir `a une version pr´ec´edente du projet (Git conserve une copie du projet `a chaque push). On ´evite en fait tout un tas de probl`emes qui peuvent survenir si l’on s’en tient `a une m´ethode traditionnelle de partage de fichiers telle que le transfert des fichiers via support physique (cl´e USB, disque dur..) ou via un serveur qui stockerait le projet. En effet, un syst`eme de versionnement comme Git supprime le facteur de l’erreur humaine : si l’on devait se souvenir de tous les fichiers que l’on a modifi´e avant d’effectuer un transfert, on aurait de fortes chances de se tromper. Si l’on devait `a chaque fois transf´erer tout le projet afin d’´eviter de se tromper, on perdrait du temps. De plus, la technique dite de merge (que l’on peut traduire par fu- sion ) est tr`es puissante, puisqu’elle permet de ne prendre en compte qu’une partie du fichier modifi´e : cela permet `a plusieurs personnes de travailler sur le mˆeme fichier, et Git se chargera de prendre en compte tous les change- ments. Figure 26 – Lors de la mise `a jour d’un fichier, on peut voir ce qui a ´et´e ajout´e (en vert) ou supprim´e (en rouge). Arthur Cousseau Page 28 26 Aoˆut 2016
  30. 30. 2 Heroes Story - 2.5 M´ethodes de gestion de projet 29 Et pour finir, nous allons bri`evement parler de BitBucket, site internet compl´ementaire `a SourceTree et Git et qui se charge de l’h´ebergement de la copie en ligne, que nous avons ´evoqu´ee pr´ec´edemment. BitBucket est un service gratuit, pour des ´equipes jusqu’`a 5 membres, ensuite il devient payant sur la base d’un abonnement mensuel, avec des forfaits diff´erents selon les besoins. Il est donc possible depuis le site de cr´eer un projet `a partir de rien, ou de t´el´everser des fichiers existants si le projet a d´ej`a d´ebut´e. Ensuite, il est n´ecessaire d’ajouter des membres au projet. Les membres du projet seront les seuls qui pourront cloner le pro- jet sur leur poste de travail, et utiliser SourceTree pour modifier le pro- jet h´eberg´e par BitBucket. L’op´eration de clonage consiste `a r´ecup´erer l’int´egralit´e du projet depuis BitBucket vers sa station de travail. Il est donc possible d’ajouter des membres `a l’´equipe mˆeme si le projet est bien avanc´e : le membre en question n’aura qu’`a cloner le projet sur son poste, et il dispo- sera ainsi de la toute derni`ere version du projet, et pourra imm´ediatement commencer `a travailler dessus. Figure 27 – Aper¸cu de BitBucket. En haut `a gauche, l’option pour cloner. En bref, BitBucket est tout simplement l’endroit o`u le projet existe. Le fait qu’il soit h´eberg´e en ligne est une s´ecurit´e suppl´ementaire par rapport `a un poste local. Il semble cependant n´ecessaire de rester vigilants par rapport `a la question de l’h´ebergement en ligne par un tiers : BitBucket assure la confidentialit´e des donn´ees h´eberg´ees, mais comme tout service en ligne, le syst`eme est vuln´erable au piratage. Il est de plus stipul´e dans les conditions d’utilisation 17 que BitBucket d´ecline toute responsabilit´e en cas de vol, ou perte des donn´ees. Si une telle situation survenait, le projet serait perdu, purement et simplement, sans possibilit´e de r´ecup´eration. Il en va donc de la responsabilit´e des utilisateurs de renforcer la s´ecurit´e de la m´ethode en sauvegardant r´eguli`erement des versions du projet sur un support physique, par exemple. 17. Source : Conditions d’utilisation, section 7.5 `a propos de la s´ecurit´e. Arthur Cousseau Page 29 26 Aoˆut 2016
  31. 31. 2 Heroes Story - 2.6 M´ethodes de travail 30 2.6 M´ethodes de travail Dans cette section seront pr´esent´ees les m´ethodes de travail sp´ecifiques `a Heroes Story, m´ethodes que j’ai dˆu apprendre `a connaˆıtre afin de pouvoir commencer `a d´evelopper. 2.6.1 La structure Client - Serveur - GameCore Durant mes ´etudes au Master IVI, j’ai eu `a r´ealiser diff´erents projets utilisant Unity3D. Cependant, je n’avais jamais eu `a faire de jeu d´esign´e sp´ecifiquement pour mobile, et encore moins en r´eseau. C’est donc en ar- rivant chez Vandal Games que j’ai appris qu’un projet Unity pouvait ˆetre d´ecoup´e en plusieurs parties : elles peuvent ˆetre ind´ependantes les unes des autres, tout en fonctionnant ensemble. L’environnement client-serveur, tout d’abord. Figure 28 – Sch´ema de fonctionnement de l’environnement client-serveur Le joueur joue le rˆole de client. Lorsque le joueur souhaite modifier une donn´ee susceptible d’ˆetre communiqu´ee aux autres joueurs (par exemple, s’il change de nom), il en demande tout d’abord l’autorisation au serveur. On appelle cette op´eration une requˆete (ou query en anglais). Le serveur est une machine distante, d´esign´ee pour recevoir des demandes de la part des clients, et envoyer des r´eponses ( response ) en retour. La base de donn´ees ( data ) contient toutes les donn´ees relatives au jeu, et peut donc distri- buer ses connaissances au serveur. Le serveur peut interroger ( search ) la base de donn´ees, afin de traiter ces informations (effectuer des calculs par exemple), avant de renvoyer sa r´eponse au client. Ce sont deux rˆoles bien distincts, deux points de vue sur le jeu, qui sont donc naturellement s´epar´es en deux solutions diff´erentes. Une solution, dans notre contexte, est un ensemble de fichiers source qui permet au projet global de fonctionner. Arthur Cousseau Page 30 26 Aoˆut 2016
  32. 32. 2 Heroes Story - 2.6 M´ethodes de travail 31 Nous avons d’un cˆot´e, la solution du client, qui utilise Unity pour faire fonctionner le jeu : le joueur ex´ecute la solution du client lorsqu’il joue au jeu. La solution serveur, elle, est ´ecrite en pur C#, c’est-`a-dire le mˆeme langage de programmation que pour la solution du client, mais pur dans le sens o`u elle n’utilise pas Unity pour fonctionner. La solution du serveur est ex´ecut´ee par une seule machine, que l’on appelle plus simplement le serveur. Il y a donc autant de solutions clients ex´ecut´ees partout dans le monde qu’il y a de joueurs, mais c’est bel et bien une seule machine qui se charge de traiter toutes leurs demandes et qui se charge de leur r´epondre. Le comportement du serveur (la fa¸con dont le serveur utilise le r´eseau, ses m´ethodes d’envoi et de r´eception de donn´ees) a ´et´e d´evelopp´e en interne par la compagnie `a l’occasion du d´eveloppement de son premier jeu, et porte le nom de vNET. Il existe une troisi`eme et derni`ere solution, dont se servent `a la fois la solution client et la solution serveur pour fonctionner : le GameCore ( noyau du jeu , en anglais). `A l’instar de la solution serveur, le GameCore est ´ecrit en C# pur, et a cette particularit´e qu’il ne connaˆıt ni le client, ni le serveur, en ce sens qu’il ne communique pas avec eux : un changement chez le client ou le serveur n’affectera pas le GameCore. En revanche, l’inverse n’est pas vrai : chaque changement dans le GameCore aura bien un impact sur le client et le serveur. Le GameCore d´ecrit le comportement des diff´erentes entit´es qui existent dans le jeu : caract´eristiques des personnages, des bˆatiments... Il n’a donc pas besoin de connaˆıtre client ou serveur, il n’a mˆeme pas conscience de ces notions : le GameCore est l`a pour expliquer le fonctionnement interne du jeu. C’est par exemple lui qui est charg´e de calculer le d´eroulement d’une partie, en fonction des param`etres qui lui sont donn´es. Le GameCore sait qu’un personnage doit poss´eder un certain nombre de points de vie, mais il ne connaˆıt absolument pas le montant exact. Il effectue simplement des op´erations dessus, suivant divers param`etres. Et c’est en cela que tout changement dans le GameCore influence le comportement du client et du serveur. Pour mat´erialiser cela, on compile le GameCore et on obtient un fichier au format DLL 18 : ce fichier contient de mani`ere condens´ee, tout le code du GameCore, de fa¸con `a ˆetre r´eutilis´e par un autre programme. Et c’est justement ce que font le client et le serveur : ils utilisent ce fichier pour savoir comment la partie est cens´ee se d´erouler, ou quel effet peut avoir l’´evolution d’un bˆatiment par exemple. 18. Abr´eviation anglaise pour Biblioth`eque de Liens Dynamiques. Arthur Cousseau Page 31 26 Aoˆut 2016
  33. 33. 2 Heroes Story - 2.6 M´ethodes de travail 32 Pour r´esumer, voici trois fonctionnalit´es, chacune ayant sa place bien sp´ecifique dans une de ces trois solutions : — Le client s’occupe d’afficher les choses, donc tout ce qui concerne l’affichage est l’affaire du client. Par exemple : l’affichage des barres de vie. — Si le jeu doit comporter un syst`eme de messagerie, c’est bien sˆur l’affaire du client d’afficher les messages, mais c’est surtout au serveur de les distribuer. — Si on veut changer les r`egles de la partie, ou d´ecrire le comportement d’un nouveau sort, c’est dans le GameCore que cela doit ˆetre fait. 2.6.2 La base de donn´ees - WTServer Nous avons rapidement ´evoqu´e la base de donn´ees pr´ec´edemment, lors de la pr´esentation de l’environnement client-serveur ; nous allons avoir l’oc- casion de la d´ecrire plus en d´etails ici. Une base de donn´ees est, grossi`erement, un ensemble de tableaux, nomm´es tables (Fig. 29). Chaque table poss`ede des colonnes avec des noms, et le nombre de lignes est bien souvent ind´etermin´e `a l’avance : si la table doit stocker les informations des joueurs, on ne sait pas combien de joueurs il y aura, mˆeme si on peut bien sˆur limiter ce nombre `a un certain cap. La nature des donn´ees est d´efinie par les d´eveloppeurs : elles peuvent ˆetre des chiffres, des mots, voire mˆeme des fichiers. Il est important de r´efl´echir aux diff´erentes donn´ees qu’il va falloir stocker, puisqu’elles d´efinissent les colonnes de la table : en supprimer une, alors que la table est d´ej`a bien rem- plie, peut faire perdre beaucoup d’informations, tout comme ajouter une colonne peut ˆetre une la tˆache fastidieuse s’il y a d´ej`a 4500 lignes dans la table. Imaginons que nous oubliions de stocker le nom du joueur dans notre table des joueurs, et qu’il y ait d´ej`a plusieurs milliers de joueurs. Ce n’est pas une donn´ee que l’on peut d´eterminer `a l’aide d’un algorithme, de mani`ere automatique : il y aurait alors un gros probl`eme. Figure 29 – Exemple d’une table dans la base de donn´ees de Heroes Story. Arthur Cousseau Page 32 26 Aoˆut 2016
  34. 34. 2 Heroes Story - 2.6 M´ethodes de travail 33 On peut donc ais´ement comprendre qu’il soit crucial de r´efl´echir `a la structure des tables, et donc `a la structure de la base de donn´ees toute enti`ere, avant mˆeme de commencer `a la remplir. Figure 30 – Sch´ema d’une base de donn´ees quelconque. Chaque cadre repr´esente une table. Il existe des m´ethodes permettant de d´efinir de quelles donn´ees nous avons besoin, et ce processus de cr´eation et de d´efinition des tables peut presque ˆetre automatis´e de nos jours. C’est, en r´ealit´e, une discipline `a part enti`ere, dont nous ne feront pas le d´etail ici. WTServer est un petit logiciel gratuit, se pr´esentant comme une alterna- tive `a WAMP 19. C’est un ensemble de composants permettant de supporter une base de donn´ees locale au poste de travail. Normalement, une base de donn´ees doit ˆetre h´eberg´ee sur un serveur, qui peut ˆetre payant. Mais grˆace `a cet outil, il est possible de simuler le serveur localement, pour v´erifier que toutes les op´erations relatives au r´eseau fonctionnent (base de donn´ees, mais aussi tout ce qui a trait au serveur) et ensuite seulement, on migre vers un serveur auquel des clients distants pourront se connecter (c’est-`a-dire, des clients autres que nous-mˆemes). Dans notre contexte, WTServer nous sert donc `a utiliser une base de donn´ees de test, plutˆot que de modifier celle dont se servent en temps r´eel les joueurs (dite de production ). En effet, une petite erreur et c’est tout le syst`eme qui refuse de fonctionner : il est impensable de faire des tests sur la base de donn´ees de production si cela empˆeche l’application de fonctionner dans le monde entier. 19. Acronyme pour Windows, Apache, MySQL, PHP. + d’infos Arthur Cousseau Page 33 26 Aoˆut 2016
  35. 35. 2 Heroes Story - 2.6 M´ethodes de travail 34 2.6.3 Les fichiers de traduction Pour terminer notre listing des m´ethodes de travail relatives `a Heroes Story, nous allons rapidement aborder le principe de fichiers de traduction. L’id´ee est simple : tout ce qui doit ˆetre affich´e `a l’´ecran, et est donc sus- ceptible de devoir ˆetre traduit en plusieurs langues, doit ˆetre consign´e dans un fichier de texte. Chaque fichier correspond `a une langue diff´erente. La technique utilis´ee par le jeu pour charger ces fichiers est le JSON 20, qui est un format de texte permettant de repr´esenter des donn´ees en leur associant une cl´e. La cl´e ne change jamais entre les fichiers de texte, et est par d´efaut en anglais, c’est la valeur associ´ee `a cette cl´e qui change : elle correspond en effet `a la traduction dans la langue correspondante. Figure 31 – Sch´ema cl´e/valeur du fonctionnement des traductions. Ensuite, grˆace au gestionnaire de langues d´evelopp´e par la compagnie, qui charge et stocke ces valeurs au lancement du jeu, on obtient le texte correspondant `a la langue choisie, sans avoir besoin de la connaˆıtre, le tout en une seule instruction : 1 string texteTraduit = LanguageManager.instance.GetText("game_tuto_step_intro"); Il est ´egalement possible de passer des param`etres `a la cl´e. Dans l’exemple ci-dessous, si la paire cl´e-valeur est “hero level” : “Level #VALUE”, alors la variable texteTraduit contiendra la chaˆıne de caract`eres “Level 4” ! 1 Dictionary<string, string> param = new Dictionary<string, string>() { { "#VALUE", 4 } }; 2 string texteTraduit = LanguageManager.instance.GetText("hero_level", param); 20. Acronyme de JavaScript Object Notation. + d’infos Arthur Cousseau Page 34 26 Aoˆut 2016
  36. 36. 2 Heroes Story - 2.7 Mise en œuvre 35 2.7 Mise en œuvre Pour d´ebuter cette section, il me tenait tout d’abord `a cœur de relater un ´ev´enement survenu quelques semaines seulement apr`es mon arriv´ee, et qui a conditionn´e beaucoup de choses pour la suite de mon stage. Comme je l’expliquais rapidement dans l’avant-propos, la taille de l’´equipe a ´et´e plutˆot variable au cours des 22 semaines que j’ai pass´ees chez Vandal Games. Alors que je commen¸cais `a peine `a comprendre les m´ecanismes de base des m´ethodes de travail, le d´eveloppeur principal a ex- prim´e son souhait de faire ´evoluer sa carri`ere vers une plus grosse compagnie, et annonc´e son d´epart pour le 10 Juin, soit moins de deux mois apr`es mon arriv´ee. Nous n’´etions alors plus que deux stagiaires `a programmer sur le jeu, et nous ´etions encore dans une p´eriode d’apprentissage plus que de r´eel d´eveloppement. Nous avons fait quelques r´eunions avant le d´epart d´efinitif du d´eveloppeur, afin qu’il nous enseigne un maximum de choses pour que nous soyons en charge de reprendre le projet. Ce ne fut pas un virage facile `a appr´ehender, mais cela a finalement r´esult´e en des choses tr`es positives pour nous : bien que le d´eveloppement s’en soit trouv´e ralenti au d´ebut, nous avons appris bien plus vite et mieux par nous-mˆemes que si le d´eveloppeur ´etait rest´e. Nous nous sommes sentis progresser rapidement, et quelques semaines plus tard, nous ´etions totalement autonomes et responsables du projet. Notre tuteur de stage, M. Tram, chef du projet mais ´egalement pro- grammeur, nous a rejoints apr`es le d´epart du d´eveloppeur et c’est `a trois programmeurs que nous sommes rest´es pour toute la dur´ee du stage. J’ai eu, tout au long du stage, ´enorm´ement de petites tˆaches `a effec- tuer, toutes tr`es diff´erentes. Le principe de Trello (et, au fond, du concept mˆeme de m´ethode agile), fait qu’une tˆache met en moyenne une heure `a ˆetre compl´et´ee ; des dizaines de tˆaches sont donc r´ealis´ees tous les jours par les membres de l’´equipe, et des dizaines d’autres sont ajout´ees. Je ne vais pas ici faire le d´etail de chaque tˆache que j’ai pu effectuer : elles concernaient souvent un d´etail minuscule du projet, et ne relevaient parfois mˆeme pas de programmation, mais seulement de retouche graphique : changer l’ap- parence d’un bouton, par exemple. Bien qu’int´eressantes, je ne consid`ere pas ces tˆaches comme essentielles `a l’exp´erience qu’a pu m’apporter Van- dal Games. Dans cette partie, je vais donc plutˆot pr´esenter quelques-unes des plus grosses tˆaches que j’ai eu `a effectuer, celles qui m’ont vraiment fait progresser et ont contribu´e `a faire ´evoluer le projet de mani`ere signi- ficative. Comme je le disais plus tˆot, je me suis occup´e des troph´ees du joueur, mais je ne le d´etaillerai pas ici, car il y a plus important : la derni`ere tˆache pr´esent´ee, le glisser-d´eposer des personnages, fait intervenir toutes les m´ethodes de travail que nous avons pu voir pr´ec´edemment et constitue donc un meilleur exemple de ce qu’a ´et´e la majeure partie de mon travail durant le stage. Arthur Cousseau Page 35 26 Aoˆut 2016
  37. 37. 2 Heroes Story - 2.7 Mise en œuvre 36 2.7.1 Le gestionnaire audio Quelques semaines apr`es mon arriv´ee, un designer sonore a fait son entr´ee dans l’´equipe. Il est donc vite devenu n´ecessaire de d´evelopper un outil afin qu’il puisse int´egrer ses sons au projet, de mani`ere autonome, sans avoir be- soin de faire appel `a un programmeur. Je me suis charg´e de cr´eer cet outil, qui est un script typique de Unity, auquel j’ai attach´e un script qui per- met d’en modifier la mise en forme. On peut d´esormais consid´erer ce script comme un plugin `a part enti`ere : il a ´et´e pens´e pour ˆetre le plus g´en´erique possible, afin d’ˆetre r´eutilisable dans d’autres projets et pas seulement He- roes Story, le code qui se cache derri`ere est devenu cons´equent au fur et `a mesure des ajouts (`a l’heure actuelle, pr`es de 2000 lignes), et la personnali- sation de sa mise en forme en fait une entit´e bien plus ´evolu´ee et modulable qu’un simple script. Les diff´erentes sections sont d´etaill´ees page suivante. Figure 32 – Exemple d’utilisation de l’AudioManager. Arthur Cousseau Page 36 26 Aoˆut 2016
  38. 38. 2 Heroes Story - 2.7 Mise en œuvre 37 1. La zone de d´epˆot est l’endroit o`u il est possible de glisser des fichiers, ou dossiers, pour qu’ils soient ajout´es `a la liste de l’Audio- Manager. Si c’est un dossier, tous les fichiers contenus `a l’int´erieur seront ajout´es automatiquement. 2. La liste de l’AudioManager contient tous les fichiers qui ont ´et´e ajout´es `a l’aide de la zone de d´epˆot. On peut choisir de vider cette liste. Bien entendu, une fenˆetre de confirmation apparaˆıt lorsque l’on clique dessus, afin d’´eviter toute mauvaise manipulation. Il est pos- sible, pour chaque fichier : — De l’´ecouter en cliquant sur le bouton Play (en bleu). L’int´erˆet est de ne pas avoir `a chercher le fichier dans la hi´erarchie du projet. — De cliquer sur son nom pour ˆetre emmen´e directement `a l’endroit o`u le fichier se situe dans la hi´erarchie du projet. — De le retirer de la liste. Particuli`erement utile lorsque l’on ajoute un dossier de 50 sons, puis que l’on veut en retirer quelques-uns, plutˆot que d’avoir `a les ajouter un par un sans se tromper. 3. Les param`etres musicaux concernent par d´efinition la musique qui sera jou´ee dans le jeu. Plusieurs param`etres sont `a disposition : — Doit-on jouer la musique d`es le lancement du jeu ? Si oui, une liste apparaˆıt pour s´electionner laquelle. — La musique doit-elle boucler ? — La musique doit-elle utiliser les param`etres de fondu ? Si oui, deux courbes apparaissent, pour le fondu entrant et le fondu sortant. Ces courbes permettent de g´erer la transition sonore entre deux musiques (le changement de musique s’effectue avec une ligne de code). 4. Les param`etres sonores ne sont pour le moment qu’au nombre de un : le nombre maximum de sons qui pourront ˆetre jou´es en mˆeme temps (ou : canaux). Par d´efaut, la limite est fix´ee `a 16, surtout pour des raisons de performances, mais ´egalement parce que 8 est d´ej`a amplement suffisant pour la tr`es grande majorit´e des cas (`a moins d’un jeu bas´e sur les sons, peut-ˆetre...). `A chaque fois qu’on voudra jouer un son `a l’aide de l’AudioManager, il v´erifiera si un canal est libre parmi ceux d´ej`a utilis´es, si aucun n’est disponible, il en ajoutera un nouveau, `a condition qu’il ne d´epasse pas cette limite. 5. Les playlists sont ce que le designer utilise pour ajuster et trier ses sons apr`es les avoir ajout´es : c’est donc dans cette partie qu’il passe la plupart de son temps. Les options des playlists sont au nombre de trois : — On peut cr´eer une nouvelle playlist, dans ce cas une nouvelle fenˆetre apparaˆıt, nous demandant de saisir son nom. — On peut cr´eer une playlist `a partir d’un dossier, dans ce cas plu- sieurs choses se passent : la playlist cr´e´ee prend automatiquement Arthur Cousseau Page 37 26 Aoˆut 2016
  39. 39. 2 Heroes Story - 2.7 Mise en œuvre 38 le nom du dossier, elle ajoute `a la liste de l’AudioManager les sons contenus dans le dossier qui n’y sont pas d´ej`a, puis elle ajoute `a sa propre liste tous les sons contenus dans le dossier. — On peut vouloir supprimer toutes les playlists d’un coup (encore une fois, une fenˆetre de confirmation apparaˆıt). Ensuite, en ce qui concerne chaque playlist, plusieurs options sont ´egalement disponibles : — On peut indiquer si la playlist est faite de sons ou de musiques (l’AudioManager peut jouer plusieurs sons en mˆeme temps, mais il r´eserve un seul canal pour la musique : si l’on d´esire jouer une musique qui est marqu´ee comme un son, cela ne marchera pas). — On peut renommer la playlist (on ne peut pas lui donner le mˆeme nom qu’une playlist existante). — On peut la supprimer (encore une fois, une fenˆetre de confirmation apparaˆıt). — En cliquant sur le bouton +, on peut choisir d’ajouter un son parmi la liste des sons de l’AudioManager, moins les sons d´ej`a pr´esents dans la playlist. — On peut choisir le volume g´en´eral de la playlist (tout en bas de chaque playlist). — Deux options sont pr´esentes pour chaque son contenu dans une playlist : on peut choisir l’AudioMixer, et le volume. • Commen¸cons par le plus simple, le volume : il permet de diff´erencier chaque son au sein d’une playlist, tout en pre- nant ´egalement en compte le volume global de la playlist. Par exemple, si le volume global de la playlist est de 0.5, et le vo- lume du son est de 0.8, alors le volume final du son sera de 0.4 (0.8 * 0.5). Cela permet d’ajuster plus finement le volume sonore de chaque son, et permet d’avoir un mˆeme son jou´e `a des volumes diff´erents s’il se trouve dans plusieurs playlists ! • La notion d’AudioMixer est l´eg`erement plus complexe, mais son interaction avec l’AudioManager est tr`es simple. Une fois votre AudioMixer cr´e´e, il vous suffit de le glisser dans l’em- placement pr´evu `a cet effet (ici sur la Fig. 32), la boˆıte None avec l’icˆone orange : chaque son contenu dans une playlist en poss`ede une). Le son sera alors modifi´e par les param`etres de l’AudioMixer, en temps r´eel. Mais, qu’est-ce qu’un Audio- Mixer ? C’est un composant propre `a Unity, permettant de faire ce que l’on appelle du mixage, `a savoir modifier les pa- ram`etres d’un son selon des fonctions bien pr´ecises (Fig. 33). L’int´erˆet pour le designer est de pouvoir assigner `a plusieurs sons un mˆeme AudioMixer, et donc de pouvoir assigner `a ces sons les mˆemes modifications, quel que soit leur volume ou leur playlist d’origine. Arthur Cousseau Page 38 26 Aoˆut 2016
  40. 40. 2 Heroes Story - 2.7 Mise en œuvre 39 Figure 33 – Exemple d’utilisation d’un AudioMixer. Durant le d´eveloppement de l’AudioManager, l’interface a souvent chang´e : j’ai soumis une premi`ere version au designer au bout de quelques jours, et en fonction de ses retours, j’ai pu ajouter des fonctionnalit´es, chan- ger des choses de place... afin de rendre son exp´erience utilisateur la plus confortable possible. Cr´eer cet outil m’a permis d’aller plus en profondeur dans l’utilisation d’Unity, puisque j’ai appris comment redessiner l’interface mˆeme du moteur. Le plus gros probl`eme auquel j’ai ´et´e confront´e durant le d´eveloppement de l’AudioManager ´etait la s´erialisation des donn´ees. Et comme le dit si bien la documentation `a ce sujet : La s´erialisation des “choses” est au cœur mˆeme du fonctionnement d’Unity. 21. En effet, Unity utilise la s´erialisation pour des concepts extrˆemement larges : — La fenˆetre de l’Inspecteur. — Les prefabs. — L’instantiation. — La sauvegarde de donn´ees. — Le chargement de donn´ees. — Le garbage collector propre `a Unity. — Le chargement de code en mode ´editeur. Et c’est, `a juste titre, ce dernier point qui m’a forc´e `a devoir comprendre comment fonctionne le m´ecanisme de s´erialisation. La s´erialisation peut se d´efinir comme le processus de conversion de l’´etat d’un objet en un ensemble de bits dans le but de stocker (ou transmettre) l’objet dans la m´emoire, dans une base de donn´ees ou dans un fichier. En d’autres mots : c’est ce qui permet de sauvegarder un objet, pour pouvoir 21. Page correspondante Arthur Cousseau Page 39 26 Aoˆut 2016
  41. 41. 2 Heroes Story - 2.7 Mise en œuvre 40 plus tard le recharger. Il s’agit donc de lister toutes les propri´et´es de l’objet : par exemple, on peut consid´erer un vecteur `a 3 dimensions comme ayant 3 propri´et´es : ses composantes x, y, et z. Et bien, il en va de mˆeme pour un objet plus complexe ! La Fig. 34 montre le contenu textuel d’une sc`ene Unity, sauvegard´ee sous le format .unity : c’est ce proc´ed´e de s´erialisation qui permet de lister toutes les propri´et´es de la sc`ene, pour pouvoir la charger lorsqu’on ouvre notre projet. Figure 34 – Ici, l’on peut voir certaines propri´et´es de la sc`ene qui ont ´et´e modifi´ees. La sc`ene pr´esent´ee ici contient un nombre non n´egligeable d’´el´ements : le fichier fait plusieurs dizaines de milliers de lignes. On peut voir, en haut de l’image, qu’un bloc entier de lignes a ´et´e supprim´e : cela correspond `a la suppression d’un objet dans la sc`ene, et donc `a la suppression de toutes ses propri´et´es associ´ees. Maintenant que nous savons `a quoi correspond la s´erialisation, nous sommes en mesure de comprendre pourquoi elle a pu ˆetre un obstacle au d´eveloppement de l’AudioManager : comme nous l’avons vu pr´ec´edemment, la s´erialisation est, entre autres, appliqu´ee au chargement du code en mode ´editeur. Et comme je le disais, j’ai dˆu redessiner certaines parties de l’in- terface du moteur pour d´efinir un affichage personnalis´e de mon script : je programmais pour cela en mode ´editeur. Les variables que j’utilisais pour ce faire n’´etaient, par d´efaut, pas s´erialis´ees. La cons´equence ? `A chaque fois que l’interface du moteur se redessinait, tous les changements de l’utilisateur dans le plugin ´etaient perdus. Quand est-ce que le moteur se redessinait ? De mani`ere automatique, en r´eaction `a de nombreux ´ev´enements : clic de souris, appui sur une touche du clavier... Arthur Cousseau Page 40 26 Aoˆut 2016
  42. 42. 2 Heroes Story - 2.7 Mise en œuvre 41 Pour r´esoudre le probl`eme, il a fallu que je m’astreigne `a s´erialiser toutes les donn´ees que j’utilisais : cela va du nom des playlists jusqu’`a l’´etat du bouton Loop (coch´e/d´ecoch´e). Il existe deux fa¸cons de faire, qui d´ependent de ce que l’on veut s´erialiser : — Si l’on veut s´erialiser une classe, il faut utiliser l’attribut [System.Serializable]. — Si l’on veut s´erialiser une variable, cela d´epend de si l’on est en mode ´editeur ou non. Si l’on est en mode ´editeur, il faut utiliser le type SerializedProperty. Sinon, il faut utiliser l’attribut [SerializeField]. Voici par exemple la classe Sound, caract´eris´ee par un fichier son (Audio- Clip), un volume, et un AudioMixer : 1 [System.Serializable] 2 public class Sound 3 { 4 public AudioClip clip; 5 public float volume; 6 public AudioMixerGroup outputAudioMixerGroup; 7 8 public Sound(AudioClip c, float v = 1, AudioMixerGroup a = null) 9 { 10 clip = c; 11 volume = v; 12 outputAudioMixerGroup = a; 13 } 14 } Le principe reste simple lorsque l’on ne cherche pas `a d´efinir la fa¸con dont la donn´ee s´erialis´ee s’affiche : ici, je d´ecris la composition d’un son, mais je ne d´ecide nullement de comment le son s’affichera dans l’´editeur. C’est `a un autre script de d´ecider de cela : ce script est cod´e en mode ´editeur, et c’est `a lui de d´ecider de la mani`ere dont le son s’affiche. Et `a ce moment-l`a, toutes les donn´ees que j’utilise pour afficher le son doivent ˆetre s´erialis´ees. Premi`erement, l’´etat de chaque variable dont le son est compos´e, mais ´egalement son ´etat `a l’instant pr´ec´edent : parce que c’est ´egalement en mode ´editeur que je dois d´ecider des changements qui n´ecessitent une sauvegarde de la sc`ene, et les changements sur lesquels il est possible de faire un retour arri`ere `a l’aide du fameux raccourci Ctrl-Z ! Je dois donc connaˆıtre l’´etat pr´ec´edent de chaque variable, afin de le comparer avec l’´etat courant, pour d´eterminer si son ´etat a chang´e, et ensuite je d´etermine si cela n´ecessite une sauvegarde de la sc`ene. Le code ´editeur concernant l’affichage d’un son est donc bien plus complexe. Montrer le code ´editeur ne pr´esente d´esormais plus grand int´erˆet : nous connaissons la nature du probl`eme, nous avons vu comment le r´esoudre, et le reste n’est qu’une fa¸con de travailler propre `a l’´editeur du moteur Unity3D. Arthur Cousseau Page 41 26 Aoˆut 2016
  43. 43. 2 Heroes Story - 2.7 Mise en œuvre 42 2.7.2 Le script AudioBusiness Maintenant que l’AudioManager est cr´e´e, il va falloir s’en servir pour jouer les sons et les musiques au bon moment : c’est le rˆole de l’AudioBu- siness. Le script a une structure tr`es simple : il ´ecoute plusieurs dizaines d’´ev´enements, et utilise l’AudioManager pour jouer des sons ou des mu- siques lorsque ces ´ev´enements se d´eclenchent. Et pour mieux comprendre comment cela fonctionne, notamment pourquoi on utilise le terme ”´ecouter” un ´ev´enement, nous allons nous pencher l´eg`erement sur ce que sont les ´ev´enements. Les ´ev´enements sont le cœur du principe de programmation ´ev´ene- mentielle. La programmation ´ev´enementielle est oppos´ee `a la programmation s´equentielle, mais les deux peuvent fonctionner ensemble, comme c’est le cas de Heroes Story. Voici comment fonctionnent ces deux principes : Figure 35 – D´eroulement des instructions en programmation s´equentielle et ´ev´enementielle. Arthur Cousseau Page 42 26 Aoˆut 2016
  44. 44. 2 Heroes Story - 2.7 Mise en œuvre 43 La programmation s´equentielle se passe de commentaires : on ex´ecute les instructions dans un ordre qui est toujours le mˆeme, du d´ebut `a la fin, de mani`ere in´eluctable. Pour ce qui est de la programmation ´ev´enementielle : — 1. Les objets int´eress´es par l’´ev´enement ”´ecoutent” l’´ev´enement. — 2. `A un certain moment, la source (qui peut ˆetre n’importe quel objet) va ”publier” l’´ev´enement. — 3. Tous les objets qui ´ecoutaient l’´ev´enement sont donc automatique- ment avertis, et ex´ecutent les instructions qu’ils ont pr´evu en fonction. Cette fa¸con de fonctionner est finalement tr`es intuitive, car proche de notre quotidien. On peut voir le sch´ema ci-avant comme une sc`ene de la vie de tous les jours : un parent (la source) gronde un de ses enfants (l’´ev´enement), et ses fr`eres et sœurs pr´esents `a ce moment-l`a (les objets qui ´ecoutent) r´eagissent diff´eremment : l’un va se moquer, l’autre va partir, et le troisi`eme sera compatissant. Nous sommes maintenant parfaitement capables de comprendre le fonc- tionnement de l’AudioBusiness : le script ne fait que r´eagir `a diff´erents ´ev´enements publi´es depuis diff´erents endroits de l’application. 1 void Start() 2 { 3 Listen(EnemyAttackEvent, OnEnemyAttack); 4 Listen(WindowOpen, OnWindowOpen); 5 } 6 7 void OnEnemyAttack() 8 { 9 AudioManager.PlayMusic("DANGER"); 10 } 11 12 void OnWindowOpen() 13 { 14 AudioManager.PlaySound("metallic_sound"); 15 } 16 17 void Destroy() 18 { 19 Unlisten(EnemyAttack); 20 Unlisten(WindowOpen); 21 } Lorsque le script d´emarre, il ´ecoute les ´ev´enements qui l’int´eressent. On notera qu’il indique alors quel ´ev´enement il ´ecoute, et quelle fonction il utilisera pour ex´ecuter les instructions lorsque l’´ev´enement sera publi´e. Et enfin, lorsque le script n’est plus utilis´e (d´etruit), on lui demande d’arrˆeter d’´ecouter les ´ev´enements puisqu’il ne pourra de toutes fa¸cons plus y r´eagir (et cela sauve des performances). Arthur Cousseau Page 43 26 Aoˆut 2016
  45. 45. 2 Heroes Story - 2.7 Mise en œuvre 44 2.7.3 La cam´era Dans des proportions bien moins importantes que pour l’AudioManager, je me suis ´egalement charg´e d’une fonctionnalit´e utile au confort des joueurs : la possibilit´e de d´eplacer la vue, de tourner, et de zoomer. Unity poss`ede d´ej`a un composant pour afficher une vue : on appelle tout simplement cette vue une cam´era. Celle-ci poss`ede de nombreuses propri´et´es. Celles qui nous int´eressent pour se d´eplacer, tourner et zoomer, sont : la position, la rotation, et la taille orthographique. En effet, la cam´era utilis´ee dans le jeu est en mode de projection orthographique. Les figures suivantes illustrent la diff´erence avec le mode de projection habituellement utilis´e, qui est la perspective. Figure 36 – Une vue en cam´era orthographique. Figure 37 – Une vue en cam´era perspective. Arthur Cousseau Page 44 26 Aoˆut 2016
  46. 46. 2 Heroes Story - 2.7 Mise en œuvre 45 On voit que la cam´era orthographique place sa vue dans un genre de salle , qui s’´etend `a l’infini, tandis que la cam´era en perspective reproduit plus fid`element ce que voit un œil humain, puisque sa vue est conique. Mo- difier la taille orthographique de la cam´era fait varier la taille de la salle, et donc une taille plus grande donne l’impression que les objets sont plus petits. Pour le cas de Heroes Story, le choix d’une vue orthographique est fait pour deux raisons : la premi`ere est ´evidemment le choix artistique, la vue orthographique ´etant moins r´ealiste, elle s’adapte bien `a l’univers du jeu qui se veut fantaisiste. La deuxi`eme raison est bien moins anodine puisqu’elle concerne les performances : en effet, si la cam´era ´etait en perspective, elle aurait bien plus de calculs `a faire pour rendre une image ; et les calculs, lorsque l’on d´eveloppe pour mobile, on veut en faire le moins possible ! Pour ce qui est de la technique, programmer cette cam´era pour qu’elle puisse `a la fois se d´eplacer, tourner et zoomer s’est av´er´e un peu plus com- pliqu´e que pr´evu. Pour la rotation par exemple, on ne veut pas que la cam´era tourne sur elle-mˆeme, comme le ferait une cam´era de surveillance, mais on veut qu’elle tourne autour d’un point fixe d´etermin´e de mani`ere arbitraire, ici le centre de l’ˆıle. D’ordinaire, cela aurait rendu les calculs plus complexes, s’il avait fallu s’en remettre directement `a la trigonom´etrie ; heureusement, il existe d´ej`a une fonction d’Unity pour faire ceci. Au lieu d’appeler direc- tement la m´ethode 1 public void Rotate(Vector3 eulerAngles); Il suffit d’appeler 1 public void RotateAround(Vector3 point, Vector3 axis, float angle); Et le tour est jou´e. Une contrainte a ´et´e ajout´ee, cependant : on ne doit pas pouvoir tourner tout autour de l’ˆıle, mais seulement sur la partie visible. En effet, pour sauver des performances, tout l’arri`ere de l’ˆıle est d´ecoup´e et est en r´ealit´e creux : ce que voit le joueur, sans le savoir, n’est que la fa¸cade avant d’un suppos´e mod`ele 3D. La technique adopt´ee est donc la suivante : — J’effectue quoiqu’il en soit la rotation. — Je regarde si j’ai d´epass´e les limites autoris´ees. — Si oui, j’effectue la mˆeme rotation dans le sens inverse, pour l’annuler. Arthur Cousseau Page 45 26 Aoˆut 2016
  47. 47. 2 Heroes Story - 2.7 Mise en œuvre 46 Le zoom, ensuite, s’est ´egalement r´ev´el´e l´eg`erement d´elicat `a cause de la fonction utilis´ee pour d´etecter le mouvement de pinch des doigts sur l’´ecran : ce mouvement qui est d´esormais entr´e dans notre quotidien, `a l’`ere du tout-tactile. Figure 38 – Le mouvement de pinch. C’est un plugin qui se charge de d´etecter ce motif particulier des doigts sur l’´ecran : tout ce qu’il reste `a faire, c’est de regarder en temps r´eel la valeur de la variable 1 Lean.LeanTouch.PinchScale Et l`a, surprise : celle-ci vaut 1 par d´efaut, plus de 1 si l’on ´eloigne nos doigts (zoom), et moins de 1 si on les rapproche (d´ezoom). Rien de plus logique, jusqu’ici. Sauf que cette valeur est mise `a jour plusieurs dizaines de fois par seconde, et qu’elle mesure en r´ealit´e la diff´erence d’´ecart des doigts entre deux rendus, donc elle converge vers 1 lorsque les doigts ne bougent plus, mˆeme s’ils encore ´ecart´es ! Un genre d’´elastique, en somme. Il n’est donc pas envisageable d’´ecrire quelque chose de ce style : 1 maCamera.orthographicSize = pinchSpeed * Lean.LeanTouch.PinchScale; On voudrait diminuer la taille orthographique si l’on doit zoomer, et avec cette formule, ce serait le contraire. Au final, l’´equation ressemble `a ceci : 1 maCamera.orthographicSize /= (Lean.LeanTouch.PinchScale + (1 - pinchSpeed) * (1 - Lean.LeanTouch.PinchScale)); Pour comprendre cette ´equation, prenons-la bout par bout : — La nouvelle taille orthographique va ˆetre ´egale `a l’ancienne, divis´ee par toute l’expression entre parenth`eses (l’´ecriture a /= b est un rac- courci de a = a / b). L’expression est une valeur forc´ement positive. Si l’expression vaut entre 0 et 1, notre division fera donc augmenter notre taille orthographique (d´ezoom). Si l’expression vaut plus que 1, notre division fera diminuer notre taille orthographique (zoom). — On part de notre valeur actuelle de PinchScale : > 1 si l’on zoome, < 1 sinon. C’est donc le r´esultat de la multiplication qui va d´eterminer si l’on augmente ou diminue la taille orthographique : si le r´esultat de la multiplication est positif, on se retrouvera `a diviser la taille orthographique par un nombre plus grand que 1, et donc on zoomera. Arthur Cousseau Page 46 26 Aoˆut 2016
  48. 48. 2 Heroes Story - 2.7 Mise en œuvre 47 — (1 - pinchSpeed) est forc´ement positive puisque pinchSpeed est un flottant contraint entre 0 et 1. Plus la vitesse sera ´elev´ee, donc proche de 1, plus (1 - pinchSpeed) tendra vers 0. Cela peut paraˆıtre contre- intuitif, mais n’oublions pas que l’op´eration finale est une division : si le d´enominateur est proche de 0, le r´esultat sera grand. — (1 - PinchScale) nous donne une valeur n´egative si on est en train de zoomer (on ´eloigne les doigts, PinchScale > 1), et positive si on est en train de d´ezoomer (on rapproche les doigts, PinchScale < 1). Rien de tel qu’un essai : prenons pinchSpeed = 0.3 (c’est sa valeur par d´efaut), et PinchScale vaut 1.1 : nous voulons zoomer. Nous voulons voir l’objet plus gros : nous devons donc diminuer la taille orthographique. Admettons que celle-ci d´emarre `a 10. Notre ´equation devient donc : orthographicSize = 10 / (1.1 + (1 - 0.3) * (1 - 1.1)) = 10 / (1.1 + 0.7 * -0.1) orthographicSize = 10 / (1.1 - 0.07) = 10 / 1.04 = ∼ 9.71. Et enfin, la translation de la cam´era fut le plus compliqu´e `a g´erer. Cela devait se faire par toucher-glisser, qui est la mani`ere la plus intuitive qui soit pour l’utilisateur ; `a priori, il suffit d’enregistrer l’endroit o`u l’on appuie, d’enregistrer `a ce mˆeme moment la position de la cam´era, puis en continu de calculer l’´ecart entre la position de base du doigt et la position actuelle du doigt, et dire `a la cam´era de se placer `a sa position de base plus cette diff´erence. Quelque chose comme : 1 newcameraPos = cameraBasePos + (newTouchPos - touchBasePos); Mais la cam´era se posant comme un observateur de l’ˆıle, elle est donc plac´ee bien haut et regarde vers le bas. La m´ethode de translation d’Unity utilise, par d´efaut, l’objet lui-mˆeme comme r´ef´erentiel : la faire monter sur l’axe des Y ne provoquait donc pas l’effet escompt´e. Figure 39 – En bleu, la direction du regard. En rouge, la translation voulue. En vert, la translation que la m´ethode effectue. Arthur Cousseau Page 47 26 Aoˆut 2016
  49. 49. 2 Heroes Story - 2.7 Mise en œuvre 48 Nous avons perdu un temps fou `a essayer tout un tas de proc´ed´es afin de contourner le probl`eme, alors nous ignorions qu’il existait un second pa- ram`etre `a la m´ethode de translation, qui permet justement de d´efinir le r´ef´erentiel dans lequel effectuer la translation : 1 public void Translate(Vector3 translation, Space relativeTo = Space.Self); Space est une enum contenant seulement deux valeurs : Self, et... World, le r´ef´erentiel que nous d´esirions. Mais la conjonction des op´erations de translation et rotation provoquait beaucoup de bugs. Il fallait rendre les deux op´erations ind´ependantes. En effet, lorsque nous d´eplacions la cam´era, sa rotation par rapport au centre de l’ˆıle s’en trouvait modifi´ee. Par exemple, lorsque l’on montait la cam´era avec le doigt, on augmentait la distance entre la cam´era et le centre de l’ˆıle : la rotation qui s’ensuivait ne se faisait donc plus selon le mˆeme rayon ! Figure 40 – Apr`es ˆetre mont´ee, la cam´era ne tournera plus de la mˆeme mani`ere autour de l’ˆıle. Il nous fallait un r´ef´erentiel pour la rotation ´egalement, qui serait fixe quelle que soit la position de la cam´era. Finalement, le probl`eme fut r´esolu en pla¸cant la cam´era en enfant de ce r´ef´erentiel de rota- tion, et en posant quatre points d´elimitant la zone dans laquelle la cam´era peut se d´eplacer (cadre blanc, Fig. 41 et Fig. 42). Figure 41 – La cam´era dans sa situation de d´epart. Figure 42 – La cam´era apr`es ro- tation vers la gauche. Arthur Cousseau Page 48 26 Aoˆut 2016
  50. 50. 2 Heroes Story - 2.7 Mise en œuvre 49 2.7.4 Le glisser-d´eposer des personnages Peu de temps apr`es que le d´eveloppeur principal du projet soit parti, est venue l’id´ee que nous devions pouvoir d´eplacer les personnages en les faisant glisser sur le champ de bataille avec le doigt. J’ai propos´e de me charger de cette fonctionnalit´e, et j’avais au d´epart sous-estim´e tout ce que cela impliquait : je ne maˆıtrisais pas encore bien toutes les m´ethodes de travail, mais finalement, j’ai beaucoup appris en d´eveloppant ! Comme nous le disions dans l’introduction de cette section, cette fonctionnalit´e est un bon exemple de ce que j’ai pu effectuer de mani`ere g´en´erale durant le stage, puisqu’elle fait intervenir les diff´erentes m´ethodes de travail propres `a Vandal Games : la structure Client - Serveur - GameCore, et la base de donn´ees. Pour commencer, il fallait se poser la question de savoir ce qu’il fallait stocker pour ajouter cette m´ecanique. On voulait qu’il y ait un temps d’at- tente, apr`es avoir d´eplac´e le personnage, pour ajouter un aspect strat´egique au jeu : si on empˆeche le joueur de d´eplacer ses personnages quand il veut, il va devoir y r´efl´echir `a deux fois avant d’effectuer un d´eplacement. Tr`es bien, nous savons donc qu’il nous faut stocker le temps d’attente avant de pouvoir d´eplacer un personnage de nouveau. Mais il fallait que ce temps soit diff´erent pour chaque personnage : on veut pouvoir d´eplacer un personnage A, que le temps d’attente se lance, puis on veut pouvoir d´eplacer un personnage B, sans devoir attendre que le temps d’attente du personnage A soit termin´e. Il faut donc lier ce temps `a chaque h´eros. Et on veut pouvoir changer ce temps, pour chaque h´eros, dans de futures mises `a jour, sans devoir demander aux joueurs de r´einstaller le jeu. La donn´ee doit donc ˆetre en-dehors du jeu : elle doit se trouver dans la base de donn´ees. Et puisqu’elle est li´ee `a chaque h´eros, il va falloir ajouter cette donn´ee dans la table des h´eros. Figure 43 – Extrait de la table des h´eros. Chaque ligne correspond `a un h´eros. La colonne rouge correspond au temps d’attente pour chaque h´eros. Arthur Cousseau Page 49 26 Aoˆut 2016
  51. 51. 2 Heroes Story - 2.7 Mise en œuvre 50 Maintenant que la donn´ee est ajout´ee dans la base de donn´ees, on doit dire au serveur comment charger cette donn´ee. Lorsque le serveur d´emarre, il charge les tables de la base de donn´ees dont le contenu est fix´e par Vandal Games : par exemple, la table des h´eros est fix´ee par Vandal Games. Elle contient les statistiques des h´eros. Une table dont le contenu n’est pas fix´e, c’est par exemple la table des utilisateurs : lorsqu’un nouveau joueur cr´ee un compte dans le jeu, il est ajout´e dans la table des utilisateurs. Le serveur n’a donc aucun int´erˆet `a charger la table des utilisateurs, puisque quelques instants apr`es qu’il l’aura fait, la table ne sera plus la mˆeme. Il faut donc aller dans la solution du serveur, et ajouter notre donn´ee dans la m´ethode de chargement de la table. Puisque le serveur charge la table de la base de donn´ees, il est important de respecter l’ordre des champs : chaque champ ayant possiblement un type de donn´ee diff´erent des autres, si l’ordre n’est pas respect´e, on ne va pas charger les donn´ees selon le bon format, et il y aura ´evidemment des erreurs. On voit sur la Fig. 43 que le champ que l’on a rajout´e vient apr`es le champ “immunities” : on doit donc respecter cet ordre dans le code. 1 private Dictionary<uint, HeroDBObject> LoadHeroes() 2 { 3 ... 4 HeroDBObject hero = new HeroDBObject(); 5 hero.id = reader.GetUInt32("id"); 6 hero.heroClass = (HeroClasses)reader.GetByte("heroclass"); 7 ... 8 hero.immunities = reader.GetByte("immunities"); 9 // Notre nouveau champ ! 10 hero.dragcooldown = reader.GetUInt16("dragcooldown"); 11 ... 12 } Maintenant que l’on est assur´e que le serveur connaˆıt la donn´ee, on peut v´eritablement programmer le comportement du d´eplacement, et comme nous l’avons vu dans la section sur la structure Client - Serveur - GameCore, c’est le GameCore qui doit s’en charger puisque c’est lui qui d´efinit les r`egles d’une partie ! 1 public bool CanBeDragged() 2 { 3 if (playerType == Game.PlayerType.AI) 4 { 5 return false; 6 } 7 return (lastDraggedStep == 0 || (currentStep - lastDraggedStep) >= dragCoolDown); 8 } Arthur Cousseau Page 50 26 Aoˆut 2016
  52. 52. 2 Heroes Story - 2.7 Mise en œuvre 51 On voit que la donn´ee que nous avons rajout´ee est ici la variable drag- CoolDown. La fonction est plutˆot simple : c’est elle qui d´ecide si oui ou non, on peut d´eplacer ce personnage. Pour cela, elle v´erifie tout d’abord que le personnage n’est pas un ennemi (AI signifie Intelligence Artificielle, en fran¸cais). Ensuite, elle dit qu’on a le droit de d´eplacer le personnage seule- ment si on ne l’a pas encore d´eplac´e (lastDraggedStep == 0), ou alors si on l’a d´ej`a d´eplac´e, il faut v´erifier que le temps d’attente est ´ecoul´e. Pour cela, on v´erifie que l’´ecart de temps entre la derni`ere fois o`u on l’a d´eplac´e et l’instant actuel est au moins plus grand que le temps d’attente requis (currentStep - lastDraggedStep >= dragCoolDown). Maintenant, c’est cˆot´e Client que cela se passe : on doit d´etecter le tou- cher sur un personnage, et faire appel `a cette fonction pour savoir si on doit faire que le personnage suive le doigt. Unity g`ere d´ej`a cela avec la m´ethode OnMouseDown(), qui est ex´ecut´ee `a chaque fois que l’on va toucher le per- sonnage avec le doigt. 1 void OnMouseDown() 2 { 3 if (!character.isDead && character.CanBeDragged()) 4 { 5 InputController.SetHandler(new EndDragCharacterCommandHandler(this)); 6 } 7 } Si le personnage n’est pas mort, et qu’il peut ˆetre d´eplac´e (appel `a la m´ethode pr´ec´edente), alors on indique que l’on est en train de le d´eplacer. L’instruction dans la condition s’occupe du relˆachement du doigt : nous y reviendrons. En attendant, il faut faire que le personnage suive le doigt. 1 void Update() 2 { 3 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 4 RaycastHit hitinfo; 5 if (Physics.Raycast(ray, out hitinfo, 50f, (int)LayerMaskEnum.Map)) 6 { 7 model.position = hitinfo.point + Vector3.up * HERO_DRAG_HEIGHT); 8 dropPointSprite.position = new Vector3(model.position.x, 0, model.position.z); 9 FlatHexPoint point = gameComponent.map[hitinfo.point]; 10 SetColor(IsPositionValid(point)); 11 } 12 } Arthur Cousseau Page 51 26 Aoˆut 2016
  53. 53. 2 Heroes Story - 2.7 Mise en œuvre 52 — Les lignes 3-4-5 nous permettent de transformer le toucher du doigt sur l’´ecran en un rayon, qui part de l’oeil de la cam´era et qui va toucher le sol du niveau. Cela nous est utile pour empˆecher le joueur de transporter son personnage en-dehors du niveau. — La ligne 7 est v´eritablement ce qui transporte le personnage : on lui assigne la mˆeme position que le doigt sur l’´ecran, et on ajoute le vec- teur unitaire en Y multipli´e par une hauteur pour que le personnage d´ecolle du sol. C’est un retour visuel important, pour montrer au joueur que l’action de son doigt a bel et bien un effet sur le jeu. — La ligne 8 fait qu’une image d’ombre va suivre le personnage : puisque le personnage est en l’air, on a besoin de savoir o`u il va atterrir lorsqu’on le relˆachera. — La ligne 9 convertit la position du doigt, qui est en pixels, en une cellule sur la carte. L’algorithme qui g`ere le d´eplacement des person- nages a besoin d’un tableau de cellules pour d´eterminer les endroits o`u les personnages peuvent marcher, et o`u se rendre (Fig. 44). — Et enfin, la ligne 10 assigne une couleur diff´erente `a la zone o`u l’on peut d´eplacer le personnage, en fonction de si sa position est valide ou non (Fig. 45). Figure 44 – Le terrain de jeu, vu en ´editeur. Figure 45 – Le d´eplacement de personnage, valide/invalide. Arthur Cousseau Page 52 26 Aoˆut 2016

×