Upravljanje z igralno palico (različica s paketom vhodnega sistema)

Stran posodobljena :
Datum ustvarjanja strani :

Okolje za preverjanje

Windows
  • Windows 11
Urejevalnik Unity
  • 2020.3.25F1
Paketi vhodnih sistemov
  • 1.2.0

Predpogoji za ta nasvet

Naslednje nastavitve so vnaprej konfigurirane kot predpogoj za razlago teh nasvetov.

O nastanitvi XInput in DirectInput

Čeprav je omejen na Windows, obstajata dva formata povezave za krmilnike iger: "DirectInput" in "XInput". "Joystick" tukaj ustreza "DirectInput".

V Joystick tem programu se ukvarjamo z razredom, vendar lahko upravlja samo krmilnike, ki podpirajo "DirectInput". Če želite uporabiti krmilnik, ki podpira "XInput", morate uporabiti drug Gamepad razred.

"DirectInput" je stara oblika povezave, definicija gumbov pa je relativno dvoumna in lahko upravlja krmilnike s posebnimi oblikami. Vendar pa je pred kratkim "XInput" postal mainstream, število krmilnikov, ki ne podpirajo "DirectInput", pa se povečuje. Ker "DirectInput" definira gumbe kot "1", "2" in "3", morajo ustvarjalci iger ustvariti sistem, ki omogoča ustrezno nastavitev korespondence z gumbi igre in krmilnika.

"XInput" je definiran kot naslednja generacija "DirectInput" in ima vnaprej določene gumbe A in B, sprožilce, palice itd. Zato se lahko uporabi samo oblika krmilnika, ki je skoraj fiksna. Ker je definicija gumbov dobro opredeljena, lahko ustvarjalci iger ustvarijo igre, ki se ujemajo s krmilnikom, ne da bi skrbeli za postavitev gumbov. Vse večje število nedavnih krmilnikov za igre je združljivih samo z "XInput".

O igralnih palicah

Kot je navedeno zgoraj, ni definicije gumba, zato je za njegovo dejansko uporabo potrebno dodati problematične procese, kot je dodeljevanje operacij igre med pregledovanjem informacij vsakega gumba. Mislim, da vam ni treba uporabljati DirectInput v novi igri, ker je stara, vendar ne pozabite, da če ga res želite podpreti, je lahko vaš program zapleten.

Ta vzorec je v bistvu omejen na pridobivanje informacij o navedenih gumbih. name Pravzaprav morate preveriti in dodeliti operacije.

Zajem informacij o igralni palici

Postavite predmet besedila, da prikažete informacije o vsakem gumbu na igralni palici.

Ustvarite skript. Ime je poljubno, vendar je v tem primeru JoystickInfo .

Scenarij izgleda takole: Pridobljene informacije se razlikujejo glede na vrsto upravljavca. Zelo težko je programirati za vsak krmilnik, zato samo naštejem vse gumbe in dobim vrsto gumba in pritisnem informacije.

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

Informacije Joystick.current o povezani igralni palici lahko dobite v . Joystick Po tem bomo dobili vse informacije iz razreda.

Joystick Kot lahko vidite iz razreda, obstajajo definicije, kot so in , stick trigger vendar ni definicij, kot je gumb A ali gumb za zagon. Zato uporabite Lastnosti, da naštejete vse gumbe,allControls palice in ugotovite vrsto gumba in pritisnete informacije.

Ko je skript shranjen EventSystem , ga priložite in nastavite besedilni predmet za prikaz informacij.

Poskusite zagnati igro s krmilnikom, ki podpira DirectInput. Vsak podatek je mogoče pridobiti.

Odvisno od krmilnika morda ne boste dobili vrednosti, kot je predvideno, ko pritisnete palico, puščično tipko itd. Ker gumbi niso definirani na ta način, je težko pridobiti natančne informacije o pritisku za vsak gumb. Poleg tega lahko vidite, da je igralno palico zelo težko v celoti podpreti, saj se razporeditev gumbov razlikuje glede na krmilnik.

Če igra podpira igralne palice, bi bilo zaželeno imeti zaslon z nastavitvami, kot je konfiguracija ključev, tako da lahko vsak uporabnik prilagodi postavitev gumbov krmilnika, ki ga ima.

Kako dobiti informacije za več igralnih palic

Informacije o Joystick.all vseh povezanih igralnih palicah lahko dobite v . ReadOnlyArray Lahko ga foreach naštejemo in tako naprej.

Ker je Joystick vsaka vrednost razred, lahko dobite informacije o igralni palici kot v prejšnjem programu.