Enhanced Input
Enhanced Input est un plug-in créé par Epic Games que nous utilisons dans Parrot. Si vous utilisez la dernière version de l'Unreal Engine 5, il devrait être activé par défaut. Vous pouvez vérifier qu'elle est activée en allant sur Modifier > Plug-ins et en cochant la case.
Enhanced Input remplace le système d'entrée par défaut de l'Unreal Engine et constitue la norme pour la gestion d'entrée complexe ou le remappage de contrôle en cours d'exécution. La documentation officielle d'Epic Games présente une excellente vue d'ensemble du système et explique comment mettre en place vos ressources d'entrée.
Concepts fondamentaux
Pour reprendre la documentation officielle, les concepts fondamentaux d'Enhanced Input que vous devez comprendre sont les suivants :
Actions d'entrée
Contextes de mappage d'entrées (IMCs)
Modificateurs d'entrée
Déclencheurs d'entrée
Si vous avez utilisé le nouveau système d'entrée de Unity, ces concepts devraient vous être familiers.
Les actions d'entrée peuvent être considérées comme "ce que fait l'action qui sera réalisée dans le jeu" dans un contexte particulier du jeu. Par exemple, si votre personnage est dans une voiture, vous voudrez avoir des actions "Accélérer" ou "Freiner".
Les contextes de mappage d'entrées fonctionnent également avec cet exemple. Si le joueur entre dans la voiture ou en sort, vous pouvez vouloir modifier l'action de certaines touches ou boutons de la manette.
Les déclencheurs d'entrée empêcheront les actions de se déclencher si toutes les conditions de déclenchement ne sont pas remplies. Par exemple, vous pouvez demander au joueur de maintenir un bouton enfoncé pendant une durée déterminée afin de déclencher une action.
Les modificateurs d'entrée modifient la valeur de l'entrée elle-même. Les zones mortes sont un modificateur d'entrée commun pour alléger les valeurs d'entrée brutes. Enhanced Input résout tous ces problèmes pour vous, moyennant une certaine configuration.
Prenons un exemple avec Parrot. Sous Content/Input/Gameplay vous trouverez un dossier Actions et un fichier de ressource IMC_Gameplay. Dans le dossier Actions, localisez la ressource IA_Jump.
Le type de valeur est ici Numérique (booléen), qui indique le type de sortie de cette action. Parmi les déclencheurs, on distingue les types suivants :
Actionné
Relâché
En examinant cette action d'entrée, vous pouvez constater que la touche ou le bouton mappé doit être déclenché par une pression et avoir un état de sortie booléen. Le relâchement du bouton déclenche la fin de l'action. Autre détail important, les déclencheurs et les modificateurs peuvent être remplacés par un contexte de mappage d'entrées. Jetons un coup d'œil au contexte de mappage de l'entrée du gameplay pour voir le remplacement de modificateur dans la pratique.
IA_MoveAxis n'a pas de déclencheur défini, de sorte que la valeur de l'axe X du stick analogique gauche de la manette sera lue immédiatement lorsqu'un changement sera détecté. Pour faciliter les valeurs d'entrée brutes, nous utilisons un modificateur de zone morte pour fixer les limites supérieures et inférieures de l'entrée.
Un exemple de cas où nous ne prévoyons pas de remplacement dans l'IMC est celui du mappage de saut.
Vous remarquerez ici que le déclencheur provient de l'action d'entrée elle-même ; il n'est donc pas nécessaire de définir un déclencheur sur le mappage. Les paramètres sont également hérités de l'action, mais vous pouvez ignorer cela pour l'instant, car il sera traité dans la section consacrée au remappage.
Abonnés à l'événement Enhanced Input
Maintenant que vous avez configuré vos ressources, vous devez procéder à la configuration de l'utilisation pendant l'exécution. Dans Parrot, nous nous lions au sous-système de joueur local Enhanced Input pour configurer nos abonnés d'événement dansBP_ParrotPlayerController. Hors du nœud BeginPlay, nous ajoutons un contexte de mappage pour IMC_Gameplay.
Le paramètre de priorité est important ici. Les contextes de mappage d'entrées sont évalués en fonction de leur priorité ; gardez cela à l'esprit lorsque vous superposez des contextes. Pour l'instant, vous n'utiliserez que le contexte du gameplay.
Notez le paramètre Notification de paramètres utilisateur activé ici. Ceci est nécessaire pour le remappage d'entrées en cours d'exécution plus tard.
Le contexte de mappage étant prêt, il ne reste plus qu'à ajouter les nœuds d'événements Enhanced Input aux actions qui vous intéressent. Voici un exemple de saut :
L'action commence lorsque le joueur appuie sur le bouton et se termine lorsque le joueur relâche le bouton. Examinez le reste des actions d'entrée dans BP_ParrotPlayerController pour voir comment d'autres types d'entrées sont traités. Vous pouvez également lier les événements d'entrée en C++ si vous préférez, ce qui est couvert dans la documentation officielle.
Remappage d'entrées en cours d'exécution
Enhanced Input permet de remapper les touches liées aux actions de saisie en cours d'exécution. Il convient de noter que cette fonctionnalité fonctionne, mais qu'elle est encore expérimentale. Il convient donc d'être prudent lorsque l'on tente de publier cette fonctionnalité. Dans Parrot, nous avons un écran raccourcis clavier qui permet au joueur de remapper ses touches. Pour ce faire, nous associons Enhanced Input au plug-in Common UI d'Epic Games afin de fournir les métadonnées correctes aux widgets de l'écran. La configuration Common UI est traitée dans la documentation de l'Interface utilisateur et il est conseillé de lire cette section avant de poursuivre. Avec cette configuration de plug-in, vous pouvez également afficher des éléments dIU spécifiques à la plateforme.
Pour commencer, activez les paramètres utilisateur pour Enhanced Input dans les paramètres de projet. Cela se trouve dans Modifier > Paramètres du projet > Moteur > Enhanced Input. Réglez vos paramètres comme suit
Naviguez ensuite à une ressource d'action d'entrée et ajustez les Paramètres des touches attribuables aux joueurs. Le champ Nom doit être unique pour toutes vos actions d'entrée. Nom d'affichage et Catégorie sont localisés dans Parrot.
Vous pouvez également remplacer les Paramètres des touches attribuables aux joueurs lors de la définition d'une touche dans un IMC. Pour l'action de saut dans l'IMC Gameplay, nous avons laissé ce paramètre sur "Hériter les paramètres de l'action" pour n'avoir rien de spécial à faire.
Vérifiez que lorsque vous ajoutez votre contexte de mappage d'entrées sur le blueprint du contrôleur de joueur, le paramètre Notification de paramètres utilisateur est activé.
La prochaine partie traitera de la manière dont nous pouvons lier les actions Enhanced Input à Common UI. Nous allons traiter ce qui est nécessaire pour l'Input Remapping dans Parrot, mais cette documentation est complémentaire au Guide de démarrage rapide Common UI officiel.
Pour l'étape suivante, nous avons créé un nouvel IMC : IMC_UI_Generic sous Content/Input/UI.
Vous devez définir le champ des Paramètres des touches attribuables aux joueurs sur chaque action d'entrée et le faire pointer vers la ressource de données de métadonnées d'IU appropriée. Voici un exemple de l'action générique d'acceptation de l'entrée et de la ressource de métadonnée elle-même.
Ces IMC et actions d'entrée sont nécessaires pour que Common UI connaisse les actions invoquées par la navigation dans l'IU. Les actions d'entrée génériques Accepter et Retour en sont les premiers exemples, car un joueur voudra toujours les invoquer lorsqu'il naviguera dans les écrans de l'IU. Nous définissons ces mappages dans un blueprint de données spécifique CommonUI en sous-classe de CommonUIInputData.
Ensuite dans Modifier > Paramètres du projet > Paramètres d'entrée commune, définissez les données d'entrée sur votre blueprint générique de données d'entrée.
Une fois les champs importants définis, vous pouvez passer à la configuration de vos écrans de widgets. Vous commencez avec une classe d'écran Parrot de base pour les écrans statiques et une classe activable pour les autres. Les écrans statiques seraient quelque chose comme l'ATH, où vous n'avez pas besoin de vous préoccuper de la navigation dans l'IU. Un exemple activable serait le menu Pause, puisqu'il a besoin de savoir quand le bouton Retour est enfoncé et qu'il existe sur la couche Menu dans la disposition du jeu.
La hiérarchie des écrans est traitée décrite dans la documentation Interface utilisateur mais elle est reprise ici pour référence :
Dans les valeurs par défaut de la classe des écrans BP, nous définissons un contexte de mappage d'entrées facultatif. Ceci est appliqué lors de l'activation/désactivation du widget et vous pouvez le remplacer par classe.
UParrotActivatableScreen dispose d'une implémentation permettant de gérer les actions de retour. L'auditeur d'événement IA_UI_GenericBack est défini dans le graphique d'événements des blueprints dérivés qui l'utilisent. Vous devez également activer la case Est Indicateur de retour dans le panneau Détails.
Reportez-vous aux commentaires de la classe C++ et du BP pour voir comment le modèle Retour est utilisé dans les différents widgets d'écran.
Les classes de base étant traitées, jetez un coup d'œil à l'écran des raccourcis clavier. WBP_KeyBindingsScreen est situé sous Content/UI/Widgets/Screens. Le graphique d'événements vaut la peine d'être examiné par vous-même pour voir comment les Paramètres de l'utilisateur et le Profil de clés sont interrogés pour tirer les types Mappage de clés du joueur depuis Enhanced Input. Les données sont utilisées pour ajouter et peupler les widgets WBP_InputSelectorBox. Dans le widget WBP_InputSelectorBox, vous trouverez deux widgets W_ParrotInputSelector.
L'un d'eux est utilisé pour les entrées de la manette et l'autre pour les entrées du clavier. Le sélecteur d'entrée Parrot est un widget personnalisé inspiré de sélecteur d'entrée intégré. Ces deux widgets entrent dans un état de sélection, attendent une entrée, puis mettent à jour l'affichage :
pour la souris et le clavier, nous utilisons le texte renvoyé par le sous-système Enhanced Input et mettons à jour l'affichage.
L'implémentation de la manette s'appuie sur Common UI pour demander des images spécifiques au contrôleur. Dans ce cas, nous en avons configuré une pour images Xbox, appelée
CommonInput_Gamepad_XboxsousContent/Input/UI/Platform. Cette classe dérive deUCommonInputBaseControllerData.
En dérivant de cette classe, il est possible de mapper des clés d'entrée à des pinceaux avec des images. Ensuite, configurez les données du contrôleur sous Modifier > Paramètres du projet > Paramètres d'entrée commune, puis naviguez jusqu'à la plateforme.
Une fois ces données connectées, le reste du travail s'effectue dans les widgets. Le code et les commentaires dans UParrotInputSelector et WBP_InputSelectorBox valent la peine d'être consultées pour voir exactement comment la fonctionnalité de remappage fonctionne avec les sous-systèmes Enhanced Input et Common UI.
La dernière fonctionnalité importante à mettre en avant est la façon dont les touches mappées sont sauvegardées. Cela se passe dans SaveKeyMappings dans WBP_KeyBindingsScreen. Cette fonction itère sur tous les widgets de la boîte de sélection et utilise ensuite les fonctions Appliquer les paramètres et Enregistrer les paramètres intégrées des paramètres utilisateur. Enregistrer les paramètres écrit un fichier de sauvegarde, EnhancedInputUserSettings.sav sur le disque. Il est situé sous Répertoire du projet > Parrot > SaveGames enregistrés.
Si tout a été configuré correctement, vous devriez avoir un écran de raccourcis clavier fonctionnel !
Vous remarquerez peut-être que dans le coin inférieur droit se trouve un widget d'action qui se met à jour lorsque la touche est remapée. Ce widget est WBP_ParrotGamepadActionWidget et est situé sous Content/UI/Widgets/Common. Il fait un usage intensif de la classe de Common UI UCommonActionWidget qui est conçue pour afficher des icônes spécifiques à une plateforme en fonction d'une action d'entrée utilisant les données d'entrée communes que nous avons créées plus tôt. Grâce à Common UI, il est facile de créer de nouveaux widgets qui font référence aux actions Enhanced Input de votre jeu.