Ovládání pomocí gamepadu (verze balíčku vstupního systému)

Stránky aktualizovány :
Datum vytvoření stránky :

Ověřovací prostředí

Windows
  • Systém Windows 11
Editor jednoty
  • 2020.3.25f1
Vstupní systémový balíček
  • 1.2.0

Předpoklady pro tento tip

Následující nastavení byla provedena předem jako předpoklad pro popis tohoto tipu.

Informace o aplikacích XInput a DirectInput

Ačkoli je omezen na Windows, existují dva formáty připojení pro herní řadiče: DirectInput a XInput. Zde "Gamepad" odpovídá "XInput".

Tento Gamepad program se zabývá třídami, ale může pracovat pouze s řadiči, které podporují "XInput". Chcete-li použít řadič, který podporuje rozhraní DirectInput, je nutné použít jinou Joystick třídu.

"DirectInput" je starý formát připojení a definice tlačítka je poměrně nejednoznačná a dokáže zpracovat řadiče se speciálními tvary. V poslední době se však "XInput" stal hlavním proudem a počet řadičů, které nepodporují "DirectInput", se zvyšuje. "DirectInput" má definice tlačítek, jako jsou "1", "2" a "3", takže tvůrci her musí vytvořit shodu tlačítek mezi hrou a ovladačem, aby je bylo možné správně nastavit.

XInput je definován jako další generace DirectInput a zahrnuje předdefinovaná tlačítka A a B, spouštěče, páčky atd. Proto lze použít pouze pevný tvar regulátoru, Vzhledem k tomu, že definice tlačítek je dobře definována, mohou tvůrci her vytvářet hry, které vyhovují ovladači, aniž by se museli starat o umístění tlačítek. Nedávné herní ovladače, které podporují pouze "XInput", se zvyšují.

Zjištění, zda je stisknuto tlačítko

Můžete určit, zda je tlačítko stisknuto nebo ne vlastnostmi, stejně jako xxxxxxxx.isPressed klávesnice a myš. Zde bych chtěl zobrazit typ tlačítka, které v textu mačkám.

Nejprve umístěte textový objekt zobrazení.

Vytvořte skript pro verdikt. Název souboru je libovolný, ale tady GamepadButtons je .

Skript vypadá takto:

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 uložení skriptu jej připojte k objektu zobrazovaného textu a nakonfigurujte jej.

Zkuste spustit hru a zjistěte, zda každé tlačítko reaguje.

Mimochodem, následující tlačítka jsou definována jako stejné tlačítko, i když je připraveno více tlačítek, protože se čtou odlišně v závislosti na herní konzoli. V každém z výše uvedených programů je zahrnut proces posuzování, takže po stisknutí tlačítka se zobrazí tři tlačítka.

Xbox,PlayStation a další
bButton circleButton buttonEast
aButton crossButton buttonSouth
xButton squareButton buttonWest
yButton triangleButton buttonNorth

Co lze posoudit jako tlačítko, je následující.

  • Tlačítko, × tlačítko, tlačítko dolů
  • Tlačítko B, tlačítko ○, pravé tlačítko
  • Tlačítko X, □ tlačítko, levé tlačítko
  • Tlačítko Y, tlačítko se šipkou dolů, tlačítko nahoru
  • Tlačítko Start, tlačítko Menu
  • Tlačítko Vybrat, tlačítko Zobrazit
  • Levé rameno, L1 tlačítko
  • Pravé rameno, tlačítko R1
  • Tlačítko levé páčky
  • Tlačítko pravé páčky

Zjistěte, zda je tlačítko stisknuto

Úsudek v okamžiku stisknutí může být určen vlastnostmi jako u xxxxxxxx.wasPressedThisFrame klávesnice a myši. Vrátí hodnotu okamžiku, kdy true je stisknut, a vrátí se, i když false je stisknut a poté podržen.

Podívejme se na stisknuté tlačítko jako text jako kontrolu operace. Umístěte textový objekt k zobrazení.

Název souboru skriptu může být cokoliv, ale tady GamepadButtonsOneFrame je .

Skript vypadá takto: Pro jednoduchost jsou posuzována pouze 4 tlačítka.

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 uložení skriptu jej připojte a nastavte textový objekt pro zobrazení.

Zkuste spustit hru a stisknout tlačítko. Myslím, že tlačítko, které jste stiskli, bude přidáno. Můžete také vidět, že podržením tlačítka nepřidáte žádný text.

Zjistěte, zda v okamžiku uvolnění tlačítka

Neexistuje žádná ukázka, ale můžete určit, zda je wasPressedThisFrame to okamžik, kdy ji uvolníte pomocí vlastnosti místo wasReleasedThisFrame vlastnosti.

Určení, kdy stisknete klávesy se šipkami

Určuje stisknutí DPAD. V závislosti na herní konzoli bude létat se šipkami a směrovým ovladačem, ale oba jsou považovány za stejné. DPAD v podstatě pouze určuje, zda tlačíte tímto směrem nebo ne. Neexistuje žádný soud jako "trochu tlačit" jako hůl.

Umístí textový objekt tak, aby zobrazil rozhodnutí, zda je stisknut nebo ne jako kontrola operace.

Vytvořte skript. Název souboru je libovolný, ale tady GamepadDpad je .

Skript vypadá takto:

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

Informace o Gamepad.dpad DPAD můžete získat na adrese .

DPAD má leftupdown rightvlastnosti pro každý směr a můžete určit, zda je stlačen nebo ne vlastností atd. isPressed

DpadControl.ReadValue Můžete také použít metodu k získání stavu Vector2 tisku v . Pokud není nic stisknuto (0, 0), pokud je stisknuto vlevo (-1, 0) atd.

Po EventSystem uložení skriptu jej připojte a nastavte textový objekt pro zobrazení.

Zkuste spustit hru a komunikovat s DPAD.

Vector2 Mimochodem, je v normalizovaném stavu, takže když stisknete diagonálně, získá se jako číslo, jako je (0,7071, 0,7071) místo (1, 1).

Určení stisků spouště

Ovladače pro Xbox mají vlevo a vpravo tlačítka nazývaná spouštěče. Na PlayStation to odpovídá L2R2. Toto tlačítko se liší od normálního tlačítka a můžete získat částku, kterou stisknete v 0,0 ~ 1,0. Některé jiné ovladače jsou vybaveny jinými názvy než spouštěči, ale ve starších ovladačích atd. mohou být jednoduše umístěny jako tlačítka, v takovém případě je úsudek stisknutí zpracován pouze jako 0, 1.

Zde bych chtěl zkontrolovat počet stisknutí spouště. Umístí textový objekt pro zobrazení na plátno.

Vytvořte skript. Vzhledem k tomu, že bude použit jinde, pojmenujeme jej zde GamepadReadValue .

Skript vypadá takto:

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ždá leftTriggertřída má vlastnost a rightTrigger ReadValue můžete získat počet stisknutí v rozsahu 0,0 ~ 1,0 voláním metody. Spouštěče mohou být také považovány za tlačítka, takže isPressed můžete také posoudit například. isPressed true Mimochodem, množství se stává ReadValue na základě 0,5.

Po uložení skriptu EventSystem jej připojte a nastavte textový objekt pro zobrazení.

Zkuste spustit hru a stisknout spoušť.

Určení informací o tyči

Hůl může získat informace o levé páčce a pravé páčce a můžete získat množství toho, jak moc je hůl tlačena dolů v jakém směru. Samozřejmě, pokud nemáte na ovladači páčku, nebudete moci tyto informace získat.

Informace o tyči lze získat pomocí , Gamepad.rightStick respGamepad.leftStick.

Pro potvrzovací skript operace přesměrujeme skript použitý dříve k získání triggeru.

// 省略

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 Informace o tisku můžete získat voláním Vector2 metody z nebo .ReadValue Vector2 Takže můžete získat, kolik x y tlačíte na osu X a osu Y podle a vlastnosti, Pokud chcete získat směr, který tlačíte, můžete ji získat v nemovitosti, a pokud magnitude chcete získat částku, kterou tlačíte, normalized můžete ji získat v nemovitosti.

Pokuste se skutečně hýbat hrou a ovládat páčku.

Získání informací o gamepadu

ID, jméno atd. můžete získat z připojeného gamepadu. Například odkaz na k identifikaci name typu řadiče, který je připojen, nebo Můžete se podívat, ke kterému gamepadu se chcete přidružit, deviceId když je připojeno více gamepadů.

Zde zobrazíme informace v textu pro kontrolu operace.

Název skriptu je libovolný, ale tady GamepadInfo je .

Skript vypadá takto:

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 Můžete získat různé informace z načteného . Zde je několik výňatků.

Po uložení skriptu EventSystem jej připojte a nastavte textový objekt pro zobrazení.

Zkuste spustit hru, abyste zjistili, zda se informace zobrazí.