Ovládanie pomocou joysticku (verzia v balíku vstupného systému)

Stránka aktualizovaná :
Dátum vytvorenia strany :

Prostredie overovania

Windows
  • Windows 11
Editor jednoty
  • 2020.3.25f1
Vstupné systémové balíky
  • 1.2.0

Predpoklady pre tento tip

Nasledujúce nastavenia sú vopred nakonfigurované ako predpoklad na vysvetlenie týchto tipov.

O spoločnosti XInput a DirectInput

Aj keď je obmedzený na Windows, existujú dva formáty pripojenia pre herné ovládače: "DirectInput" a "XInput". "Joystick" tu zodpovedá "DirectInput".

V Joystick tomto programe sa zaoberáme triedou, ale dokáže spracovať iba ovládače, ktoré podporujú "DirectInput". Ak chcete použiť ovládač, ktorý podporuje "XInput", musíte použiť inú Gamepad triedu.

"DirectInput" je starý formát pripojenia a definícia tlačidiel je pomerne nejednoznačná a dokáže zvládnuť ovládače so špeciálnymi tvarmi. V poslednej dobe sa však "XInput" stal hlavným prúdom a počet ovládačov, ktoré nepodporujú "DirectInput", sa zvyšuje. Keďže "DirectInput" definuje tlačidlá ako "1", "2" a "3", tvorcovia hier musia vytvoriť systém, ktorý umožní správne nastavenie korešpondencie tlačidiel hry a ovládača.

"XInput" je definovaný ako ďalšia generácia "DirectInput" a má preddefinované tlačidlá A a B, spúšte, páčky atď. Preto je možné použiť iba tvar ovládača, ktorý je takmer pevný. Keďže definícia tlačidiel je dobre definovaná, tvorcovia hier môžu vytvárať hry, ktoré zodpovedajú ovládaču, bez obáv z umiestnenia tlačidiel. Rastúci počet nedávnych herných ovládačov je kompatibilných iba s "XInput".

Informácie o joystickoch

Ako už bolo spomenuté vyššie, neexistuje definícia tlačidla, takže na jeho skutočné použitie je potrebné pridať nepríjemné procesy, ako napríklad priradenie herných operácií pri skúmaní informácií o každom tlačidle. Nemyslím si, že musíte použiť DirectInput v novej hre, pretože je stará, ale majte na pamäti, že ak ju naozaj chcete podporiť, váš program môže byť komplikovaný.

Táto vzorka je v zásade obmedzená na získanie informácií o uvedených tlačidlách. name V skutočnosti musíte skontrolovať a priradiť operácie.

Získavanie informácií joystickom

Umiestnením textového objektu zobrazíte informácie o každom tlačidle na pákovom ovládači.

Vytvorte skript. Názov je ľubovoľný, ale v tomto prípade JoystickInfo je to .

Skript vyzerá takto: Získané informácie sa líšia v závislosti od typu ovládača. Je veľmi ťažké naprogramovať pre každý ovládač, takže len vymenujem všetky tlačidlá a získam typ tlačidla a informácie o stlačení.

using System.Text;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
using UnityEngine.UI;

public class JoystickInfo : 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 joystick = Joystick.current;
    if (joystick == null)
    {
      Debug.Log("ジョイスティックがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // ジョイスティックの情報取得
    Builder.AppendLine($"deviceId:{joystick.deviceId}");
    Builder.AppendLine($"name:{joystick.name}");
    Builder.AppendLine($"displayName:{joystick.displayName}");

    // ジョイスティックにはボタンの大部分が定義されていないので
    // 基本的には allControls で列挙して入力の種類と値を確認していく
    foreach (var key in joystick.allControls)
    {
      if (key is StickControl stick)
      {
        if (stick.up.isPressed) Builder.AppendLine($"{key.name} Up");
        if (stick.down.isPressed) Builder.AppendLine($"{key.name} Down");
        if (stick.left.isPressed) Builder.AppendLine($"{key.name} Left");
        if (stick.right.isPressed) Builder.AppendLine($"{key.name} Right");

        var value = stick.ReadValue();
        if (value.magnitude > 0f)
        {
          Builder.AppendLine($"{key.name}:{value.normalized * value.magnitude}");
        }
      }
      else if (key is Vector2Control vec2)
      {
        var value = vec2.ReadValue();
        if (value.magnitude > 0f)
        {
          Builder.AppendLine($"{key.name}:{value.normalized * value.magnitude}");
        }
        if (vec2.x.ReadValue() != 0f)
        {
          Builder.AppendLine($"{key.name}.x:{vec2.x.ReadValue()}");
        }
        if (vec2.y.ReadValue() != 0f)
        {
          Builder.AppendLine($"{key.name}.x:{vec2.y.ReadValue()}");
        }
      }
      else if (key is ButtonControl button)
      {
        if (button.isPressed) Builder.AppendLine($"{key.name} isPress");
        var value = button.ReadValue();
        if (value != 0f)
        {
          Builder.AppendLine($"{key.name}:{value}");
        }
      }
      else if (key is AxisControl axis)
      {
        if (axis.IsPressed()) Builder.AppendLine($"{key.name} isPress");

        var value = axis.ReadValue();
        if (value != 0f)
        {
          Builder.AppendLine($"{key.name}:{value}");
        }
      }
      else
      {
        Builder.AppendLine($"Type={key.GetType()}");
      }
    }

    // 押しているボタン一覧をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

Informácie Joystick.current o pripojenom joysticku môžete získať v . Joystick Potom dostaneme všetky informácie z triedy.

Joystick Ako môžete vidieť z triedy, existujú definície ako a , ale neexistujú žiadne definície, stick trigger ako napríklad tlačidlo A alebo tlačidlo Štart. Preto by ste mali použiť vlastnosti na vymenovanie všetkých tlačidiel,allControls páčok a zistiť typ tlačidla a stlačiť informácie.

Po uložení EventSystem skriptu ho pripojte a nastavte textový objekt na zobrazovanie informácií.

Skúste hru spustiť pomocou ovládača, ktorý podporuje DirectInput. Každú informáciu je možné získať.

V závislosti od ovládača sa po stlačení páčky, klávesu so šípkou atď. nemusí zobraziť hodnota podľa plánu. Keďže tlačidlá nie sú definované týmto spôsobom, je ťažké získať presné informácie o stlačení každého tlačidla. Okrem toho môžete vidieť, že je dosť ťažké plne podporovať joystick, napríklad usporiadanie tlačidiel sa líši v závislosti od ovládača.

Ak má hra podporovať joysticky, bolo by žiaduce mať obrazovku nastavení, ako je konfigurácia klávesov, aby si každý používateľ mohol prispôsobiť rozloženie tlačidiel ovládača, ktorý má.

Ako získať informácie o viacerých joystickoch

Informácie o Joystick.all všetkých pripojených joystickoch je možné získať v . ReadOnlyArray Môže foreach byť vymenovaný v a tak ďalej.

Keďže každá hodnota je Joystick trieda, môžete získať informácie o joysticku ako v predchádzajúcom programe.