Sterowanie za pomocą gamepada (wersja pakietu systemu wejściowego)

Strona zaktualizowana :
Data utworzenia strony :

Środowisko weryfikacji

Windows
  • Okna 11
Edytor Unity
  • 2020.3.25f1
Pakiet systemu wejściowego
  • 1.2.0

Wymagania wstępne dotyczące tej porady

Poniższe ustawienia zostały wcześniej wprowadzone jako przesłanka do opisu tej wskazówki.

Informacje o XInput i DirectInput

Chociaż jest ograniczony do systemu Windows, istnieją dwa formaty połączeń dla kontrolerów gier: DirectInput i XInput. Tutaj "Gamepad" odpowiada "XInput".

Ten Gamepad program zajmuje się klasami, ale może obsługiwać tylko kontrolery obsługujące "XInput". Aby użyć kontrolera, który obsługuje DirectInput, musisz użyć innej Joystick klasy.

"DirectInput" to stary format połączenia, a definicja przycisku jest stosunkowo niejednoznaczna i może obsługiwać kontrolery o specjalnych kształtach. Jednak ostatnio "XInput" stał się głównym nurtem, a liczba kontrolerów, które nie obsługują "DirectInput" rośnie. "DirectInput" ma definicje przycisków, takie jak "1", "2" i "3", więc twórcy gry muszą stworzyć zgodność przycisków między grą a kontrolerem, aby można je było odpowiednio ustawić.

XInput jest zdefiniowany jako następna generacja DirectInput i zawiera predefiniowane przyciski A i B, wyzwalacze, drążki itp. Dlatego można stosować tylko stały kształt sterownika, Ponieważ definicja przycisków jest dobrze zdefiniowana, twórcy gier mogą tworzyć gry pasujące do kontrolera, nie martwiąc się o rozmieszczenie przycisków. Ostatnio rośnie liczba kontrolerów gier, które obsługują tylko "XInput".

Określanie, czy przycisk jest naciskany

Przycisk, który jest naciskany, można określić, korzystając z właściwości oraz xxxxxxxx.isPressed klawiatury i myszy. Tutaj chciałbym wyświetlić typ przycisku, który naciskam w tekście.

Najpierw umieść obiekt tekstu wyświetlanego.

Utwórz skrypt werdyktu. Nazwa pliku jest dowolna, ale tutaj GamepadButtons jest .

Skrypt wygląda tak:

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

Po EventSystem zapisaniu skryptu dołącz go do obiektu tekstu wyświetlanego i skonfiguruj go.

Spróbuj uruchomić grę i sprawdź, czy każdy przycisk reaguje.

Nawiasem mówiąc, poniższe przyciski są zdefiniowane jako ten sam przycisk, chociaż wiele przycisków jest przygotowanych, ponieważ są one odczytywane inaczej w zależności od konsoli do gier. W każdym z powyższych programów uwzględniony jest proces osądzania, więc po naciśnięciu przycisku wyświetlane są trzy przyciski.

:
Xbox, PlayStation i nie tylko
bPrzycisk circleButton przyciskWschód
aButton crossButton przyciskPołudnie
xButton squareButton buttonWest
yButton triangleButton przyciskPółnoc

To, co można ocenić jako przycisk, jest następujące.

  • Przycisk, przycisk ×, przycisk w dół
  • Przycisk B, przycisk ○, prawy przycisk
  • Przycisk X, przycisk □, lewy przycisk
  • Przycisk Y, przycisk strzałki w dół, przycisk W górę
  • Przycisk Start, przycisk Menu
  • Przycisk wyboru, przycisk widoku
  • Lewy przycisk na ramieniu, przycisk L1
  • Prawy przycisk na ramieniu, przycisk R1
  • Lewy przycisk drążka
  • Prawy przycisk drążka

Określanie, czy przycisk jest wciśnięty

Osąd w momencie naciśnięcia może być określony przez właściwości, jak w przypadku xxxxxxxx.wasPressedThisFrame klawiatury i myszy. Zwraca wartość momentu naciśnięcia i zwraca wartość nawet true wtedy, gdy false zostanie naciśnięta i przytrzymana po tym dniu.

Wyświetlmy naciśnięty przycisk jako tekst jako test operacji. Umieść obiekt tekstowy do wyświetlenia.

Nazwa pliku skryptu może być dowolna, ale tutaj GamepadButtonsOneFrame jest .

Skrypt wygląda tak: Dla uproszczenia oceniane są tylko 4 przyciski.

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

Po EventSystem zapisaniu skryptu dołącz go do obiektu tekstowego i ustaw obiekt tekstowy do wyświetlenia.

Spróbuj uruchomić grę i nacisnąć przycisk. Myślę, że przycisk, który nacisnąłeś, zostanie dodany. Widać też, że przytrzymanie przycisku nie dodaje żadnego tekstu.

Określ, czy moment zwolnienia przycisku

Nie ma próbki, ale można określić, czy jest wasPressedThisFrame to moment zwolnienia go, używając właściwości zamiast wasReleasedThisFrame właściwości.

Określanie, kiedy naciskasz strzałek

Określa prasę DPAD. W zależności od konsoli do gier będzie latać z strzałek i padem kierunkowym, ale oba są traktowane tak samo. DPAD w zasadzie określa tylko, czy naciskasz w tym kierunku, czy nie. Nie ma takiego osądu jak "pchanie trochę" jak kij.

Umieszcza obiekt tekstowy w celu wyświetlenia decyzji, niezależnie od tego, czy zostanie naciśnięty, czy nie, jako test operacji.

Utwórz skrypt. Nazwa pliku jest dowolna, ale tutaj GamepadDpad jest .

Skrypt wygląda tak:

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

Informacje Gamepad.dpad o DPAD można uzyskać pod adresem .

DPAD ma leftupdown rightwłaściwości dla każdego kierunku i można określić, czy jest on naciskany, czy nie przez właściwość itp. isPressed

DpadControl.ReadValue Możesz również użyć tej metody, aby uzyskać stan Vector2 prasy w formacie . Jeśli nic nie jest wciśnięte (0, 0), jeśli lewa jest wciśnięta (-1, 0) i tak dalej.

Po EventSystem zapisaniu skryptu dołącz go do obiektu tekstowego i ustaw obiekt tekstowy do wyświetlenia.

Spróbuj uruchomić grę i wejść w interakcję z DPAD.

Vector2 Nawiasem mówiąc, jest w stanie znormalizowanym, więc po naciśnięciu po przekątnej uzyskuje się go jako liczbę, taką jak (0, 7071, 0, 7071) zamiast (1, 1).

Określanie naciśnięć spustowych

Kontrolery dla konsoli Xbox mają przyciski zwane wyzwalaczami po lewej i prawej stronie. Na PlayStation odpowiada L2R2. Ten przycisk różni się od zwykłego przycisku i możesz uzyskać kwotę, którą naciskasz w 0,0 ~ 1,0. Niektóre inne kontrolery są wyposażone w nazwy inne niż wyzwalacze, ale w starszych kontrolerach itp. mogą być po prostu umieszczone jako przyciski, w którym to przypadku ocena naciśnięcia jest obsługiwana tylko jako 0, 1.

Tutaj chciałbym sprawdzić ilość naciśnięć spustowych. Umieszcza obiekt tekstowy do wyświetlenia na kanwie.

Utwórz skrypt. Ponieważ będzie używany gdzie indziej, nazwiemy go tutaj GamepadReadValue .

Skrypt wygląda tak:

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 Każda leftTriggerklasa ma właściwość i rightTrigger ReadValue można uzyskać ilość naciśnięć w zakresie 0,0 ~ 1,0, wywołując metodę. Wyzwalacze można również traktować jako przyciski, więc isPressed można również oceniać takie jak. isPressed true Nawiasem mówiąc, kwota staje się ReadValue oparta na 0, 5.

Po zapisaniu skryptu EventSystem dołącz go do obiektu tekstowego i ustaw obiekt tekstowy do wyświetlenia.

Spróbuj uruchomić grę i przesunąć spust.

Określanie informacji o patyku

Drążek może uzyskać informacje odpowiednio lewego i prawego drążka, a ty możesz uzyskać ilość kija popchniętego w dół w którym kierunku. Oczywiście, jeśli nie masz kija na kontrolerze, nie będziesz w stanie uzyskać tych informacji.

Informacje o sztyfcie można pobrać odpowiednio za pomocą , Gamepad.rightStick .Gamepad.leftStick

W przypadku skryptu potwierdzającego operację przekierujemy skrypt użyty wcześniej, aby uzyskać wyzwalacz.

// 省略

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 Informacje prasowe można uzyskać, wywołując Vector2 metodę z ReadValue lub . Vector2 Możesz więc uzyskać jak x y bardzo naciskasz na oś X i oś Y przez i właściwości, Jeśli chcesz uzyskać kierunek, który naciskasz, możesz go uzyskać w nieruchomości, a jeśli magnitude chcesz uzyskać kwotę, którą naciskasz, normalized możesz ją uzyskać w nieruchomości.

Spróbuj faktycznie przesunąć grę i obsługiwać drążek.

Uzyskiwanie informacji o gamepadzie

Możesz uzyskać identyfikator, nazwę itp. z podłączonego gamepada. Na przykład zapoznaj się z sekcją, aby zidentyfikować name typ podłączonego kontrolera lub Możesz dowiedzieć się, z którym deviceId gamepadem chcesz się skojarzyć, gdy podłączonych jest wiele gamepadów.

Tutaj wyświetlimy informacje w tekście, aby sprawdzić operację.

Nazwa skryptu jest dowolna, ale tutaj GamepadInfo jest .

Skrypt wygląda tak:

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 Możesz uzyskać różne informacje z pobranego pliku . Oto kilka fragmentów.

Po zapisaniu skryptu EventSystem dołącz go do obiektu tekstowego i ustaw obiekt tekstowy do wyświetlenia.

Spróbuj uruchomić grę, aby zobaczyć, czy informacje się pojawią.