Juhtimine gamepadiga (sisendsüsteemi paketi versioon)

Lehekülg uuendatud :
Lehe loomise kuupäev :

Kontrollimise keskkond

Windows
  • Windows 11
Ühtsuse toimetaja
  • 2020.3.25f1
Sisendsüsteemi pakett
  • 1.2.0

Selle näpunäite eeltingimused

Selle vihje kirjeldamise eelduseks on eelnevalt tehtud järgmised sätted.

Teave XInputi ja DirectInputi kohta

Kuigi see on piiratud Windowsiga, on mängukontrollerite jaoks kaks ühendusvormingut: DirectInput ja XInput. Siin vastab "Gamepad" "XInput".

See Gamepad programm tegeleb klassidega, kuid see võib käsitleda ainult kontrollereid, mis toetavad "XInput". DirectInputi toetava kontrolleri kasutamiseks peate kasutama teist Joystick klassi.

"DirectInput" on vana ühendusvorming ja nupu määratlus on suhteliselt ebaselge ning see saab hakkama spetsiaalse kujuga kontrolleritega. Kuid hiljuti on "XInput" muutunud peavooluks ja kontrollerite arv, mis ei toeta "DirectInput", kasvab. "DirectInput" sisaldab nuppude määratlusi, nagu "1", "2" ja "3", nii et mängu loojad peavad looma nupu vastavuse mängu ja kontrolleri vahel, et neid saaks sobivalt seadistada.

XInput on määratletud kui DirectInputi järgmine põlvkond ja see sisaldab eelmääratletud A- ja B-nuppe, päästikuid, pulki jne. Seetõttu saab kasutada ainult kontrolleri fikseeritud kuju, Kuna nuppude määratlus on hästi määratletud, saavad mänguloojad luua kontrollerile sobivaid mänge, muretsemata nuppude paigutuse pärast. Hiljutised mängukontrollerid, mis toetavad ainult "XInputi", suurenevad.

Nupule vajutamise kindlakstegemine

Saate määrata, kas nuppu vajutatakse või mitte, omaduste, samuti xxxxxxxx.isPressed klaviatuuri ja hiire abil. Siin tahaksin kuvada, millist tüüpi nuppu ma tekstis vajutan.

Esmalt asetage kuvatav tekstiobjekt.

Looge kohtuotsuse jaoks skript. Faili nimi on meelevaldne, kuid siin GamepadButtons see on .

Skript näeb välja selline:

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

Pärast EventSystem skripti salvestamist manustage see kuvatava tekstiobjektiga ja konfigureerige see.

Proovige mängu käivitada ja vaadake, kas iga nupp reageerib.

Muide, järgmised nupud on määratletud kui sama nupp, kuigi mitu nuppu on valmis, sest neid loetakse sõltuvalt mängukonsoolist erinevalt. Kõigis ülaltoodud programmides on kaasatud kohtuotsusprotsess, nii et nupu vajutamisel kuvatakse kolm nuppu.

XboxPlayStation ja palju muud
bButton circleButton nuppEast
aButton crossButton nuppSouth
xButton ruutButton nuppLääne
yButton kolmnurkNööp nuppNorth

Mida saab nupuna hinnata, on järgmine.

  • Nupp, × nupp, alla nupp
  • B-nupp, ○ nupp, parem nupp
  • X-nupp, □ nupp, vasak nupp
  • Nupp Y, allanoolenupp, nupp Üles
  • Nupp Start, nupp Menüü
  • Vali nupp, Vaade nupp
  • Vasaku õla nupp, nupp L1
  • Parema õla nupp, R1 nupp
  • Vasaku pulga nupp
  • Parempoolne nupp

Tehke kindlaks, kas nuppu vajutatakse

Kohtuotsust vajutamise hetkel saab määrata omaduste järgi nagu klaviatuuri ja hiire puhul xxxxxxxx.wasPressedThisFrame . Tagastab selle vajutamise hetke true väärtuse ja tagastab isegi siis, kui false seda vajutatakse ja hoitakse seejärel all.

Kuvame vajutatud nuppu tekstina operatsioonikontrollina. Asetage tekstiobjekt kuvamiseks.

Skripti failinimi võib olla midagi, kuid siin GamepadButtonsOneFrame see on .

Skript näeb välja selline: Lihtsuse huvides hinnatakse ainult 4 nuppu.

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

Pärast EventSystem skripti salvestamist lisage see ja määrake kuvamiseks tekstiobjekt.

Proovige mängu käivitada ja nuppu vajutada. Ma arvan, et teie vajutatud nupp lisatakse. Samuti näete, et nupu all hoidmine ei lisa teksti.

Tehke kindlaks, kas nupu vabastamise hetk

Näidist pole, kuid saate kindlaks teha, kas see on wasPressedThisFrame hetk, mil selle vabastate, kasutades atribuudi asemel wasReleasedThisFrame atribuuti.

Nooleklahvide vajutamise aja määramine

Määrab DPAD-i vajutamise. Sõltuvalt mängukonsoolist lendab see nooleklahvide ja D-padiga, kuid mõlemat käsitletakse samana. DPAD määrab põhimõtteliselt ainult selle, kas te liigute selles suunas või mitte. Ei ole sellist hinnangut nagu "natuke surudes" nagu kepp.

Paigutab tekstiobjekti, et kuvada otsus, kas seda vajutatakse operatsioonikontrollina või mitte.

Skripti loomine. Faili nimi on meelevaldne, kuid siin GamepadDpad see on .

Skript näeb välja selline:

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

DPAD-i teavet Gamepad.dpad saate aadressilt .

DPAD-il on leftupdown rightomadused iga suuna jaoks ja saate kindlaks teha, kas atribuut vajutab seda või mitte jne. isPressed

DpadControl.ReadValue Meetodit saate kasutada ka ajakirjanduse oleku Vector2 saamiseks . Kui midagi ei vajutata (0, 0), kui vasakule vajutatakse (-1, 0) ja nii edasi.

Pärast EventSystem skripti salvestamist lisage see ja määrake kuvamiseks tekstiobjekt.

Proovige mängu käivitada ja DPAD-iga suhelda.

Vector2 Muide, on normaliseeritud olekus, nii et kui vajutate diagonaalselt, saadakse see numbrina, näiteks (0, 7071, 0, 7071) asemel (1, 1).

Määrake päästikuvajutused

Xboxi kontrolleritel on vasakul ja paremal nupud, mida nimetatakse päästikuteks. PlayStationil vastab see L2R2-le. See nupp erineb tavalisest nupust ja vajutatava summa saate 0,0 ~ 1,0. Mõned teised kontrollerid on varustatud muude nimedega kui päästikud, kuid vanemates kontrollerites jne võib neid lihtsalt nuppudena paigutada, sel juhul käsitletakse vajutamise otsust ainult kui 0, 1.

Siinkohal tahaksin kontrollida päästikuvajutuste hulka. Paigutab lõuendile kuvatava tekstiobjekti.

Skripti loomine. Kuna seda kasutatakse mujal, nimetame selle siin GamepadReadValue .

Skript näeb välja selline:

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 Igal leftTriggerklassil on omadus ja rightTrigger ReadValue meetodile helistades saate vajutuste arvu vahemikus 0.0 ~ 1.0. Päästikuid saab käsitleda ka nuppudena, nii et isPressed saate hinnata ka näiteks. isPressed true Muide, muutub ReadValue summa 0, 5-le.

Pärast skripti EventSystem salvestamist lisage see ja määrake kuvamiseks tekstiobjekt.

Proovige mängu käivitada ja päästikut liigutada.

Pulgateabe määramine

Kepp saab teavet vastavalt vasaku ja parema pulga kohta ning saate selle, kui palju keppi millises suunas alla surutakse. Muidugi, kui teil pole kontrolleril pulka, ei saa te seda teavet saada.

Pulgainfot saab kätte vastavalt , Gamepad.rightStickGamepad.leftStick

Operatsiooni kinnitamise skripti jaoks suuname päästiku saamiseks varem kasutatud skripti.

// 省略

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 Pressiteavet saate, helistades Vector2 meetodile või ReadValue . Vector2 Nii saate teada, kui x y palju vajutate X-teljele ja Y-teljele ja omadustele, Kui soovite saada suunda, mida vajutate, saate selle kinnisvarasse ja kui soovite magnitude saada vajutatavat summat, saate normalized selle kinnisvarasse.

Proovige mängu tegelikult liigutada ja keppi kasutada.

Hankige gamepadi teave

ID, nime jne saate ühendatud mängupuldist. Näiteks vaadake ühendatud kontrolleri tüübi tuvastamiseks name või Saate vaadata, millise deviceId mängupuldiga seostada, kui mitu mängupulti on ühendatud.

Siin kuvame tekstis sisalduva teabe toimingu kontrollimiseks.

Skripti nimi on meelevaldne, kuid siin GamepadInfo see on .

Skript näeb välja selline:

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 Mitmesugust teavet saate otsitud . Siin on mõned väljavõtted.

Pärast skripti EventSystem salvestamist lisage see ja määrake kuvamiseks tekstiobjekt.

Proovige mängu käivitada, et näha, kas teave kuvatakse.