Ohjaus peliohjaimella (syöttöjärjestelmäpaketin versio)

Sivu päivitetty :
Sivun luontipäivämäärä :

Varmennusympäristö

Windows
  • Windows 11
Unity-editori
  • 2020.3.25F1
Syöttöjärjestelmän paketti
  • 1.2.0

Tämän vinkin edellytykset

Seuraavat asetukset on tehty etukäteen tämän vinkin kuvauksen lähtökohtana.

Tietoja XInputista ja DirectInputista

Vaikka se on rajoitettu Windowsiin, peliohjaimille on kaksi yhteysmuotoa: DirectInput ja XInput. Tässä "Gamepad" vastaa "XInput".

Tämä Gamepad ohjelma käsittelee luokkia, mutta tämä voi käsitellä vain ohjaimia, jotka tukevat "XInput". Jos haluat käyttää ohjainta, joka tukee DirectInputia, sinun on käytettävä eri Joystick luokkaa.

"DirectInput" on vanha yhteysmuoto ja painikkeen määritelmä on suhteellisen epäselvä, ja se pystyy käsittelemään ohjaimia, joilla on erityisiä muotoja. Viime aikoina "XInput" on kuitenkin tullut valtavirtaan, ja niiden ohjainten määrä, jotka eivät tue "DirectInputia", kasvaa. "DirectInput" sisältää painikemäärittelyt, kuten "1", "2" ja "3", joten pelintekijöiden on luotava painikkeiden vastaavuus pelin ja ohjaimen välille, jotta ne voidaan asettaa oikein.

XInput määritellään seuraavan sukupolven DirectInputiksi, ja se sisältää ennalta määritetyt A- ja B-painikkeet, liipaisimet, sauvat jne. Siksi voidaan käyttää vain ohjaimen kiinteää muotoa, Koska painikkeiden määritelmä on hyvin määritelty, pelin luojat voivat luoda ohjaimelle sopivia pelejä huolimatta painikkeiden sijoittelusta. Viimeaikaiset peliohjaimet, jotka tukevat vain "XInputia", lisääntyvät.

Selvitä, painetaanko painiketta

Voit määrittää, painetaanko painiketta vai ei, ominaisuuksien sekä xxxxxxxx.isPressed näppäimistön ja hiiren perusteella. Tässä haluaisin näyttää tekstissä painikkeen tyypin, jota painan.

Aseta ensin näyttötekstiobjekti.

Luo käsikirjoitus tuomiolle. Tiedostonimi on mielivaltainen, mutta tässä GamepadButtons se on .

Skripti näyttää tältä:

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

Kun EventSystem olet tallentanut komentosarjan, liitä se näyttötekstiobjektiin ja määritä se.

Yritä suorittaa peli ja katso, reagoiko jokainen painike.

Muuten, seuraavat painikkeet määritellään samaksi painikkeeksi, vaikka useita painikkeita valmistellaan, koska ne luetaan eri tavalla pelikonsolista riippuen. Jokaisessa edellä mainitussa ohjelmassa on arviointiprosessi, joten kun painat painiketta, näyttöön tulee kolme painiketta.

Xbox,PlayStation ja paljon muuta
b-painike circleButton -painike Itä
aPainike risti-painike -painikeEtelä
x-painike neliö-painike -painikeLänteen
y-painike kolmioPainike -painikePohjoinen

Se, mitä voidaan arvioida painikkeena, on seuraava.

  • Painike, ×painike, alas-painike
  • B-näppäin, ○-painike, oikea painike
  • X-painike, □-painike, vasen painike
  • Y-painike, Alanuoli-painike, Ylös-painike
  • Käynnistä-painike, Valikko-painike
  • Valitse painike, näytä-painike
  • Vasen olkapainike, L1-painike
  • Oikea olkapainike, R1-näppäin
  • Vasen sauva -painike
  • Oikea sauvapainike

Määritä, painetaanko painiketta

Lehdistön hetken tuomio voidaan määrittää ominaisuuksilla, kuten xxxxxxxx.wasPressedThisFrame näppäimistöllä ja hiirellä. Palauttaa painallushetken true arvon ja palauttaa arvon, vaikka false painaisi sitä painettuna sen jälkeen.

Näytetään painettu painike tekstinä toimintotarkistuksena. Aseta tekstiobjekti näytettäväksi.

Skriptin tiedostonimi voi olla mikä tahansa, mutta tässä GamepadButtonsOneFrame se on .

Skripti näyttää tältä: Yksinkertaisuuden vuoksi vain 4 painiketta arvioidaan.

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

Kun olet EventSystem tallentanut komentosarjan, liitä se ja aseta tekstiobjekti näytettäväksi.

Yritä suorittaa peli ja painaa painiketta. Luulen, että painamasi painike lisätään. Voit myös nähdä, että painikkeen pitäminen painettuna ei lisää tekstiä.

Määritä, vapautetaanko painike sillä hetkellä, kun painike vapautetaan

Mallia ei ole, mutta voit määrittää, vapauttaako se wasPressedThisFrame hetken, käyttämällä ominaisuutta ominaisuuden sijaan wasReleasedThisFrame .

Määritä, milloin painat nuolinäppäimiä

Määrittää DPAD: n painalluksen. Pelikonsolista riippuen se lentää nuolinäppäimillä ja suuntaohjaimella, mutta molempia käsitellään samoina. DPAD määrittää periaatteessa vain sen, työnnätkö siihen suuntaan vai et. Ei ole tuomitsemista, kuten "työntää vähän" kuin keppi.

Sijoittaa tekstiobjektin näyttämään päätöksen, painetaanko sitä vai ei, toiminnon tarkistuksena.

Luo komentosarja. Tiedostonimi on mielivaltainen, mutta tässä GamepadDpad se on .

Skripti näyttää tältä:

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

Saat DPAD-tietoja Gamepad.dpad osoitteesta .

DPAD: lla on leftupdown rightominaisuuksia jokaiselle suunnalle, ja voit määrittää, painaako ominaisuus sitä vai ei jne. isPressed

DpadControl.ReadValue Voit myös käyttää menetelmää saadaksesi lehdistön tilan Vector2 . Jos mitään ei paineta (0, 0), jos vasemmalle painetaan (-1, 0) ja niin edelleen.

Kun olet EventSystem tallentanut komentosarjan, liitä se ja aseta tekstiobjekti näytettäväksi.

Kokeile suorittaa peli ja olla vuorovaikutuksessa DPAD:n kanssa.

Vector2 Muuten, on normalisoidussa tilassa, joten kun painat vinosti, se saadaan numerona, kuten (0, 7071, 0, 7071) (1, 1) sijasta.

Määritä liipaisimen painallukset

Xbox-ohjaimissa on painikkeita, joita kutsutaan liipaisimiksi vasemmalla ja oikealla. PlayStationilla se vastaa L2R2: ta. Tämä painike eroaa tavallisesta painikkeesta, ja saat painamasi määrän 0.0 ~ 1.0. Jotkut muut ohjaimet on varustettu muilla nimillä kuin liipaisimilla, mutta vanhemmissa ohjaimissa jne. ne voidaan yksinkertaisesti sijoittaa painikkeiksi, jolloin painamisen tuomio käsitellään vain 0, 1.

Tässä haluaisin tarkistaa liipaisimen painallusten määrän. Sijoittaa piirtoalueelle näytettävän tekstiobjektin.

Luo komentosarja. Koska sitä käytetään muualla, nimeämme sen täällä GamepadReadValue .

Skripti näyttää tältä:

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 Jokaisella leftTriggerluokalla on ominaisuus ja rightTrigger ReadValue voit saada puristimien määrän alueella 0,0 ~ 1,0 kutsumalla menetelmää. Liipaisimia voidaan käsitellä myös painikkeina, joten isPressed voit myös arvioida esimerkiksi. isPressed true Muuten, tulee määrä ReadValue perustuu 0, 5: een.

Kun olet tallentanut komentosarjan, EventSystem liitä se ja aseta tekstiobjekti näytettäväksi.

Yritä suorittaa peli ja liikuttaa liipaisinta.

Määritä sauvan tiedot

Keppi voi saada vasemman sauvan ja oikean sauvan tiedot, ja voit saada kuinka paljon keppiä työnnetään alas mihin suuntaan. Tietenkin, jos ohjaimessasi ei ole tikkua, et voi saada näitä tietoja.

Stick-tiedot voidaan hakea , Gamepad.rightStick vastaavastiGamepad.leftStick.

Toiminnon vahvistuskomentosarjaa varten ohjaamme aiemmin käytetyn komentosarjan liipaisimen saamiseksi.

// 省略

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 Saat lehdistötiedot kutsumalla Vector2 menetelmää tai ReadValue . Vector2 Joten saat kuinka x y paljon painat X- ja Y-akselia ja ominaisuuksia, Jos haluat saada painamasi suunnan, voit saada sen kiinteistöön, ja jos magnitude haluat saada painamasi määrän, voit normalized saada sen kiinteistöön.

Yritä todella liikuttaa peliä ja käyttää keppiä.

Hanki peliohjaimen tiedot

Voit saada tunnuksen, nimen jne. Katso esimerkiksi, että voit tunnistaa name kytketyn ohjaimen tyypin tai Voit katsoa, mihin peliohjaimeen liittyy, deviceId kun useita peliohjaimia on kytketty.

Tässä näytämme tekstin tiedot toiminnan tarkistamiseksi.

Käsikirjoituksen nimi on mielivaltainen, mutta tässä GamepadInfo se on .

Skripti näyttää tältä:

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 Voit saada erilaisia tietoja haetusta . Tässä muutamia otteita.

Kun olet tallentanut komentosarjan, EventSystem liitä se ja aseta tekstiobjekti näytettäväksi.

Yritä suorittaa peli nähdäksesi, näkyvätkö tiedot.