Manövrering med joystick (Input System-paketerad version)

Sidan uppdaterad :
Datum för skapande av sida :

Miljö för verifiering

Windows
  • Windows 11 (på engelska)
Unity-redigeraren
  • 2020.3.25f1
Paket för indatasystem
  • 1.2.0

Förutsättningar för det här tipset

Följande inställningar är förkonfigurerade som en förutsättning för förklaringen av dessa tips.

Om XInput och DirectInput

Även om det är begränsat till Windows finns det två anslutningsformat för spelkontroller: "DirectInput" och "XInput". "Joystick" motsvarar här "DirectInput".

I Joystick det här programmet har vi att göra med en klass, men den kan bara hantera kontroller som stöder "DirectInput". Om du vill använda en styrenhet som stöder "XInput" måste du använda en annan Gamepad klass.

"DirectInput" är ett gammalt anslutningsformat, och definitionen av knappar är relativt tvetydig, och den kan hantera kontroller med speciella former. Men på senare tid har "XInput" blivit mainstream, och antalet styrenheter som inte stöder "DirectInput" ökar. Eftersom "DirectInput" definierar knappar som "1", "2" och "3" måste spelskapare skapa ett system som gör att spel- och handkontrollens knappkorrespondens kan ställas in på rätt sätt.

"XInput" definieras som nästa generation av "DirectInput" och har fördefinierade A- och B-knappar, triggers, spakar, etc. Därför kan formen på styrenheten endast användas, som är nästan fast. Eftersom definitionen av knappar är väldefinierad kan spelskapare skapa spel som matchar handkontrollen utan att behöva oroa sig för knapparnas placering. Ett ökande antal nya spelkontroller är endast kompatibla med "XInput".

Värt att veta om styrspakar

Som nämnts ovan finns det ingen definition av knappen, så för att faktiskt kunna använda den är det nödvändigt att lägga till besvärliga processer som att tilldela speloperationer samtidigt som man undersöker informationen för varje knapp. Jag tror inte att du behöver använda DirectInput i ett nytt spel för att det är gammalt, men tänk på att om du verkligen vill stödja det kan ditt program vara komplicerat.

Det här exemplet är i princip begränsat till att hämta information om de listade knapparna. name Faktum är att du måste kontrollera och tilldela operationer.

Informationsinhämtning med joystick

Placera ett textobjekt för att visa information om varje knapp på joysticken.

Skapa ett skript. Namnet är godtyckligt, men i det här fallet JoystickInfo är det .

Skriptet ser ut så här: Den information som erhålls varierar beroende på typ av styrenhet. Det är väldigt svårt att programmera för varje styrenhet, så jag räknar bara upp alla knappar och får knapptyp och tryckinformation.

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

Du kan få information Joystick.current om den anslutna joysticken i . Joystick Efter det kommer vi att få varje information från klassen.

Joystick Som du kan se från klassen stick trigger finns det definitioner som och , men det finns inga definitioner som A-knappen eller startknappen. Därför bör du använda Egenskaper för att räkna upp alla knappar,allControls pinnar och ta reda på knapptyp och tryckinformation.

När skriptet har sparats bifogar du EventSystem det till och anger ett textobjekt för att visa information.

Prova att köra spelet med en handkontroll som stöder DirectInput. Varje del av informationen kan hämtas.

Beroende på styrenheten kanske du inte får värdet som avsett när du trycker på en pinne, piltangent osv. Eftersom knapparna inte är definierade på detta sätt är det svårt att få exakt tryckinformation för varje knapp. Dessutom kan du se att det är ganska svårt att stödja joysticken fullt ut, till exempel varierar knapparnas placering beroende på styrenheten.

Om spelet ska ha stöd för joysticks skulle det vara önskvärt att ha en inställningsskärm som en nyckelkonfiguration så att varje användare kan anpassa knapplayouten för den handkontroll de har.

Så här hämtar du information för flera joysticks

Information om Joystick.all alla anslutna joysticks finns i . ReadOnlyArray Det foreach kan räknas upp i och så vidare.

Eftersom varje värde är Joystick en klass kan du få joystickinformation som i det tidigare programmet.