Vadība ar gamepad (ievades sistēmas pakotnes versija)

Lapa atjaunota :
Lapas izveides datums :

Verifikācijas vide

Windows
  • Operētājsistēmā Windows 11
Vienotības redaktors
  • 2020.3.25f1
Ievades sistēmas pakete
  • 1.2.0

Priekšnoteikumi šim padomam

Tālāk norādītie iestatījumi ir veikti iepriekš kā priekšnoteikums šī padoma aprakstam.

Par XInput un DirectInput

Lai gan tas ir ierobežots ar Windows, spēļu kontrolieriem ir divi savienojuma formāti: DirectInput un XInput. Šeit "Gamepad" atbilst "XInput".

Šī Gamepad programma attiecas uz klasēm, taču tā var apstrādāt tikai kontrolierus, kas atbalsta "XInput". Lai izmantotu kontrolleri, kas atbalsta DirectInput, jums jāizmanto cita Joystick klase.

"DirectInput" ir vecs savienojuma formāts, un pogas definīcija ir salīdzinoši neskaidra, un tā var apstrādāt kontrolierus ar īpašām formām. Tomēr nesen "XInput" ir kļuvis par galveno, un palielinās to kontrolieru skaits, kuri neatbalsta "DirectInput". "DirectInput" ir pogu definīcijas, piemēram, "1", "2" un "3", tāpēc spēļu veidotājiem ir jāizveido pogu atbilstība starp spēli un kontrolieri, lai tos varētu atbilstoši iestatīt.

XInput ir definēts kā nākamās paaudzes DirectInput, un tas ietver iepriekš definētas A un B pogas, trigerus, nūjas utt. Tāpēc var izmantot tikai fiksētu kontroliera formu, Tā kā pogu definīcija ir labi definēta, spēļu veidotāji var izveidot spēles, kas ir piemērotas kontrolierim, neuztraucoties par pogu izvietojumu. Pieaug jaunāko spēļu kontrolieru skaits, kas atbalsta tikai "XInput".

Nosakiet, vai tiek nospiesta poga

To, vai poga ir nospiesta vai nē, var noteikt pēc rekvizītiem, kā xxxxxxxx.isPressed arī tastatūras un peles. Šeit es gribētu parādīt pogas veidu, kuru es nospiežu tekstā.

Vispirms novietojiet displeja teksta objektu.

Izveidojiet sprieduma skriptu. Faila nosaukums ir patvaļīgs, bet šeit GamepadButtons tas ir .

Skripts izskatās šādi:

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

Kad EventSystem skripts ir saglabāts, pievienojiet to parādāmā teksta objektam un konfigurējiet to.

Mēģiniet palaist spēli un redzēt, vai katra poga reaģē.

Starp citu, šādas pogas tiek definētas kā viena un tā pati poga, lai gan tiek sagatavotas vairākas pogas, jo tās tiek lasītas atšķirīgi atkarībā no spēļu konsoles. Katrā no iepriekš minētajām programmām ir iekļauts sprieduma process, tāpēc, nospiežot pogu, tiek parādītas trīs pogas.

XboxPlayStation un daudz kas cits
bButton circleButton pogaEast
aButton crossButton pogaSouth
xButton squareButton buttonWest
yButton triangleButton pogaNorth

Tas, ko var vērtēt kā pogu, ir šāds.

  • Poga, × poga, lejupvērstā poga
  • B poga, ○ poga, labā poga
  • X poga, □ poga, kreisā poga
  • Y poga, lejupvērstā bultiņa, augšupvērstā poga
  • Poga Sākt, poga Izvēlne
  • Poga Atlasīt, skatīt
  • Kreisā pleca poga, L1 poga
  • Labā pleca poga, R1 poga
  • Kreisās nūjas poga
  • Labā nūjas poga

Nosakiet, vai poga ir nospiesta

Spriedumu nospiešanas brīdī var noteikt pēc īpašībām, tāpat kā ar xxxxxxxx.wasPressedThisFrame tastatūru un peli. Atgriež tā brīža true vērtību, kad tas tiek nospiests, un atgriež pat tad, ja false tas tiek nospiests un turēts pēc tam.

Parādīsim nospiesto pogu kā tekstu kā darbības pārbaudi. Novietojiet teksta objektu parādīšanai.

Skripta faila nosaukums var būt jebkas, bet šeit GamepadButtonsOneFrame tas ir .

Skripts izskatās šādi: Vienkāršības labad tiek vērtētas tikai 4 pogas.

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ēc EventSystem skripta saglabāšanas pievienojiet to un iestatiet teksta objektu parādīšanai.

Mēģiniet palaist spēli un nospiest pogu. Es domāju, ka jūsu nospiestā poga tiks pievienota. Varat arī redzēt, ka, turot nospiestu pogu, netiek pievienots teksts.

Nosakiet, vai pogas atlaišanas brīdis

Nav parauga, bet jūs varat noteikt, vai tas ir wasPressedThisFrame brīdis, kad to atbrīvojat, īpašuma vietā wasReleasedThisFrame izmantojot īpašumu.

Nosakiet, kad nospiežat bulttaustiņus

Nosaka DPAD nospiešanu. Atkarībā no spēļu konsoles tas lidos ar bulttaustiņiem un D-pad, bet abi tiek uzskatīti par vienādiem. DPAD būtībā nosaka tikai to, vai jūs virzāties šajā virzienā vai nē. Nav tāda sprieduma kā "mazliet stumt" kā nūju.

Novieto teksta objektu, lai parādītu lēmumu par to, vai tas ir nospiests vai nav, kā darbības pārbaudi.

Izveidojiet skriptu. Faila nosaukums ir patvaļīgs, bet šeit GamepadDpad tas ir .

Skripts izskatās šādi:

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 informāciju Gamepad.dpad varat iegūt vietnē .

DPAD ir leftupdown rightīpašības katram virzienam, un jūs varat noteikt, vai īpašums to nospiež vai nē utt. isPressed

DpadControl.ReadValue Varat arī izmantot šo metodi, lai iegūtu preses stāvokli Vector2 . Ja nekas netiek nospiests (0, 0), ja pa kreisi tiek nospiests (-1, 0) utt.

Pēc EventSystem skripta saglabāšanas pievienojiet to un iestatiet teksta objektu parādīšanai.

Mēģiniet palaist spēli un mijiedarboties ar DPAD.

Vector2 Starp citu, ir normalizētā stāvoklī, tāpēc, nospiežot diagonāli, to iegūst kā skaitli, piemēram, (0,7071, 0,7071), nevis (1, 1).

Nosakiet sprūda nospiešanu

Xbox kontrolleriem kreisajā un labajā pusē ir pogas, ko sauc par trigeriem. PlayStation tas atbilst L2R2. Šī poga atšķiras no parastās pogas, un jūs varat iegūt nospiežamo summu 0.0 ~ 1.0. Daži citi kontrolieri ir aprīkoti ar nosaukumiem, kas nav trigeri, bet vecākiem kontrolieriem utt., Tos var vienkārši novietot kā pogas, un tādā gadījumā nospiešanas spriedums tiek apstrādāts tikai kā 0, 1.

Šeit es gribētu pārbaudīt sprūda presīšu daudzumu. Novieto teksta objektu rādīšanai uz audekla.

Izveidojiet skriptu. Tā kā tas tiks izmantots citur, mēs to nosauksim šeit GamepadReadValue .

Skripts izskatās šādi:

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 Katrai leftTriggerklasei ir īpašums, un rightTrigger ReadValue , izsaucot metodi, jūs varat iegūt preses daudzumu diapazonā no 0,0 ~ 1,0. Trigerus var uzskatīt arī par pogām, tāpēc isPressed varat arī spriest, piemēram. isPressed true Starp citu, kļūšanas ReadValue summa ir balstīta uz 0, 5.

Pēc skripta EventSystem saglabāšanas pievienojiet to un iestatiet teksta objektu parādīšanai.

Mēģiniet palaist spēli un pārvietot sprūdu.

Nosakiet informāciju par nūju

Nūja var iegūt informāciju attiecīgi par kreiso nūju un labo nūju, un jūs varat iegūt summu, cik daudz nūja tiek nospiesta uz leju, kurā virzienā. Protams, ja jums nav kontroliera nūjas, jūs nevarēsit iegūt šo informāciju.

Nūjas informāciju var iegūt ar , Gamepad.rightStick attiecīgiGamepad.leftStick.

Operācijas apstiprināšanas skriptam mēs novirzīsim iepriekš izmantoto skriptu, lai iegūtu sprūdu.

// 省略

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 Preses informāciju var iegūt, zvanot uz Vector2 metodi no ReadValue vai . Vector2 Tātad jūs varat iegūt, cik x y daudz jūs nospiežat uz X ass un Y ass, un īpašības, Ja vēlaties iegūt virzienu, kuru nospiežat, varat to iegūt īpašumā, un, ja vēlaties magnitude iegūt summu, kuru nospiežat, varat normalized to iegūt īpašumā.

Mēģiniet faktiski pārvietot spēli un darbināt nūju.

Iegūstiet informāciju par spēļu paneli

Jūs varat iegūt ID, vārdu utt., Izmantojot pievienoto gamepad. Piemēram, atsaucieties, lai noteiktu name savienotā kontrollera veidu, vai Varat atsaukties uz to, ar kuru deviceId spēļu paneli saistīt, ja ir pievienoti vairāki spēļu paliktņi.

Šeit mēs parādīsim informāciju tekstā, lai pārbaudītu darbību.

Skripta nosaukums ir patvaļīgs, bet šeit GamepadInfo tas ir .

Skripts izskatās šādi:

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 Jūs varat iegūt dažādu informāciju no izgūtā . Šeit ir daži fragmenti.

Pēc skripta EventSystem saglabāšanas pievienojiet to un iestatiet teksta objektu parādīšanai.

Mēģiniet palaist spēli, lai redzētu, vai informācija tiek parādīta.