March 24, 2017

Game design: Donner du punch à vos attaques


Huh?! Why is this in french?!
I messed up in Blogger and published some posts on the wrong blog. I'm letting those posts here in case anyone bookmarked them or something... Yep :/

Salut les lecteurs (et les autres aussi) !

Aujourd'hui on va parler un peu de game design et si vous savez lire un titre, vous devez déjà savoir qu'on parlera plus précisément d'attaques. Pour une fois, je ne vais pas parler spécifiquement d'Unity, j'estime que ces conseils peuvent s'adapter partout (peut-être même en animation également, pas seulement en game design).

Concrètement, je vais essayer de vous expliquer comment donner de l'impact, du punch, de la juiciness... appelez ça comme vous voulez, aux attaques de corps à corps de vos personnages.

En gros, je vais tenter de vous expliquer ce qui fait la différence entre Dark Souls et Minecraft quand il s'agit des combats. Je suis en train de pas mal bosser sur toutes ces petites choses qui font que le personnage soit "ancré" dans l'univers, qu'il ait un poids quand il marche (au lieu de donner l'impression de flotter au ras du sol) et que lorsqu'il donne un gros coup de hache, qu'on sente le poids et l'inertie de l'arme.

Etape 0: L'observation



Ça c'est un bon conseil pour tout le processus de création de jeux en général: regarder comment les autres font.

Oui, super, merci Sherlock, et continue bien de nous faire croire que tu bosses quand tu est en train de jouer, aussi !

Tss tss tss... L'idée c'est, quand on joue à un bon jeu, d'observer comment les mecs ont fait et pourquoi (précisément) le jeu est si bien. Pas juste en se disant "ah bah leur combat est bien fluide et y'a de l'impact" mais en regardant vraiment pourquoi c'est fluide et impact...ant... En gros, passer d'une attitude passive ("je constate que c'est bien fait") à une attitude active ("quels éléments précis font que c'est bien fait ?").

Bon, voyons comment marche une attaque concrètement.

Etape 1: Diviser pour mieux régner



Une attaque ?! Facile ! Je fais un clic souris, le perso fait un mouvement avec l'arme puis l’ennemi prend le coup !

Faux.

Cette manière de voir l'attaque va vous mener directement à la méthode Minecraft (je précise que j'adore ce jeu bourré de qualités, hein, n'allez pas tirer des conclusions parce que je le prend pour exemple sur un truc qu'il fait moins bien que Dark Souls :D), ou à la méthode que j'utilisais jusqu'ici dans Myrne: The Quest (que je suis donc occupé à améliorer).

A savoir, la méthode du : Une attaque = une animation

Si on veut un truc qui ait un peu de la gueule, on va séparer notre action en plusieurs sous-actions (et au passage on devra sans doute la diviser en plusieurs animations, désolé :D).

Concrètement, une attaque c'est quoi ? Je la vois en 3 ou 4 parties (après ça peut se discuter, ça dépend de la précision et de la complexité que vous souhaitez avoir pour votre attaque). On va leur donner des noms qui claquent ;)

  • La préparation
  • L'exécution
  • La résolution
  • Le retour

Chacune de ses parties va avoir un rôle bien différent dans l'action, et le fait de bien séparer chacune de ces parties dans notre code va nous donner un contrôle énorme sur tout ce qui va se passer avant, pendant et après l'attaque, ce qui serait plus difficile, voir impossible avec une attaque faites en une seule animation/état.

On va passer chacune de ces actions en revue.

La préparation



Peu importe avec quoi on décide de frapper un truc, on va, dans un premier temps, préparer notre coup pour maximiser la force qu'on met dedans. Si on souhaite donner un coup de hache, on va lever cette hache bien haut, pour une attaque à la lance, on va d'abord la reculer, pareil pour un coup de poing, on va tirer notre poing en arrière.



Heu, oui, on s'en fout, non ?

Nope. L'avantage d'avoir séparé ça du reste de l'attaque (et donc éventuellement d'en avoir fait une animation à part) va nous permettre 2-3 trucs sympas.

La première chose c'est d'éventuellement accélérer ou ralentir cette phase en fonction de l'arme. Ça donne du poids à l'objet (c'est super important). Imaginons une attaque à l'arme contondante genre marteau ou massue. Personnellement, pour Myrne: The Quest j'utilise une animation par type d'armes (contondante, lames, perforantes,...) et en principe il n'y a aucun soucis à ça. Mais est-ce que vous ne pensez pas qu'il y a une différence entre manier ça

Petit marteau de guerre



et ça ?

Très gros marteau de guerre

Ah zut, donc il faut deux animations différentes rien que pour la préparation ?

Non. Ce qu'on peut faire c'est utiliser la même animation, mais en variant sa vitesse, donc en rendant la deuxième plus lente à lever au-dessus de notre tête. L'arme aura tout de suite plus de poids, ce sera plus réaliste et en plus ça ralentira la vitesse d'attaque avec cette arme, ce qui a du sens.

Le deuxième truc qu'on peut faire à cette phase, c'est s'arrêter à cette étape, attendre pour charger une attaque plus puissante par exemple. Je m'attarde pas trop sur ce point car on est un peu en dehors de l'ajout de punch/juiciness. Mais voilà, si vous voulez un gameplay où on peut charger les coups pour faire plus de dégâts, le découpage de votre attaque sera nécessaire.

Idem pour la troisième possibilité, c'est qu'on peut par exemple, comme dans Chivalry, annuler l'attaque durant cette phase (après c'est un peu tard vu que l'arme sera emportée par la force du coup et difficilement arrêtable).

L'exécution et la résolution



Voilà, le coup part pour de vrai !

Pas grand chose à dire sur l'exécution, concrètement c'est le moment où l'arme passe d'une vitesse nulle à sa vitesse maximale (le marteau tombe, la lance est propulsée vers l'avant,...). Générallement on va ajouter quelques effets ici pour donner de la présence à l'arme. Je m'étend pas dessus car c'est ce que vous faites rpobablement avec vos attaques en une seule animation: un son "woosh", un petit effet visuel de déformation de l'air,...

Là où les choses deviennent très intéressantes c'est lors de la résolution. C'est ici que le coup prend effet. On a touché quelque chose ? Si oui, quoi ? Et il se passe quoi ?

C'est ici qu'on va vraiment pouvoir ajouter autant de complexité qu'on veut. Si vous visez la qualité Dark Souls, Vermintide ou Chivalry, vous allez vous amusez. Il y a un million de trucs à faire, à voir ce qu'on a le temps (et l'énergie) de faire ou non.

La bonne nouvelle c'est qu'en divisant notre action en différentes parties, on s'est donné la possibilité d'implémenter des trucs petits à petits. Chaque détail que vous ajouterez améliorera la qualité de votre attaque, mais si vous ne faites pas un truc, ce sera facile de revenir l'implémenter par la suite, là où avec une animation unique d'attaque, venir ajouter de la complexité nous forcerait à refaire toute l'animation.

Oui bon, on a compris. On peut faire quoi alors ici ?

On peut déjà commencer par regarder si on a touché ou non un truc avec notre attaque :


  • J'ai raté mon attaque !
Pas de chance... Mais c'est intéressant parce que notre arme ne va pas se comporter de la même manière que si on avait touché un truc. Elle va en fait probablement se comporter comme elle l'aurait fait si on l'avait créée en une seule animation. Elle continue son mouvement jusqu'à la fin de l'animation.
  • Ah non, c'est bon, j'avais touché un truc en fait !
Ah bah super ! Si c'est un ennemi, il émet un cri de douleur (si c'est un rat il couine, un paysan poussera un grognement,...), l'arme fait aussi un bruit (*pof* pour un marteau, bruit de coupure pour une épée,...), du sang gicle,...

Ce qu'on a touché n'était pas vivant ? C'est l'occasion d'ajouter du réalisme, et surtout de montrer que l'arme existe vraiment dans le jeu ! Elle va faire *toc* contre une surface de bois, et à la place de la giclée de sang, on peut utiliser un système de particules pour qu'il y ait des éclats de bois. On peut même ajouter un décal (une texture) sur l'objet pour montrer que notre arme l'a abîmé (trace de coupure, de coups,...).

A noter qu'on peut aussi s'adapter au point touché sur l'ennemi, ok, on l'a touché, mais où ? Dans la tête (Vermintide rend très bien l'effet *sprotch* d'un coup de marteau de guerre sur une tête d'homme-rat) ? Sur l'épaulière en cuir (*pof*) ? Sur son casque métallique (*cling*). Les possibilités sont quasiment infinies.

Et en ce qui concerne le fait d'avoir heurté un truc avec notre arme, c'est important de noter qu'on a... ben... heurté un truc avec notre arme !

Alors je sais pas chez vous, mais perso moi quand je frappe un outil contre une surface, l'outil s'arrête ;)

Et ça c'est super important ! Si votre système d'animations vous le permet (ce qui n'est malheureusement pas le cas du mien, je suis pas super doué en anim^^'), ça peut être super d'arrêter l'animation (enfin, la partie "résolution" de votre anim) ici. Ça va ajouter de l'impact au coup.

Puisque je ne fais pas ça, à la place je vais attendre la fin de mon anim et laisser l'arme figée en position de fin (hache vers le bas, lance vers l'avant,...) quelques instants avant de passer à la phase suivante. Ça marche aussi. L'idée c'est de vraiment montrer que vous avez donné un coup avec une hache, le corps prend un moment pour se ré-équilibrer, la hache reste plantée un moment dans l'objet,...

Je ne sais pas encore si je vais laisser l'arrêt quand on ne touche rien, probablement pas

Et voilà. Je pense que c'est tout pour cette partie.

Le retour


Comme son nom l'indique, cette dernière étape est le retour à l'état initial de l'arme. On a donné notre coup de hache, qui est maintenant tournée vers le sol. On va simplement la remonter pour pouvoir recommencer le cycle lors d'une prochaine attaque ;)

Comme pour "la préparation", on pourrait ralentir ou accélérer l'animation selon le poids de l'arme et le résultat (résolution) de l'attaque. Relever une petite hache à une main qui a raté son coup ira vite, déplanter une lance du corps d'un ennemi beaucoup moins.

Ah mais c'est fini, alors ! Cool !

En fait ça dépend du niveau de complexité voulue et de comment s'est terminé votre phase de résolution. C'est tout à fait possible de juste remonter notre hache et pas trop s'embêter avec des détails.

Mais laissez-moi vous parler de l'équilibre du personnage, juste au cas où vous voulez le top du top niveau qualité.

Ici les choses deviennent un peu plus compliquées/complexes parce qu'on va toucher au gameplay et qu'on va ajouter des animations en plus, je ne vous en voudrai pas si vous évitez de toucher à ça dans un premier temps (n'oubliez pas, on peut toujours repasser dans un an pour mettre le jeu à jour, quand on a un peu plus de temps pour les détails^^).

Il y a certaines actions dans une attaque qui vont déséquilibrer le mec qui porte le coup. Je pense à deux cas en particulier :
  • Frapper un mur (ou un mec en armure de plates avec un bâton en bois, par exemple)
L'arme va rebondir et probablement déséquilibrer le personnage vers l'arrière. C'est ce qu'il se passe dans Dark Souls par exemple et bien adapter son arme à l'endroit où on combat fait partie intégrante du gameplay (agitez une épée dans un couloir étroit c'est pas le top). Concrètement on part sur une animation de déséquilibre et sur un petit temps pendant lequel notre perso ne pourra rien faire le temps de retrouver l'équilibre...
  • Frapper dans le vide
Un peu pareil sauf qu'on va plutôt trébucher vers l'avant. L'animation sera différente et si vous décidez de mettre un temps de "ré-équilibre" pendant lequel le perso ne peut plus faire d'action, c'est une bonne idée de prendre en compte le poids de l'arme (frapper dans le vide avec une claymore ou avec une dague, ça n'a pas le même effet).

Ce genre d'animation est assez complexe à la troisième personne je pense (surtout pour ne pas traverser le mur^^). En vue première personne il s'agit simplement de "pousser" l'arme en arrière/avant et éventuellement relever/baisser la caméra.


Et je pense que c'est à peu près tout pour "le retour". Notez qu'en arrivant à ce stade et en ayant tout fait, on a plus besoin de coder de cooldown (temps d'attente avant de pouvoir attaquer de nouveau) arbitraire à nos attaques, on a eu des temps d'attentes un peu partout en fonction du résultat de l'attaque et au final le cooldown correspondra vraiment à la physique de l'objet et de l'attaque.

On conclusionne ?

Conclusion


Comme je vous ai dis, je pense qu'il n'y a pas vraiment de limites à ce qu'on peut faire, si ce n'est le temps et la complexité voulue.

Mais ce qu'il est important de noter c'est que rien de tout ça n'est compliqué en soi !

On peut vite se laisser impressionné par des jeux comme Dark Souls, Vermintide ou Chivalry (à juste titre, ces jeux ont vraiment un système de melee remarquable) mais ce qu'il ne faut pas faire c'est se heurter au mur du "pfouu, c'est trop dur et les mecs sont 50 pour faire ces jeux, moi je suis juste un petit indé".

Quand on prend le temps de vraiment regarder dans le détail ce qui constitue ces jeux et leur système de combat, on se rend compte que c'est tout un ensemble de petits trucs qu'il est très simple d'implémenter dans nos petits projets indés.

Alors oui, vos animations ne seront peut-être pas aussi fluides que celles de Dark Souls, vos coups de marteau aussi satisfaisants que ceux de Vermintide, mais rappelez-vous qu'entre ces jeux et Minecraft, il y a tout un monde et qu'on est pas soit d'un côté soit de l'autre, il y a tout un milieu. Je ne veux plus voir d'animation d'attaque consistant en un bras qui fait une rotation de 90 degrés :)