Ovládanie pomocou gamepadu (verzia vstupného systémového balíka)

Stránka aktualizovaná :
Dátum vytvorenia strany :

Prostredie overovania

Windows
  • Windows 11
Editor jednoty
  • 2020.3.25f1
Vstupný systémový balík
  • 1.2.0

Predpoklady pre tento tip

Nasledujúce nastavenia boli vykonané vopred ako predpoklad pre popis tohto tipu.

O spoločnosti XInput a DirectInput

Hoci je obmedzený na Windows, existujú dva formáty pripojenia pre herné ovládače: DirectInput a XInput. Tu "Gamepad" zodpovedá "XInput".

Tento Gamepad program sa zaoberá triedami, ale to dokáže zvládnuť iba ovládače, ktoré podporujú "XInput". Ak chcete použiť ovládač, ktorý podporuje DirectInput, musíte použiť inú Joystick triedu.

"DirectInput" je starý formát pripojenia a definícia tlačidla je pomerne nejednoznačná a dokáže zvládnuť ovládače so špeciálnymi tvarmi. V poslednej dobe sa však "XInput" stal hlavným prúdom a počet ovládačov, ktoré nepodporujú "DirectInput", sa zvyšuje. "DirectInput" má definície tlačidiel, ako napríklad "1", "2" a "3", takže tvorcovia hier musia vytvoriť korešpondenciu tlačidiel medzi hrou a ovládačom, aby ich bolo možné správne nastaviť.

XInput je definovaný ako ďalšia generácia DirectInput a obsahuje preddefinované tlačidlá A a B, spúšte, páčky atď. Preto je možné použiť iba pevný tvar regulátora, Keďže definícia tlačidiel je dobre definovaná, tvorcovia hier môžu vytvárať hry, ktoré vyhovujú ovládaču, bez obáv z umiestnenia tlačidiel. Nedávnych herných ovládačov, ktoré podporujú iba "XInput", pribúda.

Ako zistiť, či sa stláča tlačidlo

To, či je tlačidlo stlačené alebo nie, môžete určiť podľa vlastností, ako xxxxxxxx.isPressed aj klávesnice a myši. Tu by som chcel v texte zobraziť typ tlačidla, ktoré stláčam.

Najprv umiestnite objekt zobrazeného textu.

Vytvorte skript verdiktu. Názov súboru je ľubovoľný, ale tu GamepadButtons je .

Skript vyzerá 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 ho priložte k objektu zobrazovaného textu a nakonfigurujte ho.

Skúste spustiť hru a zistite, či každé tlačidlo reaguje.

Mimochodom, nasledujúce tlačidlá sú definované ako rovnaké tlačidlo, aj keď je pripravených viac tlačidiel, pretože sa čítajú odlišne v závislosti od hernej konzoly. V každom z vyššie uvedených programov je zahrnutý proces posudzovania, takže po stlačení tlačidla sa zobrazia tri tlačidlá.

Xbox, PlayStation a ďalšie
bButton kruhButton tlačidloVýchod
aButton crossButton tlačidloJuh
xButton squareButton tlačidloZápad
yButton trojuholníkTlačidlo tlačidloSever

Čo možno posúdiť ako tlačidlo, je nasledovné.

  • Tlačidlo, tlačidlo ×, tlačidlo nadol
  • Tlačidlo B, tlačidlo ○, pravé tlačidlo
  • Tlačidlo X, tlačidlo □, ľavé tlačidlo
  • Tlačidlo Y, tlačidlo so šípkou nadol, tlačidlo nahor
  • Tlačidlo Štart, tlačidlo Ponuka
  • Vybrať tlačidlo, Zobraziť tlačidlo
  • Ľavé ramenné tlačidlo, tlačidlo L1
  • Pravé ramenné tlačidlo, tlačidlo R1
  • Tlačidlo ľavej páčky
  • Pravé tlačidlo páčky

Ako zistiť, či je tlačidlo stlačené

Úsudok v okamihu stlačenia môže byť určený vlastnosťami ako pri xxxxxxxx.wasPressedThisFrame klávesnici a myši. Vráti hodnotu okamihu true stlačenia a vráti sa aj v prípade, že false je stlačený a podržaný neskôr.

Tlačidlo stlačené ako text zobrazme ako kontrolu operácie. Umiestnenie textového objektu na zobrazenie.

Názov súboru skriptu môže byť čokoľvek, ale tu GamepadButtonsOneFrame je .

Skript vyzerá takto: Pre jednoduchosť sa posudzujú iba 4 tlačidlá.

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 ho pripojte a nastavte textový objekt na zobrazenie.

Skúste spustiť hru a stlačiť tlačidlo. Myslím, že tlačidlo, ktoré ste stlačili, bude pridané. Môžete tiež vidieť, že podržaním tlačidla sa nepridá žiadny text.

Ako zistiť, či nastal okamih uvoľnenia tlačidla

Neexistuje žiadna vzorka, ale môžete určiť, či je wasPressedThisFrame to okamih, keď ju uvoľníte, použitím vlastnosti namiesto wasReleasedThisFrame vlastnosti.

Určenie stlačenia klávesov so šípkami

Určuje lis DPAD. V závislosti od hernej konzoly bude lietať so šípkami a smerovým ovládačom, ale s oboma sa zaobchádza rovnako. DPAD v podstate určuje iba to, či tlačíte týmto smerom alebo nie. Neexistuje úsudok ako "trochu tlačiť" ako palica.

Umiestni textový objekt na zobrazenie rozhodnutia, či sa stlačí alebo nie, ako kontrola operácie.

Vytvorte skript. Názov súboru je ľubovoľný, ale tu GamepadDpad je .

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

Informácie Gamepad.dpad o DPAD môžete získať na adrese .

DPAD má leftupdown rightvlastnosti pre každý smer a môžete určiť, či je stlačený vlastnosťou alebo nie atď. isPressed

DpadControl.ReadValue Môžete tiež použiť metódu na zistenie stavu Vector2 tlače v . Ak nie je nič stlačené (0, 0), ak je stlačený ľavý (-1, 0) atď.

Po EventSystem uložení skriptu ho pripojte a nastavte textový objekt na zobrazenie.

Skúste spustiť hru a komunikovať s DPAD.

Vector2 Mimochodom, je v normalizovanom stave, takže keď stlačíte diagonálne, získa sa ako číslo ako (0, 7071, 0, 7071) namiesto (1, 1).

Určite stlačenia spúšte

Ovládače pre Xbox majú vľavo a vpravo tlačidlá nazývané spúšťače. Na PlayStation zodpovedá L2R2. Toto tlačidlo sa líši od bežného tlačidla a sumu, ktorú stláčate, môžete získať v 0.0 ~ 1.0. Niektoré ďalšie ovládače sú vybavené inými názvami ako spúšťače, ale v starších ovládačoch atď. môžu byť jednoducho umiestnené ako tlačidlá, v takom prípade sa úsudok o stlačení spracováva iba ako 0, 1.

Tu by som chcel skontrolovať množstvo stlačení spúšte. Umiestni textový objekt na zobrazenie na plátne.

Vytvorte skript. Keďže sa bude používať inde, pomenujeme ho tu GamepadReadValue .

Skript vyzerá 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á leftTriggertrieda má vlastnosť a rightTrigger ReadValue počet lisov v rozsahu 0.0~1.0 môžete získať volaním metódy. Spúšťače môžu byť tiež považované za tlačidlá, takže isPressed môžete tiež posúdiť, ako napríklad. isPressed true Mimochodom, množstvo sa stáva ReadValue na základe 0, 5.

Po uložení skriptu EventSystem ho pripojte a nastavte textový objekt na zobrazenie.

Skúste spustiť hru a posunúť spúšť.

Určenie informácií o páčke

Páčka môže získať informácie o ľavej a pravej páčke a môžete získať množstvo, o koľko je palica tlačená dole v ktorom smere. Samozrejme, ak na ovládači nemáte páčku, tieto informácie nebudete môcť získať.

Informácie o palici je možné získať pomocou , Gamepad.rightStick respGamepad.leftStick.

V prípade skriptu potvrdenia operácie odkloníme skript použitý skôr na získanie spúšťača.

// 省略

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 Tlačové informácie môžete získať zavolaním na metódu Vector2 od ReadValue alebo . Vector2 Takže môžete zistiť, koľko tlačíte na os X a os Y podľa a vlastnosti,x y Ak chcete získať smer, ktorým tlačíte, môžete ho dostať do nehnuteľnosti a ak magnitude chcete získať sumu, ktorú tlačíte, normalized môžete ju získať vo vlastníctve.

Pokúste sa skutočne presunúť hru a ovládať hokejku.

Získanie informácií o gamepade

ID, meno atď. môžete získať z pripojeného gamepadu. Pozrite si napríklad na identifikáciu name typu ovládača, ktorý je pripojený, alebo Môžete si pozrieť, ku ktorému deviceId gamepadu sa priradiť, keď je pripojených viac gamepadov.

Tu v texte zobrazíme informácie na kontrolu operácie.

Názov skriptu je ľubovoľný, ale tu GamepadInfo je .

Skript vyzerá 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ískať rôzne informácie z načítaných . Tu je niekoľko výňatkov.

Po uložení skriptu EventSystem ho pripojte a nastavte textový objekt na zobrazenie.

Skúste spustiť hru a zistite, či sa zobrazia informácie.