Nadzorovanje z igralno ploščico (različica paketa vhodnega sistema)

Stran posodobljena :
Datum ustvarjanja strani :

Okolje za preverjanje

Windows
  • Windows 11
Urejevalnik enotnosti
  • 2020.3.25f1
Paket vhodnega sistema
  • 1.2.0

Predpogoji za to konico

Naslednje nastavitve so bile vnaprej narejene kot predpostavka za opis tega namiga.

O XInput in DirectInput

Čeprav je omejena na Windows, obstajata dve obliki povezave za krmilnike iger: DirectInput in XInput. Tukaj "Gamepad" ustreza "XInput".

Ta program Gamepad obravnava razrede, vendar lahko to obravnava le krmilnike, ki podpirajo "XInput". Če želite uporabiti krmilnik, ki podpira DirectInput, morate uporabiti drug Joystick razred.

»DirectInput« je stara oblika povezave in definicija gumba je razmeroma nedvomna in lahko ravna z krmilniki s posebnimi oblikami. V zadnjem času pa je »XInput« postal mainstream, število krmilnih števk, ki ne podpirajo »DirectInput« pa se povečuje. "DirectInput" ima definicije gumbov, kot so "1", "2" in "3", zato morajo ustvarjalci iger ustvariti korespondenco gumbov med igro in krmilcem, tako da jih je mogoče ustrezno nastaviti.

XInput je opredeljen kot naslednja generacija DirectInputa in vključuje vnaprej določene gumbe A in B, sprožilce, palice itd. Zato je mogoče uporabiti le fiksno obliko krmilnika, Ker je definicija gumbov dobro definirana, lahko ustvarjalci iger ustvarijo igre, ki ustrezajo krmilnik, ne da bi skrbeli za postavitev gumbov. Nedavni igralni krmilniki, ki podpirajo samo »XInput« se povečujejo.

Ugotovite, ali je pritisnjena tipka

Lahko določite, ali je gumb xxxxxxxx.isPressed pritisnjena ali ne z lastnostmi, kot tudi tipkovnico in miško. Tukaj bi rad prikazal vrsto gumba, ki ga pritiskam v besedilu.

Najprej postavite predmet besedila v prikazu.

Ustvarite skript za razsodbo. Ime datoteke je samovoljno, ampak tukaj GamepadButtons je .

Scenarij izgleda takole:

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

Ko skript EventSystem shranite, ga priložite in konfigurirajte predmet besedila v prikaznem omrežju.

Poskusite izvajati igro in preverite, ali se vsak gumb odziva.

Mimogrede, naslednji gumbi so opredeljeni kot isti gumb, čeprav je več gumbov pripravljenih, ker se berejo drugače, odvisno od igralne konzole. V vsakem od zgoraj navedenih programov je vključen sodni postopek, tako da ko pritisnete gumb, se prikažejo trije gumbi.

in
XboxPlayStationveč
bButton circleButton GumbEast
aButton navzkrižni gumb gumbSouth
xButton kvadratNati gumb gumbWest
yButton trikotnikButton gumbNorth

Kar je mogoče oceniti kot gumb, je naslednje.

  • Gumb, ×, gumb dol
  • Gumb B, gumb 4, desni gumb
  • Gumb X, □ gumb, levi gumb
  • Gumb Y, puščica navzdol, gumb Gor
  • Gumb Začni, Gumb Meni
  • Gumb »Izberite«, »Ogled«
  • Levi gumb na rami, gumb L1
  • Desni gumb za ramo, gumb R1
  • Levi gumb palice
  • Desni gumb za palico

Ugotovite, ali je gumb pritisnjena

Sodbo v xxxxxxxx.wasPressedThisFrame trenutku pritiska lahko določijo lastnosti kot pri tipkovnici in miški. Vrne vrednost trenutka true , ko je pritisnjena, false in se vrne tudi, če je pritisnjena in zadržana.

Prikažimo gumb, pritisnjena kot besedilo kot preverjanje operacije. Postavite besedilni predmet za prikaz.

Ime datoteke skripta je lahko karkoli, ampak tukaj GamepadButtonsOneFrame je .

Scenarij izgleda takole: Za poenostavnost se presodi le 4 gumbi.

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 shranjevanju EventSystem skripta ga priložite in nastavite besedilni predmet za prikaz.

Poskusite zagon igre in pritisnite gumb. Mislim, da bo gumb, ki si ga pritisnil, dodan. Vidite lahko tudi, da držanje gumba ne doda nobenega besedila.

Ugotovite, ali je trenutek sprostitve gumba

Vzorca ni, vendar lahko določite, wasPressedThisFrame wasReleasedThisFrame ali je to trenutek, ko ga sprostite z lastnostjo namesto z lastnostjo.

Določite, kdaj pritisnete puščične tipke

Določa stiskalnico DPAD. Odvisno od igralne konzole bo letela s puščičnimi tipkami in D-padom, vendar se oba obravnavata kot enaka. DPAD v bistvu določa le, ali potiskate v to smer ali ne. Ni sodbe, kot je "potiskanje malo" kot palica.

Postavi besedilni predmet za prikaz odločitve, ali je pritisnjena ali ne kot preverjanje operacije.

Ustvarite skript. Ime datoteke je samovoljno, ampak tukaj GamepadDpad je .

Scenarij izgleda takole:

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

Informacije o DPAD-u lahko najdete Gamepad.dpad na .

DPAD ima lastnosti leftupdown rightza vsako smer, in lahko določite, ali je pritisnjena ali ne z lastnostjo itd. isPressed

DpadControl.ReadValue Z metodo Vector2 lahko spravite tudi stanje tiska v . Če ni nič pritisnjenega (0, 0), če je levo pritisnjena (-1, 0) in tako naprej.

Po shranjevanju EventSystem skripta ga priložite in nastavite besedilni predmet za prikaz.

Poskusite zagon igre in interakcijo z DPAD.

Vector2 Mimogrede, je v normaliziranem stanju, tako da ko pritisnete diagonalno, se pridobi kot število, kot je (0,7071, 0,7071) namesto (1, 1).

Določanje pritiskov na sprožilec

Krmilniki Xbox imajo gumbe, imenovane sprožilci na levi in desni strani. Na PlayStationu ustreza L2R2. Ta gumb se razlikuje od običajnega gumba in lahko dobiš količino, ki jo pritiskaš v 0.0~1.0. Nekateri drugi krmilniki so opremljeni z imeni, ki niso sprožilci, pri starejših krmilnikih itd., pa se lahko preprosto postavijo kot gumbi, v tem primeru se sodba stiska le kot 0, 1.

Tukaj bi rad preveril količino sprožilnih pritiskov. Postavi besedilni predmet za prikaz na platno.

Ustvarite skript. Ker ga bomo uporabili drugje, ga bomo tukaj naimen imeli GamepadReadValue .

Scenarij izgleda takole:

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 Vsak razred leftTriggerima lastnost rightTrigger ReadValue in lahko dobiš količino stiskal v obsegu 0.0~1.0 tako, da pokličeš metodo. Sprožilci se lahko obravnavajo tudi kot gumbi, tako isPressed da lahko tudi presodite, kot so. isPressed true Mimogrede, znesek ReadValue postane temelji na 0,5.

Po shranjevanju skripta ga EventSystem priložite in nastavite besedilni predmet za prikaz.

Poskusite igrati igro in premakniti sprožilec.

Določanje informacij o palici

Palica lahko dobi informacije leve palice in desno palico oziroma desno palico, in lahko dobiš količino, koliko palice je potisnjena navzdol v katero smer. Seveda, če nimate palice na krmilnik, ne boste mogli dobiti teh informacij.

Informacije o palici se lahko pridobijo z , Gamepad.rightStick oziromaGamepad.leftStick.

Za skript za potrditev operacije bomo preusmerjali skript, uporabljen prej, da bi dobili sprožilec.

// 省略

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 Informacije o tisku lahko poiščite tako, da pokličete Vector2 metodo iz ali ReadValue . Vector2 Tako boste lahko dobili, x y koliko pritiskate na osi X in Y osi po in lastnosti, Če želite dobiti smer, ki jo pritiskate, jo lahko v nepremičnini, magnitude in če želite dobiti znesek, ki ga stiskate, normalized ga lahko dobiš v nepremičnini.

Poskusite dejansko premakniti igro in upravljati palico.

Prenesite informacije o igralnih ploščicah

ID, ime itd. lahko dobiš iz povezanega igralnega seznama. Glejte na primer, name da določite vrsto krmilnika, ki je povezan, ali Lahko se sklicuje na to, s deviceId katero igralno ploščico lahko povežete, ko je povezanih več igralnih ploščic.

Tukaj bomo prikazali informacije v besedilu za preverjanje operacije.

Ime skripta je samovoljno, ampak tukaj GamepadInfo je .

Scenarij izgleda takole:

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 Iz pridobljenih podatkov lahko pridobite različne informacije . Tukaj je nekaj odlomek.

Po shranjevanju skripta ga EventSystem priložite in nastavite besedilni predmet za prikaz.

Poskusite zagon igre, da preverite, ali so prikazane informacije.