Működtetés joystickkal (Input System csomagolt változat)

Oldal frissítve :
Oldal létrehozásának dátuma :

Ellenőrzési környezet

Windows
  • Windows 11 esetén
Unity-szerkesztő
  • 2020.3.25f1
Bemeneti rendszercsomagok
  • 1.2.0

A tipp előfeltételei

A következő beállítások előre konfigurálva vannak a tippek magyarázatának előfeltételeként.

Az XInput és a DirectInput ismertetése

Bár a Windowsra korlátozódik, a játékvezérlők számára két csatlakozási formátum létezik: "DirectInput" és "XInput". A "Joystick" itt a "DirectInput" -nak felel meg.

Ebben Joystick a programban egy osztállyal van dolgunk, de csak a "DirectInput" -ot támogató vezérlőket tudja kezelni. Az "XInput" funkciót támogató vezérlő használatához másik Gamepad osztályt kell használnia.

A "DirectInput" egy régi csatlakozási formátum, és a gombok meghatározása viszonylag kétértelmű, és speciális formájú vezérlőket képes kezelni. A közelmúltban azonban az "XInput" mainstream lett, és a "DirectInput" -ot nem támogató vezérlők száma növekszik. Mivel a "DirectInput" a gombokat "1", "2" és "3" néven határozza meg, a játékkészítőknek olyan rendszert kell létrehozniuk, amely lehetővé teszi a játék és a vezérlő gombjainak megfelelő beállítását.

Az "XInput" a "DirectInput" következő generációja, és előre definiált A és B gombokkal, triggerekkel, karokkal stb. rendelkezik. Ezért csak a vezérlő alakja használható, ami szinte rögzített. Mivel a gombok meghatározása jól definiált, a játékkészítők olyan játékokat hozhatnak létre, amelyek megfelelnek a vezérlőnek anélkül, hogy aggódniuk kellene a gombok elhelyezése miatt. Egyre több újabb játékvezérlő csak az "XInput" -val kompatibilis.

A joystickokról

Mint fentebb említettük, a gombnak nincs meghatározása, így annak tényleges használatához zavaró folyamatokat kell hozzáadni, mint például a játékműveletek hozzárendelése az egyes gombok információinak vizsgálata közben. Nem hiszem, hogy új játékban kell használnia a DirectInputot, mert régi, de ne feledje, hogy ha valóban támogatni akarja, a program bonyolult lehet.

Ez a minta alapvetően a felsorolt gombokkal kapcsolatos információk megszerzésére korlátozódik. name Valójában ellenőriznie és hozzárendelnie kell a műveleteket.

Joystick információszerzés

Helyezzen el egy szöveges objektumot a joystick egyes gombjaival kapcsolatos információk megjelenítéséhez.

Hozzon létre egy szkriptet. A név önkényes, de ebben az esetben JoystickInfo .

A szkript így néz ki: A kapott információk a vezérlő típusától függően változnak. Nagyon nehéz programozni az egyes vezérlőkhöz, ezért csak felsorolom az összes gombot, és megkapom a gomb típusát, és megnyomom az információkat.

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

A csatlakoztatott joystickról információt Joystick.current kaphat itt: . Joystick Ezt követően minden információt megkapunk az osztálytól.

Joystick Amint az osztályból látható, vannak olyan definíciók, mint a és , de nincsenek olyan definíciók, stick trigger mint az A gomb vagy a Start gomb. Ezért a Tulajdonságok segítségével számba kell vennie az összes gombot, kart, és meg kell találnia a gomb típusát,allControls és meg kell nyomnia az információkat.

A parancsfájl mentése EventSystem után csatolja és állítson be egy szöveges objektumot az információk megjelenítéséhez.

Próbálja meg futtatni a játékot olyan kontrollerrel, amely támogatja a DirectInput funkciót. Minden információ visszakereshető.

A vezérlőtől függően előfordulhat, hogy nem kapja meg a kívánt értéket, amikor megnyom egy botot, nyílbillentyűt stb. Mivel a gombok nincsenek ilyen módon definiálva, nehéz pontos nyomkövetési információkat szerezni az egyes gombokhoz. Ezenkívül láthatjuk, hogy meglehetősen nehéz teljes mértékben támogatni a joystickot, például a gombok elrendezése a vezérlőtől függően eltérő.

Ha a játék támogatja a joystickokat, kívánatos lenne egy beállítási képernyő, mint egy kulcskonfiguráció, hogy minden felhasználó testreszabhassa a vezérlője gombelrendezését.

Hogyan juthat el több joystickhoz

Az összes csatlakoztatott joystickkal kapcsolatos Joystick.all információ a . ReadOnlyArray Fel foreach lehet sorolni és így tovább.

Mivel minden érték Joystick egy osztály, az előző programhoz hasonlóan joystick-információkat kaphat.