Configurer dynamiquement une carte d’action
Environnement de vérification
- Windows
-
- Fenêtres 11
- Éditeur Unity
-
- 2020.3.25f1
- Package système d’entrée
-
- 1.2.0
Conditions préalables à cette astuce
Les paramètres suivants ont été définis à l’avance comme prémisse pour la description de cette astuce.
Vous devez également connaître les conseils suivants :
À propos de la configuration dynamique de la carte d’action
Il est courant d’ajouter et de définir des cartes d’action au projet à l’avance, Dans ce cas, les affectations des boutons de la manette sont fixes pendant l’exécution du jeu et ne peuvent pas être modifiées librement par l’utilisateur pendant le jeu. Ceci est principalement attendu pour les jeux qui nécessitent une configuration de clé.
Cette astuce décrit comment modifier arbitrairement les affectations de clés d’une carte d’action dans un script.
Gestion dynamique des modifications de carte d’action
Cette fois, la carte d’action initiale est également définie par le script, et le changement de carte d’action au milieu est également effectué dans le script. Je pense que cette méthode est utilisée lors du chargement et de la définition de la configuration de clé enregistrée au démarrage du jeu.
Le contenu de l’exemple consiste à modifier l’affectation des clés de la carte d’action lorsque vous appuyez sur le bouton et à afficher le contenu exploité sous forme de texte. Le placement des boutons et le texte d’affichage sont disposés comme indiqué dans la figure, mais ils ne sont pas très importants, veuillez donc les placer librement.
Processus de configuration initiale de la carte d’action
Créez un script. Le nom est arbitraire, mais dans ce cas InputActionMap
, il est .
Cette fois, tous les processus seront décrits ici, mais dans la production réelle, veuillez les diviser en fonction de la création du projet.
Le script ressemble à ceci : Tout d’abord, créez une carte d’action par défaut au démarrage.
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;
public class InputActionMap : MonoBehaviour
{
<summary>情報を表示させるテキストオブジェクト。</summary>
[SerializeField] private Text TextObject;
<summary>Move アクション用の定義。</summary>
public InputAction MoveAction { get; set; }
<summary>Attack アクション用の定義。</summary>
public InputAction AttackAction { get; set; }
private void Awake()
{
// Move アクションの作成
MoveAction = new InputAction("Move");
// バインド(キー割り当て)の追加
// 設定する文字列の形式はアクションマップ設定画面の Path に表示される文字列となる
MoveAction.AddBinding("<Gamepad>/leftStick");
// キーボードに上下左右を割り当てるにはコンポジットの 2DVector を設定する
MoveAction.AddCompositeBinding("2DVector")
.With("Up", "<Keyboard>/upArrow")
.With("Down", "<Keyboard>/downArrow")
.With("Left", "<Keyboard>/leftArrow")
.With("Right", "<Keyboard>/rightArrow");
// Attack アクションの作成
AttackAction = new InputAction("Attack");
// バインド(キー割り当て)の追加
AttackAction.AddBinding("<Gamepad>/buttonSouth");
AttackAction.AddBinding("<Keyboard>/z");
// 操作時のイベントを設定
MoveAction.performed += context => OnMove(context);
MoveAction.canceled += context => OnMove(context);
AttackAction.performed += context => OnAttack(context);
AttackAction.canceled += context => OnAttack(context);
}
private void OnEnable()
{
// オブジェクトが有効になったときにアクションマップを有効にする
MoveAction.Enable();
AttackAction.Enable();
}
private void OnDisable()
{
// アクションマップが誤動作しないようにオブジェクト終了時に無効にする
MoveAction.Disable();
AttackAction.Disable();
}
<summary>
Move 操作を行ったときに呼ばれる。
</summary>
<param name="context">コールバック内容。</param>
public void OnMove(InputAction.CallbackContext context)
{
var vec = context.ReadValue<Vector2>();
TextObject.text = $"Move:({vec.x:f2}, {vec.y:f2})\n{TextObject.text}";
}
<summary>
Move 操作を行ったときに呼ばれる。
</summary>
<param name="context">コールバック内容。</param>
public void OnAttack(InputAction.CallbackContext context)
{
var value = context.ReadValueAsButton();
TextObject.text = $"Attack:{value}\n{TextObject.text}";
}
}
Tout d’abord, définissez autant d’actions dans la classe que vous InputAction
souhaitez implémenter sur le terrain.
Ici, nous allons préparer les champs pour « Déplacer » et « Attaquer », qui ont également été utilisés dans l’explication précédente de la carte d’action.
Si le nombre d’actions augmente, vous devez déclarer ce nombre, mais s’il y en a List
Dictionary
plusieurs, vous pouvez les gérer avec , , etc.
Il n’est pas utilisé ici, mais si vous avez votre propre InputActionMap
classe, vous pouvez la gérer là-bas.
L’instanciation et l’affectation AddBinding
de clé dans la méthode appelée Awake
lors de l’initialisation InputAction
sont effectuées.
Vous pouvez considérer ce que vous faites comme un programme qui ajoute une liaison sur l’écran de configuration de la carte d’action.
AddBinding
La chaîne spécifiée pour Méthode, etc. est identique à la chaîne affichée dans Chemin sur l’écran de configuration de la carte d’action.
Pour afficher une chaîne de caractères, appuyez sur le bouton « T » à droite.
La gestion des événements appelée lorsqu’un bouton est actionné est identique au traitement de la version scriptée d’une carte d’action normale. Le processus de rappel est également détourné tel quel.
// 操作時のイベントを設定
MoveAction.performed += context => OnMove(context);
MoveAction.canceled += context => OnMove(context);
AttackAction.performed += context => OnAttack(context);
AttackAction.canceled += context => OnAttack(context);
<summary>
Move 操作を行ったときに呼ばれる。
</summary>
<param name="context">コールバック内容。</param>
public void OnMove(InputAction.CallbackContext context)
{
var vec = context.ReadValue<Vector2>();
TextObject.text = $"Move:({vec.x:f2}, {vec.y:f2})\n{TextObject.text}";
}
Activer, désactiver est InputAction
une unité, alors décrivez autant d’actions que vous le souhaitez.
Si c’est gênant, vous pouvez le List
gérer avec, etc.
private void OnEnable()
{
// オブジェクトが有効になったときにアクションマップを有効にする
MoveAction.Enable();
AttackAction.Enable();
}
Après EventSystem
avoir enregistré le script, attachez-le à un objet texte et configurez-le pour l’affichage.
Lancez le jeu et voyez si les informations d’entrée apparaissent. Le résultat doit être identique à la version scriptée du processus statique de la carte d’action.
Carte d’action Traitement dynamique des modifications
Étant donné que le changement dynamique de la carte d’action se fait lorsque vous appuyez sur le bouton, définissez la méthode qui sera appelée lorsque vous appuyez sur le bouton.
OnClickButton
Pour l’instant, nous allons le laisser comme .
// 省略
public class InputActionMap : MonoBehaviour
{
// 省略
<summary>
ボタンをクリックしたときに呼ばれる。
</summary>
public void OnClickButton()
{
}
}
Définit l’événement click pour le bouton.
Le processus de réécriture de la carte d’action est le suivant :
<summary>
ボタンをクリックしたときに呼ばれる。
</summary>
public void OnClickButton()
{
TextObject.text = "アクションマップを変更しました。";
// Move アクションのキーを置き換える
MoveAction.ApplyBindingOverride(new InputBinding { path = "<Gamepad>/leftStick", overridePath = "<Gamepad>/dpad" } );
MoveAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/upArrow", overridePath = "<Keyboard>/w" });
MoveAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/downArrow", overridePath = "<Keyboard>/s" });
MoveAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/leftArrow", overridePath = "<Keyboard>/a" });
MoveAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/rightArrow", overridePath = "<Keyboard>/d" });
// Attack アクションのキーを置き換える
AttackAction.ApplyBindingOverride(new InputBinding { path = "<Gamepad>/buttonSouth", overridePath = "<Gamepad>/buttonEast" });
AttackAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/z", overridePath = "<Keyboard>/space" });
}
Étant donné qu’une méthode est fournie pour ApplyBindingOverride
chaque action, le path
chemin de la clé ou du bouton initialisé à ,
overridePath
Écrivez le chemin de la touche ou du bouton que vous souhaitez remplacer.
Soit dit en passant, il s’agit simplement de définir le chemin d’écrasement, de sorte que le chemin d’origine reste tel quel. Par exemple, dans une action Attaque, remplacez la touche z par la barre d’espace. De plus, si vous souhaitez passer de la touche espace à la touche x, la description sera écrasée pour la touche z au lieu d’être basée sur l’espace, comme suit.
AttackAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/z", overridePath = "<Keyboard>/x" });
Une fois enregistré, lancez le jeu et cliquez sur le bouton pour voir si les touches ou les boutons avec lesquels vous interagissez changent.
InputAction
Cette fois, nous modifions la carte d’action pour celle qui a créé une instance de ,
Il existe également InputAction
un script généré par le paramètre de carte d’action de l’interface graphique, veuillez donc l’implémenter dans celui qui est facile à faire.