Steuerung mit einem Gamepad (Input System Package Version)

Diese Seite wurde aktualisiert :
Erstellungsdatum der Seite :

Verifizierungsumgebung

Fenster
  • Windows 11
Unity-Editor
  • 2020.3.25f1
Eingabesystem-Paket
  • 1.2.0

Voraussetzungen für diesen Tipp

Die folgenden Einstellungen wurden im Vorfeld als Prämisse für die Beschreibung dieses Tipps vorgenommen.

Informationen zu XInput und DirectInput

Obwohl es auf Windows beschränkt ist, gibt es zwei Verbindungsformate für Gamecontroller: DirectInput und XInput. Hier entspricht "Gamepad" "XInput".

Dieses Gamepad Programm befasst sich mit Klassen, kann aber nur mit Controllern umgehen, die "XInput" unterstützen. Um einen Controller zu verwenden, der DirectInput unterstützt, müssen Sie eine andere Joystick Klasse verwenden.

"DirectInput" ist ein altes Verbindungsformat und die Definition der Schaltfläche ist relativ mehrdeutig, und es kann Controller mit speziellen Formen verarbeiten. In letzter Zeit ist "XInput" jedoch zum Mainstream geworden, und die Anzahl der Controller, die "DirectInput" nicht unterstützen, nimmt zu. "DirectInput" verfügt über Tastendefinitionen wie "1", "2" und "3", sodass Spieleentwickler eine Tastenentsprechung zwischen dem Spiel und dem Controller erstellen müssen, damit sie entsprechend festgelegt werden können.

XInput ist als die nächste Generation von DirectInput definiert und enthält vordefinierte A- und B-Tasten, Trigger, Sticks usw. Daher kann nur eine feste Form des Reglers verwendet werden, Da die Definition von Tasten gut definiert ist, können Spieleentwickler Spiele erstellen, die zum Controller passen, ohne sich Gedanken über die Platzierung der Tasten machen zu müssen. Neuere Gamecontroller, die nur "XInput" unterstützen, nehmen zu.

Feststellen, ob eine Taste gedrückt wird

Ob eine Taste gedrückt wird oder nicht, können Sie sowohl über Eigenschaften als auch xxxxxxxx.isPressed über Tastatur und Maus bestimmen. Hier möchte ich die Art der Schaltfläche, die ich drücke, im Text anzeigen.

Platzieren Sie zunächst ein Anzeigetextobjekt.

Erstellen Sie ein Skript für das Urteil. Der Dateiname ist willkürlich, aber hier GamepadButtons ist er .

Das Skript sieht wie folgt aus:

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();
  }
}

Nachdem EventSystem Sie das Skript gespeichert haben, fügen Sie es an das Anzeigetextobjekt an und konfigurieren Sie es.

Versuchen Sie, das Spiel auszuführen, und prüfen Sie, ob jede Taste reagiert.

Die folgenden Schaltflächen sind übrigens als dieselbe Schaltfläche definiert, obwohl mehrere Schaltflächen vorbereitet sind, da sie je nach Spielkonsole unterschiedlich gelesen werden. In jedem der oben genannten Programme ist ein Beurteilungsprozess enthalten, sodass beim Drücken der Taste drei Tasten angezeigt werden.

Xbox,PlayStation und mehr
bKnopf circleButton buttonEast
aKnopf crossButton buttonSüd
xButton squareButton buttonWest
yButton triangleButton buttonNorth

Was als Knopf beurteilt werden kann, ist wie folgt.

  • Eine Taste, × Taste, eine Abwärtstaste
  • B-Taste, ○-Taste, rechte Taste
  • X-Taste, □-Taste, Linke Taste
  • Y-Taste, Pfeil-nach-unten-Taste, Aufwärts-Taste
  • Start-Taste, Menü-Taste
  • Schaltfläche auswählen, Schaltfläche anzeigen
  • Linke Schultertaste, L1-Taste
  • Rechte Schultertaste, R1-Taste
  • Linke Stick-Taste
  • Rechte Stick-Taste

Stellen Sie fest, ob die Taste gedrückt ist

Das Urteil im Moment des Drückens kann wie bei xxxxxxxx.wasPressedThisFrame Tastatur und Maus durch die Eigenschaften bestimmt werden. Gibt den Wert des Moments true zurück, in dem es gedrückt wird, und gibt es auch dann zurück, wenn false es danach gedrückt und gehalten wird.

Lassen Sie uns die gedrückte Schaltfläche als Text als Operationsprüfung anzeigen. Platzieren Sie ein Textobjekt für die Anzeige.

Der Dateiname des Skripts kann beliebig sein, aber hier GamepadButtonsOneFrame ist er .

Das Skript sieht wie folgt aus: Der Einfachheit halber werden nur 4 Tasten bewertet.

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";
  }
}

Nachdem EventSystem Sie das Skript gespeichert haben, hängen Sie es an ein Textobjekt für die Anzeige an, und legen Sie es fest.

Versuchen Sie, das Spiel zu starten und die Taste zu drücken. Ich denke, der Knopf, den Sie gedrückt haben, wird hinzugefügt. Sie können auch sehen, dass durch Gedrückthalten der Taste kein Text hinzugefügt wird.

Bestimmen Sie, ob der Moment, in dem die Taste losgelassen wird,

Es gibt kein Beispiel, aber Sie können feststellen, ob es der Moment ist wasPressedThisFrame , in dem Sie es freigeben, indem Sie eine Eigenschaft anstelle einer wasReleasedThisFrame Eigenschaft verwenden.

Bestimmen Sie, wann Sie die Pfeiltasten drücken

Bestimmt die Presse des DPAD. Je nach Spielkonsole fliegt es mit den Pfeiltasten und dem D-Pad, aber beide werden als gleich behandelt. Der DPAD bestimmt im Grunde nur, ob Sie in diese Richtung drängen oder nicht. Es gibt kein Urteil wie "ein wenig schieben" wie ein Stock.

Platziert ein Textobjekt, um eine Entscheidung anzuzeigen, ob es gedrückt wird oder nicht, als Vorgangsprüfung.

Erstellen Sie ein Skript. Der Dateiname ist willkürlich, aber hier GamepadDpad ist er .

Das Skript sieht wie folgt aus:

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();
  }
}

DPAD-Informationen Gamepad.dpad erhalten Sie unter .

DPAD hat leftupdown rightEigenschaften für jede Richtung, und Sie können bestimmen, ob sie von der Eigenschaft usw. gedrückt wird oder nicht. isPressed

DpadControl.ReadValue Sie können die Methode auch verwenden, um den Status Vector2 der Presse in . Wenn nichts gedrückt wird (0, 0), wenn links gedrückt wird (-1, 0) und so weiter.

Nachdem EventSystem Sie das Skript gespeichert haben, hängen Sie es an ein Textobjekt für die Anzeige an, und legen Sie es fest.

Versuchen Sie, das Spiel auszuführen und mit dem DPAD zu interagieren.

Vector2 Übrigens befindet es sich in einem normalisierten Zustand, d. h. wenn Sie diagonal drücken, wird es als Zahl wie (0,7071, 0,7071) anstelle von (1, 1) erhalten.

Bestimmen von Abzugsdrücken

Xbox-Controller haben links und rechts Tasten, die als Trigger bezeichnet werden. Auf der PlayStation entspricht es L2R2. Diese Taste unterscheidet sich von einer normalen Taste, und Sie können den Betrag, den Sie drücken, in 0,0 ~ 1,0 erhalten. Einige andere Controller sind mit anderen Namen als Triggern ausgestattet, aber in älteren Controllern usw. können sie einfach als Tasten platziert werden, in diesem Fall wird das Urteil des Drückens nur als 0, 1 behandelt.

Hier möchte ich die Anzahl der Abzugsdrücke überprüfen. Platziert ein Textobjekt für die Anzeige im Canvas-Bereich.

Erstellen Sie ein Skript. Da es an anderer Stelle verwendet wird, werden wir es hier GamepadReadValue benennen .

Das Skript sieht wie folgt aus:

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 Jede leftTriggerKlasse hat eine Eigenschaft, und Sie können die Anzahl der Pressvorgänge im Bereich von 0,0 ~ 1,0 rightTrigger ReadValue abrufen, indem Sie die Methode aufrufen. Auslöser können auch als Schaltflächen behandelt werden, sodass isPressed Sie auch beurteilen können, wie z. isPressed true Die Anzahl der Becomes ReadValue basiert übrigens auf 0,5.

Nachdem Sie das Skript gespeichert haben, hängen Sie EventSystem es an ein Textobjekt für die Anzeige an, und legen Sie es fest.

Versuchen Sie, das Spiel auszuführen und den Auslöser zu bewegen.

Stick-Informationen ermitteln

Der Stick kann die Informationen des linken Sticks bzw. des rechten Sticks abrufen, und Sie können den Betrag erhalten, um den der Stick in welche Richtung nach unten gedrückt wird. Wenn Sie keinen Stick auf Ihrem Controller haben, können Sie diese Informationen natürlich nicht abrufen.

Stick-Informationen können mit bzw Gamepad.leftStick. abgerufen Gamepad.rightStick werden.

Für das Vorgangsbestätigungsskript leiten wir das zuvor verwendete Skript um, um den Trigger abzurufen.

// 省略

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 Sie können die Presseinformationen abrufen, indem Sie die Vector2 Methode von ReadValue oder aufrufen. Vector2 So können Sie ermitteln, wie viel Sie auf der X-Achse und der Y-Achse drücken, x y indem Sie Eigenschaften Wenn Sie die Richtung erhalten möchten, in die Sie drücken, können Sie sie in der Eigenschaft erhalten, und wenn Sie die Menge erhalten möchten, die Sie drücken, können Sie magnitude normalized sie in der Eigenschaft erhalten.

Versuchen Sie, das Spiel tatsächlich zu bewegen und den Stick zu bedienen.

Gamepad-Informationen abrufen

Sie können die ID, den Namen usw. vom angeschlossenen Gamepad abrufen. Siehe z. B. zu, um den Typ des angeschlossenen Controllers zu identifizieren name , oder Sie können sich darauf beziehen, mit welchem Gamepad eine Verbindung hergestellt werden soll, deviceId wenn mehrere Gamepads angeschlossen sind.

Hier zeigen wir die Informationen im Text an, um den Vorgang zu überprüfen.

Der Skriptname ist willkürlich, aber hier GamepadInfo ist er .

Das Skript sieht wie folgt aus:

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 Sie können verschiedene Informationen aus der abgerufenen . Hier einige Auszüge.

Nachdem Sie das Skript gespeichert haben, hängen Sie EventSystem es an ein Textobjekt für die Anzeige an, und legen Sie es fest.

Versuchen Sie, das Spiel auszuführen, um zu sehen, ob die Informationen angezeigt werden.