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. 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. 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. 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
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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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