Bedienung mit einem Joystick (Input-System-Paketversion)

Diese Seite wurde aktualisiert :
Erstellungsdatum der Seite :

Verifikations-Umgebung

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

Voraussetzungen für diesen Tipp

Die folgenden Einstellungen sind als Voraussetzung für die Erläuterung dieser Tipps vorkonfiguriert.

Informationen zu XInput und DirectInput

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

In Joystick diesem Programm haben wir es mit einer Klasse zu tun, die jedoch nur mit Controllern umgehen kann, die "DirectInput" unterstützen. Um einen Controller zu verwenden, der "XInput" unterstützt, müssen Sie eine andere Gamepad Klasse verwenden.

"DirectInput" ist ein altes Verbindungsformat, und die Definition von Schaltflächen ist relativ mehrdeutig, und es kann Controller mit speziellen Formen verarbeiten. In letzter Zeit ist "XInput" jedoch zum Mainstream geworden, und die Zahl der Controller, die "DirectInput" nicht unterstützen, nimmt zu. Da "DirectInput" Schaltflächen als "1", "2" und "3" definiert, müssen Spieleentwickler ein System erstellen, mit dem die Entsprechung der Spiel- und Controllertasten entsprechend eingestellt werden kann.

"XInput" ist definiert als die nächste Generation von "DirectInput" und verfügt über vordefinierte A- und B-Tasten, Trigger, Sticks usw. Daher kann nur die Form des Reglers verwendet werden, die fast fest ist. Da die Definition von Schaltflächen klar definiert ist, können Spieleentwickler Spiele erstellen, die zum Controller passen, ohne sich Gedanken über die Platzierung der Schaltflächen machen zu müssen. Immer mehr neuere Gamecontroller sind nur mit "XInput" kompatibel.

Über Joysticks

Wie oben erwähnt, gibt es keine Definition der Schaltfläche, so dass es notwendig ist, lästige Prozesse hinzuzufügen, wie z. B. das Zuweisen von Spieloperationen, während die Informationen der einzelnen Schaltflächen untersucht werden, um sie tatsächlich zu verwenden. Ich glaube nicht, dass Sie DirectInput in einem neuen Spiel verwenden müssen, weil es alt ist, aber denken Sie daran, dass Ihr Programm kompliziert sein kann, wenn Sie es wirklich unterstützen möchten.

Dieses Beispiel beschränkt sich im Wesentlichen auf das Abrufen von Informationen zu den aufgelisteten Schaltflächen. name In der Tat müssen Sie Vorgänge überprüfen und zuweisen.

Joystick-Informationserfassung

Platzieren Sie ein Textobjekt, um Informationen zu den einzelnen Tasten auf dem Joystick anzuzeigen.

Erstellen Sie ein Skript. Der Name ist willkürlich, aber in diesem Fall JoystickInfo ist es .

Das Skript sieht folgendermaßen aus: Die erhaltenen Informationen variieren je nach Art des Controllers. Es ist sehr schwierig, für jeden Controller zu programmieren, also zähle ich einfach alle Tasten auf und erhalte den Tastentyp und die Druckinformationen.

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

Informationen Joystick.current über den angeschlossenen Joystick erhalten Sie in . Joystick Danach erhalten wir alle Informationen aus der Klasse.

Joystick Wie Sie der Klasse entnehmen können, gibt es Definitionen wie und , stick trigger aber es gibt keine Definitionen wie die A-Schaltfläche oder die Startschaltfläche. Daher sollten Sie die Eigenschaften verwenden, um alle Tasten und SticksallControls aufzulisten und den Tastentyp und die Druckinformationen zu ermitteln.

Sobald das Skript gespeichert ist, EventSystem hängen Sie es an ein Textobjekt für die Anzeige von Informationen an und legen Sie es fest.

Versuchen Sie, das Spiel mit einem Controller auszuführen, der DirectInput unterstützt. Jede Information kann abgerufen werden.

Je nach Controller erhalten Sie möglicherweise nicht den gewünschten Wert, wenn Sie einen Stick, eine Pfeiltaste usw. drücken. Da die Tasten nicht auf diese Weise definiert sind, ist es schwierig, genaue Druckinformationen für jede Taste zu erhalten. Außerdem sieht man, dass es recht schwierig ist, den Joystick vollständig zu unterstützen, da die Anordnung der Tasten je nach Controller unterschiedlich ist.

Wenn das Spiel Joysticks unterstützen soll, wäre es wünschenswert, einen Einstellungsbildschirm wie eine Tastenkonfiguration zu haben, damit jeder Benutzer das Tastenlayout des Controllers, den er hat, anpassen kann.

So erhalten Sie Informationen für mehrere Joysticks

Informationen zu Joystick.all allen angeschlossenen Joysticks erhalten Sie in . ReadOnlyArray Es foreach kann in aufgezählt werden und so weiter.

Da es sich bei jedem Wert um eine Klasse handelt Joystick , können Sie wie im vorherigen Programm Joystick-Informationen abrufen.