Bienvenue !

Le but de ce blog est multiple :

- servir de pense-bête où je centralise mes idées pour la création d'un jeu de type RPG et de son univers en 3D.
- d'album souvenir de l'évolution du projet.
- de moyen de présenter mon évolution et ma démarche d'apprentissage d'Unity tout au long de ce cas pratique.


INPUT MANAGER avec SO + Camera Manager

 


Procédant à du Reverse Engineering à partir des premières versions du projet open source chop chop d'unity, j'essaye de comprendre la logique derrière l'implémentation de ces systèmes qui utilisent les SO si pratique. Le premier de ceux ci est l'INPUT MANAGER.


INPUT MANAGER

La première étape est d'utiliser le new input system d'unity qui est très pratique. On y crée plusieurs action Map ici en en l'occurence un pour le Gameplay, un pour la navigation dans les menus et le 3ème pour les dialogues. Pour chaque action définie on associe différent binding qui peuvent être actionner : des touches du gamepad, des touches du clavier ou des interaction de la souris.


A partir de cette définition de nos inputs, on génère alors une classe C# grace à l'option proposée par le new input system.  


La classe générée permet de faire tout ce que l'input system fait. Toute les possibilités de l'un se retrouve dans l'autre. On va pouvoir donc  utiliser cette classe directement dans notre programation. 


Plutôt que l'accès classique à cette classe C# directement à partir d'un script qui va écouter les événements d'input génèré lorsque l'on active un input (touche du gamepad, clavier, ...), on intercalle entre les 2 une classe intermédiaire sous forme de scriptable object. Cela permet donc de globaliser les entrées d'input sans utiliser de Singleton. Dans notre cas à chaque fois qu'un script aura besoin de manipuler les événements reçus en input il suffira de lui ajouter le Scriptable Object (la brique légo évenements d'input en quelque sorte) et on aura alors accès à tous les événements d'input et ce sans être dépendant d'un  objet de la scène.


Le début de cette classe qui va généré le Scriptable object est le suivant :



Tout d'abord une référence à UnityEngine.InputSystem, ensuite le createAssetMenu afin de pouvoir créer le scriptable objetct depuis l'editeur, une  liste  d'évenement spécifique lié aux input que la classe va renvoyer sous forme d'unityAction, un objet gameInput qui réfère à la classe généré par le new input system.

Egalement, la classe en plus d'être de type scriptable object va hériter des interfaces généré par la classe C# du new input system ici pour le moment l'interface lié à l'action Map Gameplay et Dialogue, du coup la classe va demander de surcharger les méthode de ces interfaces qui correspondent aux événements d'input.



On retrouve chacune des méthode qui correspond aux événement d'input comme onRotateCamera, onMove, onJump, ...  La classe va lire le contexte de cette action d'input reçue et va à son tour renvoyer un événement unityaction avec ce même contexte. 


La classe peut renvoyé un événemment spécifique en fonction que cette d'action d'input soit "performed" ou parfois canceled comme dans le cas de onJump pour nous donner 2 événement un quand la touche jump est pressé et un quand celle ci est relâchée par exemple.


L'événement de type unityAction engendré pourra être lu par les différent script qui feront référence à cet SO.


Enfin,  la méthode On Enable() qui sert de constructeur (initiation de l'objet GameInput qui contient la classe C# générée par l'input system, initiation de  l'écoute des événements des différentes action map)  et va par défaut rendre enable l'action Map de Gameplay. On a aussi le OnDisable() qui va mettre disable les actions map à la fermeture. 


On crée également les méthodes pour rendre enable les autres action map comme ici par exemple dialogue et rendre disable les autres comme gameplay. ce qui nous permettra de changer d'action map en les invoquant et d'en avoir qu'une qui est d'application à la fois.

Il ne nous reste plus qu'à généré le SO à partir du menu de l'éditeur et de l'utiliser là où on en aura besoin comme par exemple dans le script Camera manager comme on va le voir ci dessous.

CAMERA MANAGER

On utilise donc une variable IputReader qui contiendra le SO et nous permet d'utiliser les différente méthode de celui-ci. Comme capter l'événement CameraMoveEvent qui fera appel à la méthode onCameraMove afin de déplacer celle-ci ainsi que enableMouseControlCameraEvent pour locker le curseur et le faire disparaitre si on maintient le click droit et disableMouseControlCameraEvent pour rendre la souris à nouveau opérationnelle lorsque l'on relâche le bouton droit. 


On crée dans la scène un objet vide qui contiendra le script monobehaviour Camera manager et il nous suffit d'y placer le SO ainsi que la référence aux caméra de notre scène (la principale et la Caméra Virtuelle cinemachine Free look)


On peut alors contrôler le mouvement de la caméra Free Look qui suit le personnage soit au moyen du jostick droit du gamepad soit avec la souris lorsque l'on clique en même temps sur le bouton droit de celle-ci.

Commentaires