Utilisation à l’aide d’un joystick (version packagée du système d’entrée)

Page mise à jour :
Date de création de la page :

Environnement de vérification

Windows
  • Fenêtres 11
Éditeur Unity
  • 2020.3.25f1
Packages du système d’entrée
  • 1.2.0

Conditions préalables à cette astuce

Les paramètres suivants sont préconfigurés comme condition préalable à l’explication de ces conseils.

À propos de XInput et de DirectInput

Bien qu’il soit limité à Windows, il existe deux formats de connexion pour les contrôleurs de jeu : « DirectInput » et « XInput ». « Joystick » correspond ici à « DirectInput ».

Dans Joystick ce programme, nous avons affaire à une classe, mais elle ne peut gérer que les contrôleurs qui prennent en charge « DirectInput ». Pour utiliser un contrôleur qui prend en charge « XInput », vous devez utiliser une classe différente Gamepad .

« DirectInput » est un ancien format de connexion, et la définition des boutons est relativement ambiguë, et il peut gérer des contrôleurs avec des formes spéciales. Cependant, récemment, « XInput » est devenu courant et le nombre de contrôleurs qui ne prennent pas en charge « DirectInput » augmente. Étant donné que « DirectInput » définit les boutons comme « 1 », « 2 » et « 3 », les créateurs de jeux doivent créer un système qui permet de définir de manière appropriée la correspondance entre les boutons du jeu et de la manette.

« XInput » est défini comme la prochaine génération de « DirectInput » et possède des boutons A et B prédéfinis, des gâchettes, des sticks, etc. Par conséquent, la forme du contrôleur ne peut être utilisée, qui est presque fixe. Étant donné que la définition des boutons est bien définie, les créateurs de jeux peuvent créer des jeux qui correspondent à la manette sans se soucier de l’emplacement des boutons. De plus en plus de manettes de jeu récentes ne sont compatibles qu’avec « XInput ».

À propos des joysticks

Comme mentionné ci-dessus, il n’y a pas de définition du bouton, donc pour l’utiliser réellement, il est nécessaire d’ajouter des processus gênants tels que l’affectation d’opérations de jeu tout en examinant les informations de chaque bouton. Je ne pense pas que vous ayez besoin d’utiliser DirectInput dans un nouveau jeu parce qu’il est ancien, mais gardez à l’esprit que si vous voulez vraiment le supporter, votre programme peut être compliqué.

Cet exemple se limite essentiellement à l’obtention d’informations sur les boutons répertoriés. name En fait, vous devez vérifier et attribuer des opérations.

Acquisition d’informations par joystick

Placez un objet texte pour afficher des informations sur chaque bouton du joystick.

Créez un script. Le nom est arbitraire, mais dans ce cas JoystickInfo , c’est .

Le script ressemble à ceci : Les informations obtenues varient en fonction du type de contrôleur. Il est très difficile de programmer pour chaque contrôleur, alors j’énumère tous les boutons et j’obtiens le type de bouton et les informations sur la pression.

using System.Text;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
using UnityEngine.UI;

public class JoystickInfo : MonoBehaviour
{
  /// <summary>情報を表示させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  StringBuilder Builder = new StringBuilder();

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    if (TextObject == null)
    {
      Debug.Log($"{nameof(TextObject)} が null です。");
      return;
    }

    // 1つ目のジョイスティックの情報を取得
    var joystick = Joystick.current;
    if (joystick == null)
    {
      Debug.Log("ジョイスティックがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // ジョイスティックの情報取得
    Builder.AppendLine($"deviceId:{joystick.deviceId}");
    Builder.AppendLine($"name:{joystick.name}");
    Builder.AppendLine($"displayName:{joystick.displayName}");

    // ジョイスティックにはボタンの大部分が定義されていないので
    // 基本的には allControls で列挙して入力の種類と値を確認していく
    foreach (var key in joystick.allControls)
    {
      if (key is StickControl stick)
      {
        if (stick.up.isPressed) Builder.AppendLine($"{key.name} Up");
        if (stick.down.isPressed) Builder.AppendLine($"{key.name} Down");
        if (stick.left.isPressed) Builder.AppendLine($"{key.name} Left");
        if (stick.right.isPressed) Builder.AppendLine($"{key.name} Right");

        var value = stick.ReadValue();
        if (value.magnitude > 0f)
        {
          Builder.AppendLine($"{key.name}:{value.normalized * value.magnitude}");
        }
      }
      else if (key is Vector2Control vec2)
      {
        var value = vec2.ReadValue();
        if (value.magnitude > 0f)
        {
          Builder.AppendLine($"{key.name}:{value.normalized * value.magnitude}");
        }
        if (vec2.x.ReadValue() != 0f)
        {
          Builder.AppendLine($"{key.name}.x:{vec2.x.ReadValue()}");
        }
        if (vec2.y.ReadValue() != 0f)
        {
          Builder.AppendLine($"{key.name}.x:{vec2.y.ReadValue()}");
        }
      }
      else if (key is ButtonControl button)
      {
        if (button.isPressed) Builder.AppendLine($"{key.name} isPress");
        var value = button.ReadValue();
        if (value != 0f)
        {
          Builder.AppendLine($"{key.name}:{value}");
        }
      }
      else if (key is AxisControl axis)
      {
        if (axis.IsPressed()) Builder.AppendLine($"{key.name} isPress");

        var value = axis.ReadValue();
        if (value != 0f)
        {
          Builder.AppendLine($"{key.name}:{value}");
        }
      }
      else
      {
        Builder.AppendLine($"Type={key.GetType()}");
      }
    }

    // 押しているボタン一覧をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

Vous pouvez obtenir des informations Joystick.current sur le joystick connecté dans . Joystick Après cela, nous obtiendrons chaque information de la classe.

Joystick Comme vous pouvez le voir dans la classe, il existe des définitions telles que et , stick trigger mais il n’y a pas de définitions telles que le bouton A ou le bouton Démarrer. Par conséquent, vous devez utiliser les propriétés pour énumérer tous les boutons, les joysticksallControls et trouver le type de bouton et les informations d’appui.

Une fois le script enregistré, EventSystem attachez-le à un objet texte pour l’affichage des informations et définissez-le dans un objet texte.

Essayez d’exécuter le jeu avec une manette qui prend en charge DirectInput. Chaque information peut être récupérée.

Selon le contrôleur, il se peut que vous n’obteniez pas la valeur prévue lorsque vous appuyez sur un joystick, une touche fléchée, etc. Étant donné que les boutons ne sont pas définis de cette manière, il est difficile d’obtenir des informations précises sur chaque bouton. De plus, vous pouvez voir qu’il est assez difficile de prendre entièrement en charge le joystick, comme la disposition des boutons diffère en fonction de la manette.

Si le jeu doit prendre en charge les joysticks, il serait souhaitable d’avoir un écran de configuration comme une configuration de clé afin que chaque utilisateur puisse personnaliser la disposition des boutons de la manette qu’il possède.

Comment obtenir des informations pour plusieurs joysticks

Des informations sur Joystick.all tous les joysticks connectés peuvent être obtenues dans . ReadOnlyArray Il foreach peut être énuméré dans et ainsi de suite.

Étant donné que chaque valeur est Joystick une classe, vous pouvez obtenir des informations sur le joystick comme dans le programme précédent.