Controlarea cu un gamepad (versiunea pachetului sistemului de intrare)

Pagina actualizată :
Data creării paginii :

Mediul de verificare

Windows
  • Ferestre 11
Unity Editor
  • 2020.3.25F1
Pachet sistem de intrare
  • 1.2.0

Cerințe preliminare pentru acest sfat

Următoarele setări au fost făcute în avans ca premisă pentru descrierea acestui sfat.

Despre XInput și DirectInput

Deși este limitat la Windows, există două formate de conexiune pentru controlerele de jocuri: DirectInput și XInput. Aici, "Gamepad" corespunde cu "XInput".

Acest Gamepad program se ocupă de clase, dar acest lucru se poate ocupa numai de controlerele care acceptă "XInput". Pentru a utiliza un controler care acceptă DirectInput, trebuie să utilizați o altă Joystick clasă.

"DirectInput" este un format vechi de conectare, iar definiția butonului este relativ ambiguă și poate gestiona controlere cu forme speciale. Cu toate acestea, recent, "XInput" a devenit mainstream, iar numărul de controlere care nu acceptă "DirectInput" este în creștere. "DirectInput" are definiții de butoane precum "1", "2" și "3", astfel încât creatorii de jocuri trebuie să creeze o corespondență de buton între joc și controler, astfel încât acestea să poată fi setate corespunzător.

XInput este definit ca următoarea generație de DirectInput și include butoane A și B predefinite, declanșatoare, stick-uri etc. Prin urmare, poate fi utilizată numai o formă fixă a controlerului, Deoarece definiția butoanelor este bine definită, creatorii de jocuri pot crea jocuri care se potrivesc controlerului fără să se îngrijoreze de plasarea butoanelor. Controlerele de joc recente care acceptă doar "XInput" sunt în creștere.

Determinați dacă este apăsat un buton

Puteți determina dacă un buton este apăsat sau nu de proprietăți, precum xxxxxxxx.isPressed și de tastatură și mouse. Aici, aș dori să afișez tipul de buton pe care îl apăs în text.

Mai întâi, plasați un obiect text de afișare.

Creați un script pentru verdict. Numele fișierului este arbitrar, dar aici GamepadButtons este .

Scenariul arată astfel:

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

După ce EventSystem salvați scriptul, atașați-l și configurați obiectul text afișat.

Încercați să rulați jocul și vedeți dacă fiecare buton răspunde.

Apropo, următoarele butoane sunt definite ca același buton, deși sunt pregătite mai multe butoane, deoarece sunt citite diferit în funcție de consola de jocuri. În fiecare dintre programele de mai sus, este inclus un proces de judecată, astfel încât atunci când apăsați butonul, sunt afișate trei butoane.

XboxPlayStation și multe altele
bButon circleButton butonEst
aButon cruceButon butonSud
xButon squareButton butonWest
yButon triangleButton butonNord

Ceea ce poate fi judecat ca un buton este după cum urmează.

  • Un buton, buton ×, buton jos
  • Buton B, buton ○, buton dreapta
  • Butonul X, butonul □, butonul din stânga
  • Butonul Y, butonul Săgeată jos, butonul Sus
  • Butonul Start, butonul Meniu
  • Selectați butonul, butonul Vizualizare
  • Buton umăr stâng, buton L1
  • Buton umăr drept, buton R1
  • Butonul stick-ului din stânga
  • Butonul din dreapta

Determinați dacă butonul este apăsat

Judecata în momentul apăsării poate fi determinată de proprietățile ca și în cazul xxxxxxxx.wasPressedThisFrame tastaturii și mouse-ului. Returnează valoarea momentului true în care este apăsat și returnează chiar dacă false este apăsat și ținut apăsat ulterior.

Să afișăm butonul apăsat ca text ca verificare a operației. Plasați un obiect text pentru afișare.

Numele de fișier al scriptului poate fi orice, dar aici GamepadButtonsOneFrame este .

Scenariul arată astfel: Pentru simplitate, sunt evaluate doar 4 butoane.

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

După EventSystem salvarea scriptului, atașați-l și setați un obiect text pentru afișare.

Încercați să rulați jocul și să apăsați butonul. Cred că butonul pe care l-ați apăsat va fi adăugat. De asemenea, puteți vedea că menținerea apăsată a butonului nu adaugă niciun text.

Determinați dacă în momentul eliberării butonului

Nu există niciun eșantion, dar puteți determina dacă este wasPressedThisFrame momentul în care îl eliberați utilizând o proprietate în locul wasReleasedThisFrame unei proprietăți.

Determinați când apăsați tastele săgeată

Determină apăsarea DPAD. În funcție de consola de jocuri, va zbura cu tastele săgeată și D-pad, dar ambele sunt tratate la fel. DPAD determină practic doar dacă împingeți în acea direcție sau nu. Nu există nici o judecată ca "împingând puțin" ca un băț.

Plasează un obiect text pentru a afișa o decizie dacă este apăsat sau nu ca verificare a operației.

Creați un script. Numele fișierului este arbitrar, dar aici GamepadDpad este .

Scenariul arată astfel:

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

Puteți obține informații Gamepad.dpad DPAD la .

DPAD are leftupdown rightproprietăți pentru fiecare direcție și puteți determina dacă este apăsat sau nu de proprietate etc. isPressed

DpadControl.ReadValue De asemenea, puteți utiliza metoda pentru a obține starea Vector2 presei în . Dacă nu este apăsat nimic (0, 0), dacă stânga este apăsată (-1, 0) și așa mai departe.

După EventSystem salvarea scriptului, atașați-l și setați un obiect text pentru afișare.

Încercați să rulați jocul și să interacționați cu DPAD.

Vector2 Apropo, este într-o stare normalizată, deci atunci când apăsați în diagonală, se obține ca număr, cum ar fi (0, 7071, 0, 7071) în loc de (1, 1).

Determinați presele de declanșare

Controlerele Xbox au butoane numite declanșatoare în stânga și în dreapta. Pe PlayStation, corespunde cu L2R2. Acest buton este diferit de un buton normal și puteți obține cantitatea pe care o apăsați în 0.0 ~ 1.0. Unele alte controlere sunt echipate cu alte nume decât declanșatoarele, dar în controlerele mai vechi etc., acestea pot fi pur și simplu plasate ca butoane, caz în care judecata de apăsare este tratată doar ca 0, 1.

Aici, aș dori să verific cantitatea de apăsări de declanșare. Plasează un obiect text pentru afișare pe Planșă.

Creați un script. Deoarece va fi folosit în altă parte, îl vom numi aici GamepadReadValue .

Scenariul arată astfel:

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 Fiecare leftTriggerclasă are o proprietate și rightTrigger ReadValue puteți obține cantitatea de prese în intervalul 0.0 ~ 1.0 apelând metoda. Declanșatoarele pot fi, de asemenea, tratate ca butoane, astfel încât isPressed să puteți judeca, de asemenea, cum ar fi. isPressed true Apropo, cantitatea de devine ReadValue se bazează pe 0, 5.

După salvarea scriptului, EventSystem atașați-l și setați un obiect text pentru afișare.

Încercați să rulați jocul și să mutați declanșatorul.

Determinați informațiile despre stick

Bățul poate obține informațiile bățului stâng și, respectiv, ale bățului drept și puteți obține cantitatea de cât de mult este împins bățul în ce direcție. Desigur, dacă nu aveți un stick pe controler, nu veți putea obține aceste informații.

Informațiile despre stick pot fi preluate cu , Gamepad.rightStick respectivGamepad.leftStick.

Pentru scriptul de confirmare a operației, vom devia scriptul folosit anterior pentru a obține declanșatorul.

// 省略

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 Puteți obține informații de presă apelând Vector2 metoda de la ReadValue sau . Vector2 Deci, puteți obține cât x y de mult apăsați pe axa X și axa Y și proprietăți, Dacă doriți să obțineți direcția pe care o presați, o puteți obține în proprietate, iar dacă magnitude doriți să obțineți suma pe care o presați, o normalized puteți obține în proprietate.

Încercați să mutați efectiv jocul și să acționați stick-ul.

Obțineți informații despre gamepad

Puteți obține ID-ul, numele etc. din gamepad-ul conectat. De exemplu, consultați pentru a identifica name tipul de controler conectat sau Puteți consulta gamepadul cu care deviceId să vă asociați atunci când sunt conectate mai multe gamepad-uri.

Aici, vom afișa informațiile din text pentru a verifica operația.

Numele scriptului este arbitrar, dar aici GamepadInfo este .

Scenariul arată astfel:

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 Puteți obține diverse informații din recuperat . Iată câteva fragmente.

După salvarea scriptului, EventSystem atașați-l și setați un obiect text pentru afișare.

Încercați să rulați jocul pentru a vedea dacă apar informațiile.