Contrôle avec une manette de jeu (version du package 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
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.

À propos de XInput et DirectInput

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

Ce Gamepad programme traite des classes, mais cela ne peut gérer que les contrôleurs qui supportent « XInput ». Pour utiliser un contrôleur qui prend en charge DirectInput, vous devez utiliser une classe différente Joystick .

« DirectInput » est un ancien format de connexion et la définition du bouton 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. « DirectInput » a des définitions de boutons telles que « 1 », « 2 » et « 3 », de sorte que les créateurs de jeux doivent créer une correspondance de bouton entre le jeu et la manette afin qu’ils puissent être définis de manière appropriée.

XInput est défini comme la prochaine génération de DirectInput et comprend des boutons A et B prédéfinis, des déclencheurs, des bâtons, etc. Par conséquent, seule une forme fixe du contrôleur peut être utilisée, Puisque la définition des boutons est bien définie, les créateurs de jeux peuvent créer des jeux qui conviennent à la manette sans se soucier de l’emplacement des boutons. Les contrôleurs de jeu récents qui ne prennent en charge que « XInput » augmentent.

Déterminez si vous appuyez sur un bouton

Vous pouvez déterminer si un bouton est enfoncé ou non par les propriétés ainsi que xxxxxxxx.isPressed par le clavier et la souris. Ici, je voudrais afficher le type de bouton sur lequel j’appuie dans le texte.

Tout d’abord, placez un objet texte d’affichage.

Créez un script pour le verdict. Le nom du fichier est arbitraire, mais le voici GamepadButtons .

Le script ressemble à ceci :

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

public class GamepadButtons : 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 gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // ボタンを押している間は xxxxxxxx.isPressed が true を返します

    // B ボタンや East ボタン、○ボタンは読み方が違うだけで同じボタンです
    // これは PlayStation や Xbox, Switch などでボタンの読み方が違うためです
    if (gamepad.aButton.isPressed) Builder.AppendLine($"A");
    if (gamepad.bButton.isPressed) Builder.AppendLine($"B");
    if (gamepad.xButton.isPressed) Builder.AppendLine($"X");
    if (gamepad.yButton.isPressed) Builder.AppendLine($"Y");

    if (gamepad.buttonEast.isPressed) Builder.AppendLine($"East");
    if (gamepad.buttonWest.isPressed) Builder.AppendLine($"West");
    if (gamepad.buttonNorth.isPressed) Builder.AppendLine($"North");
    if (gamepad.buttonSouth.isPressed) Builder.AppendLine($"South");

    if (gamepad.circleButton.isPressed) Builder.AppendLine($"Circle");
    if (gamepad.crossButton.isPressed) Builder.AppendLine($"Cross");
    if (gamepad.triangleButton.isPressed) Builder.AppendLine($"Triangle");
    if (gamepad.squareButton.isPressed) Builder.AppendLine($"Square");

    // コントローラーの中央にあるスタートボタン、セレクトボタン、メニューボタン、ビューボタンなどに該当します。
    if (gamepad.startButton.isPressed) Builder.AppendLine($"Start");
    if (gamepad.selectButton.isPressed) Builder.AppendLine($"Select");

    // 左と右のスティックをまっすぐ押し込んだかどうかを判定します
    if (gamepad.leftStickButton.isPressed) Builder.AppendLine($"LeftStickButton");
    if (gamepad.rightStickButton.isPressed) Builder.AppendLine($"RightStickButton");

    // 左上と右上にあるボタン。PlayStation だと L1 や R1 に該当します
    if (gamepad.leftShoulder.isPressed) Builder.AppendLine($"LeftShoulder");
    if (gamepad.rightShoulder.isPressed) Builder.AppendLine($"RightShoulder");

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

Après EventSystem avoir enregistré le script, attachez-le à l’objet texte d’affichage et configurez-le.

Essayez d’exécuter le jeu et voyez si chaque bouton répond.

À propos, les boutons suivants sont définis comme le même bouton, bien que plusieurs boutons soient préparés car ils sont lus différemment selon la console de jeu. Dans chacun des programmes ci-dessus, un processus de jugement est inclus, donc lorsque vous appuyez sur le bouton, trois boutons sont affichés.

encore
XboxPlayStation et plus
bBouton circleButton buttonEast
aBouton crossButton boutonSud
xButton squareButton buttonWest
yButton triangleButton buttonNord

Ce qui peut être jugé comme un bouton est le suivant.

  • Un bouton, × bouton, bouton bas
  • Bouton B, ○ bouton, bouton droit
  • Bouton X, bouton □, bouton gauche
  • Bouton Y, bouton flèche bas, bouton haut
  • bouton Démarrer, bouton Menu
  • Bouton Sélectionner, bouton Afficher
  • Bouton épaule gauche, bouton L1
  • Bouton de l’épaule droite, bouton R1
  • Bouton du stick gauche
  • Bouton du stick droit

Déterminez si vous appuyez sur le bouton

Le jugement au moment de la presse peut être déterminé par les propriétés comme avec xxxxxxxx.wasPressedThisFrame le clavier et la souris. Renvoie la valeur du moment où true il est pressé et renvoyée même si false elle est enfoncée et maintenue par la suite.

Affichons le bouton enfoncé sous forme de texte en tant que vérification d’opération. Placez un objet texte à afficher.

Le nom de fichier du script peut être n’importe quoi, mais le voici GamepadButtonsOneFrame .

Le script ressemble à ceci : Pour simplifier, seuls 4 boutons sont jugés.

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

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

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

    // 1つ目のゲームパッドの情報を取得
    var gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    // ボタンが押された瞬間かどうかを判定
    if (gamepad.aButton.wasPressedThisFrame) TextObject.text += "A";
    if (gamepad.bButton.wasPressedThisFrame) TextObject.text += "B";
    if (gamepad.xButton.wasPressedThisFrame) TextObject.text += "X";
    if (gamepad.yButton.wasPressedThisFrame) TextObject.text += "Y";
  }
}

Après EventSystem avoir enregistré le script, attachez-le à et définissez un objet texte à afficher.

Essayez d’exécuter le jeu et d’appuyer sur le bouton. Je pense que le bouton sur lequel vous avez appuyé sera ajouté. Vous pouvez également voir que le fait de maintenir le bouton enfoncé n’ajoute pas de texte.

Déterminez si le moment où le bouton est relâché

Il n’y a pas d’exemple, mais vous pouvez déterminer si c’est wasPressedThisFrame le moment où vous le libérez en utilisant une propriété au lieu d’une wasReleasedThisFrame propriété.

Déterminer quand vous appuyez sur les touches fléchées

Détermine la pression du DPAD. Selon la console de jeu, il volera avec les touches fléchées et le D-pad, mais les deux sont traités de la même manière. Essentiellement, le DPAD détermine seulement si vous poussez dans cette direction ou non. Il n’y a pas de jugement comme « pousser un peu » comme un bâton.

Place un objet texte pour afficher une décision s’il est pressé ou non en tant que vérification d’opération.

Créez un script. Le nom du fichier est arbitraire, mais le voici GamepadDpad .

Le script ressemble à ceci :

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

public class GamepadDpad : 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 gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // Dpad の押下情報を Vector2 として取得するパターン
    var value = gamepad.dpad.ReadValue();
    Builder.Append($"(x:{value.x}, y:{value.y})");

    // Dpad の各方向のボタンを押しているかどうかの判定
    if (gamepad.dpad.left.isPressed) Builder.Append(" left");
    if (gamepad.dpad.right.isPressed) Builder.Append(" right");
    if (gamepad.dpad.up.isPressed) Builder.Append(" up");
    if (gamepad.dpad.down.isPressed) Builder.Append(" down");

    // Dpad の情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

Vous pouvez obtenir des informations sur Gamepad.dpad DPAD à l’adresse .

DPAD a leftupdown rightdes propriétés pour chaque direction, et vous pouvez déterminer s’il est pressé ou non par la propriété, etc. isPressed

DpadControl.ReadValue Vous pouvez également utiliser la méthode pour obtenir l’état Vector2 de la presse dans . Si rien n’est enfoncé (0, 0), si gauche est enfoncé (-1, 0), et ainsi de suite.

Après EventSystem avoir enregistré le script, attachez-le à et définissez un objet texte à afficher.

Essayez d’exécuter le jeu et d’interagir avec le DPAD.

Vector2 Soit dit en passant, est dans un état normalisé, donc lorsque vous appuyez en diagonale, il est obtenu sous la forme d’un nombre tel que (0,7071, 0,7071) au lieu de (1, 1).

Déterminer les presses de gâchette

Les manettes Xbox ont des boutons appelés déclencheurs à gauche et à droite. Sur PlayStation, il correspond à L2R2. Ce bouton est différent d’un bouton normal, et vous pouvez obtenir le montant sur lequel vous appuyez en 0.0 ~ 1.0. Certains autres contrôleurs sont équipés de noms autres que les déclencheurs, mais dans les contrôleurs plus anciens, etc., ils peuvent simplement être placés comme des boutons, auquel cas le jugement d’appuyer n’est traité que comme 0, 1.

Ici, je voudrais vérifier le nombre de pressions de déclenchement. Place un objet texte à afficher sur le canevas.

Créez un script. Puisqu’il sera utilisé ailleurs, nous le nommerons ici GamepadReadValue .

Le script ressemble à ceci :

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

public class GamepadReadValue : 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 gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // トリガーの押下量を取得
    Builder.AppendLine($"LeftTrigger:{gamepad.leftTrigger.ReadValue()}");
    Builder.AppendLine($"RightTrigger:{gamepad.rightTrigger.ReadValue()}");

    // 情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

Gamepad Chaque leftTriggerclasse a une propriété et rightTrigger ReadValue vous pouvez obtenir le nombre de presses dans la plage de 0,0 ~ 1,0 en appelant la méthode. Les déclencheurs peuvent également être traités comme des boutons, de sorte isPressed que vous pouvez également juger tels que. isPressed true Soit dit en passant, le montant de devient ReadValue est basé sur 0,5.

Après avoir enregistré le script, EventSystem attachez-le à et définissez un objet texte à afficher.

Essayez d’exécuter le jeu et d’appuyer sur la gâchette.

Déterminer les informations du bâton

Le bâton peut obtenir les informations du bâton gauche et du bâton droit respectivement, et vous pouvez obtenir la quantité de combien le bâton est poussé vers le bas dans quelle direction. Bien sûr, si vous n’avez pas de bâton sur votre manette, vous ne pourrez pas obtenir cette information.

Les informations sur le bâton peuvent être récupérées avec , Gamepad.rightStick respectivementGamepad.leftStick.

Pour le script de confirmation d’opération, nous allons détourner le script utilisé précédemment pour obtenir le déclencheur.

// 省略

public class GamepadReadValue : MonoBehaviour
{
  // 省略

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    // 省略

    // トリガーの押下量を取得
    Builder.AppendLine($"LeftTrigger:{gamepad.leftTrigger.ReadValue()}");
    Builder.AppendLine($"RightTrigger:{gamepad.rightTrigger.ReadValue()}");

    // スティックの入力を取得
    var leftStickValue = gamepad.leftStick.ReadValue();
    Builder.AppendLine($"LeftStick:{leftStickValue.normalized * leftStickValue.magnitude}");
    var rightStickValue = gamepad.rightStick.ReadValue();
    Builder.AppendLine($"RightStick:{rightStickValue.normalized * rightStickValue.magnitude}");

    // 情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

leftStickrightStick Vous pouvez obtenir les informations de presse en appelant la Vector2 méthode à partir de ReadValue ou . Vector2 Ainsi, vous pouvez obtenir combien x y vous appuyez sur l’axe X et l’axe Y par et propriétés, Si vous voulez obtenir la direction dans laquelle vous appuyez, vous pouvez l’obtenir dans la propriété, et si vous voulez obtenir le montant que vous pressez, vous magnitude normalized pouvez l’obtenir dans la propriété.

Essayez réellement de déplacer le jeu et d’utiliser le bâton.

Obtenir des informations sur la manette de jeu

Vous pouvez obtenir l’ID, le nom, etc. à partir de la manette de jeu connectée. Par exemple, reportez-vous à pour identifier name le type de contrôleur connecté, ou Vous pouvez vous référer à la manette de jeu à associer deviceId lorsque plusieurs manettes de jeu sont connectées.

Ici, nous allons afficher les informations dans le texte pour vérifier l’opération.

Le nom du script est arbitraire, mais le voici GamepadInfo .

Le script ressemble à ceci :

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

public class GamepadInfo : 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 gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // ゲームパッドの各情報を取得
    Builder.AppendLine($"deviceId:{gamepad.deviceId}");
    Builder.AppendLine($"name:{gamepad.name}");
    Builder.AppendLine($"displayName:{gamepad.displayName}");
    Builder.AppendLine($"shortDisplayName:{gamepad.shortDisplayName}");
    Builder.AppendLine($"path:{gamepad.path}");
    Builder.AppendLine($"layout:{gamepad.layout}");

    // 情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

Gamepad Vous pouvez obtenir diverses informations à partir du fichier . En voici quelques extraits.

Après avoir enregistré le script, EventSystem attachez-le à et définissez un objet texte à afficher.

Essayez d’exécuter le jeu pour voir si les informations s’affichent.