Utiliser une manette avec Unity3D

banner

Avec Unity, vous avez la possibilité de paramétrer une série de touches. En faisant cela, vous rendez possible la personnalisation de ces touches sans avoir à le gérer vous même dans le code. Plutôt intéressant non ? Mais ce n’est pas ce point qui nous intéresse réellement.

Les manettes. De différentes formes, avec des boutons différents… le tout pour proposer une expérience de jeu différente. Je ne dirai pas « meilleure » car ce n’est pas toujours vrai selon les types de jeu et les personnes. La mise en place du support manette s’avère relativement simple si vous ne ciblez qu’une seule console. Attention, je parle bien de console, pas de PC. Mais dès lors que vous allez vouloir publier votre jeu sur différentes plateformes (ce qui reste quand même un des intérêts premier d’Unity), les choses vont se complexifier. Beaucoup.

Disclaimer

Cet article a été originalement écrit le 27/06/2014 sur mon précédent blog. Certaines informations présentées ici peuvent donc ne plus fonctionner telles quelles.

Le format

Des manettes, il y en a eu de toutes sortes au cours de l’histoire du jeu vidéo. Pour faire simple, on est parti de ça :

1280px-TFT
Tennis for Two, créé en 1958 par William Higinbotham

… et aujourd’hui, on a des trucs comme ça :

Nintendo-Wii-U-Gamepad-Commercialisation-2012
La console-manette Wii U – Nintendo

 

ps4_0-650x395
La manette de playstation 4 – Sony

 

Steam_Controller
La manette de SteamOS – ValvE

 

Xbox One controller 2-580-90
La manette de Xbox One – Microsoft

 

97cee038f7e205491d31ca70d846145f
La manette du Gamestick

 

ouya-controller_original
La manette de la Ouya

Il y a quelque chose que vous pouvez remarquer sur les manettes actuelles :

  • Elles ont toutes 2 sticks, un à gauche et un à droite
  • Elles ont toutes un set de 4 boutons à droite
  • Elles ont toutes un pad directionnel à gauche
  • Elles ont toutes au moins un bouton / trigger de chaque côté au dessus de la manette

Vous voyez où je veux en venir ? Au fil du temps, un standard de manette s’est installé sans qu’on y fasse particulièrement attention (je dis ça mais il y a surement des ergonomes qui ont fait des études là dessus). Ce set de boutons est devenu la norme. Et qui dit norme, dit interopérabilité. Enfin… On va en reparler, c’est pas aussi simple que ça mais on a déjà une base commune, ce qui n’est pas rien !

Mise en place du cross platform

Vous pourriez vouloir mettre en place le support manette vous même… et y arriver… sur votre poste. Mais plusieurs problèmes majeurs se posent :

  • Le mapping des boutons est différent selon les manettes
  • Le mapping peut être différent pour une même manette selon la plateforme (et là ça devient pas drôle du tout)

Autant vous dire que faire tout ça à la main, ça ressemble pas loin à du suicide. Ou alors vous avez beaucoup de temps devant vous pour faire rien que ça.

C’est là qu’il faut utiliser des outils existants. Car oui, il existe des outils pour gérer le support manette multi plateforme. Ouf ! Voyons donc l’un d’eux : InControl.

Note importante :

InControl contient un système de génération automatique du paramétrage des inputs pour différentes manettes / plateformes. Pour utiliser InControl, vous allez donc devoir écraser tout paramétrage effectué. Dans le cas où vous intégrez ça dans un projet existant, je vous invite fortement à faire une sauvegarde de votre paramétrage.

Commençons maintenant à installer tout ça. Récupérez le projet depuis le dépôt Github (le bouton Download Zip). La totalité du projet ne nous intéresse pas. Dézippez l’archive et allez dans le dossier Assets. Vous y trouverez un dossier InControl. Copiez ce dossier dans vos assets de projet Unity :

incontrol

Une fois ajouté dans l’éditeur, vous aurez sans doute une erreur dans la console. Quelque chose comme ça :

error

Pas de panique ce n’est pas bien grave. InControl vous indique que le paramétrage actuel des entrée est incompatible avec InControl. Suivez les instructions données et tout ira bien. Si vous voulez faire une sauvegarde de votre paramétrage, c’est le moment ou jamais !

success

Voilà qui est mieux ! Maintenant, allez jeter un oeil à ce paramétrage et notez la quantité de boutons virtuels générés…

inputs

Dans la version que j’ai récupérée, c’est pas moins de 205 boutons… Ca fait un sacré paquet n’est-ce pas ?

Le paramétrage étant fait, on peut passer au branchement. InControl se base sur le module d’Input d’Unity via le paramétrage ci dessus. Par conséquent, il n’est pas utilisable de la même manière. Il va falloir faire des choses supplémentaires (pas tant que ça).

Si les valeurs de la classe Input sont mises à jour entre chaque boucle de jeu, il va falloir ruser un peu pour InControl qui n’est pas géré par le coeur d’Unity. Dans un cadre classique, vous avez cette structure :

inputunity

Peut-être avez-vous créé un gestionnaire pour tout centraliser, mais c’est grosso modo le fonctionnement classique. Pour InControl, c’est différent et la structure sera la suivante :

inputincontrol

Un élément vien s’intercaler entre l’Input et vos scripts : InControl. Le petit Hic est que vous devrez mettre à jour manuellement InControl. Ce n’est pas très compliqué et il ne faut le faire qu’une fois par scène (ou une seule fois tout court si vous utilisez des GameObjects persistents). Voyons donc ce fameux script de mise à jour (Updater sur le schéma). Attention les yeux, ça pique un peu :

public class InputUpdater : MonoBehaviour
{
 void Start()
 {
  InputManager.Setup();
 }

 void Update()
 {
  InputManager.Update();
 }
}

Compliqué hein ? Je ne rentrerai pas dans les détails, mais si vous voulez faire du paramétrage plus fin sur InControl comme par exemple inverser l’axe Y, il vous faut le faire avant d’appeler InputManager.Setup().

A partir de maintenant, lorsque vous voudrez récupérer une entrée joueur, il vous faudra utiliser InControl. Notez qu’InControl gère les entrées sous forme de Devices, des contrôleurs. La première chose à faire est donc de récupérer le contrôleur du joueur. Le plus simple est de récupérer le contrôleur actif comme suit :

InputDevice device = InputManager.ActiveDevice;

A partir de là, vous pourrez récupérer toutes sortes d’informations, les boutons pressés, l’état des triggers, la position des sticks… et le tout compatible avec plusieurs manettes sur la plupart des plateformes. L’effort était relativement faible pour arriver à un tel résultat vous ne trouvez pas ? Pour aller plus loin, je vous invite à lire le tutoriel d’introduction sur le site de InControl.

Notez une petite chose : lorsque vous avez ajouté le paramétrage de InControl, tous les autres paramétrages ont été supprimé. Ce qui signifie que le paramétrage par défaut du clavier est supprimé. Vous devrez donc le recréer manuellement si besoin.

Advertisements

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s