Valdymas naudojant "Gamepad" (įvesties sistemos paketo versija)

Puslapis atnaujintas :
Puslapio sukūrimo data :

Tikrinimo aplinka

Windows
  • Langai 11
"Unity" redaktorius
  • 2020.3.25f1
Įvesties sistemos paketas
  • 1.2.0

Būtinos šio patarimo sąlygos

Šie nustatymai buvo atlikti iš anksto kaip šio patarimo aprašymo prielaida.

Apie XInput ir DirectInput

Nors tai apsiriboja "Windows", žaidimų valdikliams yra du ryšio formatai: "DirectInput" ir "XInput". Čia "Gamepad" atitinka "XInput".

Ši Gamepad programa susijusi su klasėmis, tačiau tai gali būti taikoma tik valdikliams, kurie palaiko "XInput". Norėdami naudoti valdiklį, kuris palaiko "DirectInput", turite naudoti kitą Joystick klasę.

"DirectInput" yra senas ryšio formatas, o mygtuko apibrėžimas yra gana dviprasmiškas, ir jis gali valdyti valdiklius su specialiomis formomis. Tačiau pastaruoju metu "XInput" tapo pagrindiniu, o valdiklių, kurie nepalaiko "DirectInput", skaičius didėja. "DirectInput" turi mygtukų apibrėžimus, tokius kaip "1", "2" ir "3", todėl žaidimų kūrėjai turi sukurti mygtuko atitikimą tarp žaidimo ir valdiklio, kad juos būtų galima tinkamai nustatyti.

XInput apibrėžiamas kaip naujos kartos "DirectInput" ir apima iš anksto nustatytus A ir B mygtukus, paleidiklius, lazdeles ir kt. Todėl galima naudoti tik fiksuotą valdiklio formą, Kadangi mygtukų apibrėžimas yra gerai apibrėžtas, žaidimų kūrėjai gali kurti žaidimus, kurie tinka valdikliui, nesijaudindami dėl mygtukų išdėstymo. Daugėja naujausių žaidimų valdiklių, kurie palaiko tik "XInput".

Nustatymas, ar spaudžiamas mygtukas

Galite nustatyti, ar mygtukas paspaudžiamas, ar ne, pagal ypatybes, taip pat xxxxxxxx.isPressed klaviatūrą ir pelę. Čia norėčiau parodyti mygtuko, kurį paspaudžiu tekste, tipą.

Pirmiausia įdėkite ekrano teksto objektą.

Sukurkite nuosprendžio scenarijų. Failo pavadinimas yra savavališkas, bet čia GamepadButtons jis yra .

Scenarijus atrodo taip:

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

Įrašę EventSystem scenarijų, pridėkite jį prie rodomo teksto objekto ir jį sukonfigūruokite.

Pabandykite paleisti žaidimą ir pažiūrėkite, ar kiekvienas mygtukas reaguoja.

Beje, šie mygtukai apibrėžiami kaip tas pats mygtukas, nors keli mygtukai yra paruošti, nes jie skaitomi skirtingai, priklausomai nuo žaidimų konsolės. Kiekvienoje iš pirmiau minėtų programų yra įtrauktas sprendimo procesas, todėl paspaudus mygtuką rodomi trys mygtukai.

"
"XboxPlayStationir dar daugiau
bMygtukas apskritimo mygtukas mygtukasEastas
aMygtukas crossButton mygtukasSouth
xMygtukas kvadratinis mygtukas mygtukasVakarai
yMygtukas trikampisMygtukas mygtukasNorthas

Tai, ką galima vertinti kaip mygtuką, yra tokia.

  • Mygtukas, × mygtukas, mygtukas žemyn
  • B mygtukas, ○ mygtukas, dešinysis mygtukas
  • X mygtukas, □ mygtukas, kairysis mygtukas
  • Mygtukas Y, rodyklės žemyn mygtukas, mygtukas Aukštyn
  • Pradžios mygtukas, meniu mygtukas
  • Mygtukas Pasirinkti, rodinio mygtukas
  • Kairysis peties mygtukas, L1 mygtukas
  • Dešiniojo peties mygtukas, R1 mygtukas
  • Kairysis lazdos mygtukas
  • Dešinysis lazdelės mygtukas

Nustatykite, ar mygtukas paspaustas

Sprendimą paspaudimo metu galima nustatyti pagal savybes, kaip ir xxxxxxxx.wasPressedThisFrame klaviatūroje bei pelėje. Grąžina momento, kai true jis buvo paspaustas, reikšmę ir grąžina, net jei false jis paspaudžiamas ir laikomas po to.

Parodykime paspaustą mygtuką kaip tekstą kaip operacijos patikrinimą. Padėkite rodyti teksto objektą.

Scenarijaus failo pavadinimas gali būti bet koks, bet čia GamepadButtonsOneFrame jis yra .

Scenarijus atrodo taip: Paprastumo dėlei vertinami tik 4 mygtukai.

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

Išsaugoję EventSystem scenarijų, pridėkite jį prie teksto objekto ir nustatykite rodyti tekstą.

Pabandykite paleisti žaidimą ir paspausti mygtuką. Manau, kad mygtukas, kurį paspaudėte, bus pridėtas. Taip pat matote, kad laikant nuspaustą mygtuką tekstas nepridedamas.

Nustatykite, ar mygtuko atleidimo momentas

Pavyzdžio nėra, bet galite nustatyti, ar tai wasPressedThisFrame momentas, kai jį atleidžiate, naudodami ypatybę, o ne wasReleasedThisFrame ypatybę.

Nustatymas, kada paspausite rodyklių klavišus

Nustato DPAD spaudą. Priklausomai nuo žaidimų konsolės, jis skris su rodyklių klavišais ir D-pad, tačiau abu yra traktuojami kaip vienodi. DPAD iš esmės tik nustato, ar jūs stumiate ta kryptimi, ar ne. Nėra tokio sprendimo, kaip "šiek tiek stumti" kaip lazda.

Įdeda teksto objektą, kad būtų rodomas sprendimas, nesvarbu, ar jis paspaustas, ar ne, kaip operacijos tikrinimas.

Sukurkite scenarijų. Failo pavadinimas yra savavališkas, bet čia GamepadDpad jis yra .

Scenarijus atrodo taip:

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 informaciją Gamepad.dpad galite gauti adresu .

DPAD turi leftupdown rightsavybių kiekvienai krypčiai, ir jūs galite nustatyti, ar jį spaudžia nuosavybė, ar ne ir pan. isPressed

DpadControl.ReadValue Taip pat galite naudoti šį metodą, kad gautumėte spaudos būseną Vector2 . Jei nieko nespaudžiama (0, 0), jei paspaudžiama kairė (-1, 0) ir pan.

Išsaugoję EventSystem scenarijų, pridėkite jį prie teksto objekto ir nustatykite rodyti tekstą.

Pabandykite paleisti žaidimą ir bendrauti su DPAD.

Vector2 Beje, yra normalizuotoje būsenoje, todėl, kai paspaudžiate įstrižai, jis gaunamas kaip skaičius, pvz., (0, 7071, 0, 7071), o ne (1, 1).

Nustatykite gaiduko paspaudimus

"Xbox" valdikliai turi mygtukus, vadinamus paleidikliais kairėje ir dešinėje. "PlayStation" jis atitinka L2R2. Šis mygtukas skiriasi nuo įprasto mygtuko, o paspaudžiamą sumą galite gauti 0.0 ~ 1.0. Kai kurie kiti valdikliai turi kitus pavadinimus nei paleidikliai, tačiau senesniuose valdikliuose ir pan., Jie gali būti tiesiog dedami kaip mygtukai, tokiu atveju paspaudimo sprendimas tvarkomas tik kaip 0, 1.

Čia norėčiau patikrinti gaiduko paspaudimų kiekį. Įdeda teksto objektą, kad jis būtų rodomas drobėje.

Sukurkite scenarijų. Kadangi jis bus naudojamas kitur, mes jį pavadinsime čia GamepadReadValue .

Scenarijus atrodo taip:

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 Kiekviena leftTriggerklasė turi savybę ir rightTrigger ReadValue paskambinę šiuo metodu galite gauti 0,0 ~ 1,0 paspaudimų kiekį. Paleidikliai taip pat gali būti traktuojami kaip mygtukai, todėl isPressed taip pat galite spręsti, pavyzdžiui. isPressed true Beje, tapsmo ReadValue suma yra pagrįsta 0, 5.

Išsaugoję scenarijų, EventSystem pridėkite jį prie teksto objekto ir nustatykite rodyti tekstą.

Pabandykite paleisti žaidimą ir perkelti gaiduką.

Nustatykite lazdos informaciją

Lazda gali gauti atitinkamai kairės ir dešinės lazdelės informaciją, ir jūs galite gauti sumą, kiek lazda yra nustumta žemyn kuria kryptimi. Žinoma, jei neturite valdiklio lazdos, negalėsite gauti šios informacijos.

Lipdukų informaciją galima gauti atitinkamai naudojant , Gamepad.rightStick atitinkamaiGamepad.leftStick.

Operacijos patvirtinimo scenarijui nukreipsime anksčiau naudotą scenarijų, kad gautume paleidiklį.

// 省略

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 Spaudos informaciją galite gauti paskambinę Vector2ReadValue arba . Vector2 Taigi galite sužinoti, kiek x y spaudžiate X ašį ir Y ašį pagal savybes, Jei norite gauti kryptį, kurią spaudžiate, galite ją gauti nuosavybėje, o jei magnitude norite gauti sumą, kurią spaudžiate, normalized galite ją gauti nuosavybėje.

Pabandykite iš tikrųjų perkelti žaidimą ir valdyti lazdą.

Gaukite žaidimų pulto informaciją

ID, vardą ir kt. galite gauti iš prijungto žaidimų pulto. Pavyzdžiui, nurodykite, kad nustatytumėte name prijungto valdiklio tipą, arba Galite nurodyti, su kuriuo deviceId žaidimų pultu susieti, kai yra prijungti keli žaidimų pultai.

Čia mes parodysime informaciją tekste, kad patikrintume operaciją.

Scenarijaus pavadinimas yra savavališkas, bet čia GamepadInfo jis yra .

Scenarijus atrodo taip:

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 Galite gauti įvairios informacijos iš gauto . Štai keletas ištraukų.

Išsaugoję scenarijų, EventSystem pridėkite jį prie teksto objekto ir nustatykite rodyti tekstą.

Pabandykite paleisti žaidimą, kad pamatytumėte, ar rodoma informacija.