Bediening met een joystick (Input System-verpakte versie)

Pagina bijgewerkt :
Aanmaakdatum van pagina :

Verificatie omgeving

Ramen
  • Vensters 11
Unity-editor
  • 2020.3.25f1
Pakketten met invoersystemen
  • 1.2.0

Vereisten voor deze tip

De volgende instellingen zijn vooraf geconfigureerd als voorwaarde voor de uitleg van deze tips.

Informatie over XInput en DirectInput

Hoewel het beperkt is tot Windows, zijn er twee verbindingsformaten voor gamecontrollers: "DirectInput" en "XInput". "Joystick" komt hier overeen met "DirectInput".

In Joystick dit programma hebben we te maken met een klasse, maar deze kan alleen overweg met controllers die "DirectInput" ondersteunen. Als u een controller wilt gebruiken die "XInput" ondersteunt, moet u een andere Gamepad klasse gebruiken.

"DirectInput" is een oud verbindingsformaat en de definitie van knoppen is relatief dubbelzinnig en kan controllers met speciale vormen aan. Onlangs is "XInput" echter mainstream geworden en neemt het aantal controllers dat "DirectInput" niet ondersteunt, toe. Aangezien "DirectInput" knoppen definieert als "1", "2" en "3", moeten gamemakers een systeem maken waarmee de overeenkomst tussen de game- en controllerknoppen op de juiste manier kan worden ingesteld.

"XInput" is gedefinieerd als de volgende generatie van "DirectInput" en heeft vooraf gedefinieerde A- en B-knoppen, triggers, sticks, enz. Daarom kan de vorm van de controller alleen worden gebruikt, die bijna vast is. Omdat de definitie van knoppen goed gedefinieerd is, kunnen gamemakers games maken die bij de controller passen zonder zich zorgen te hoeven maken over de plaatsing van knoppen. Een toenemend aantal recente gamecontrollers is alleen compatibel met "XInput".

Over joysticks

Zoals hierboven vermeld, is er geen definitie van de knop, dus om deze daadwerkelijk te gebruiken, is het noodzakelijk om lastige processen toe te voegen, zoals het toewijzen van spelbewerkingen tijdens het onderzoeken van de informatie van elke knop. Ik denk niet dat je DirectInput in een nieuw spel hoeft te gebruiken omdat het oud is, maar houd er rekening mee dat als je het echt wilt ondersteunen, je programma ingewikkeld kan zijn.

Dit voorbeeld is in principe beperkt tot het verkrijgen van informatie over de vermelde knoppen. name In feite moet u bewerkingen controleren en toewijzen.

Joystick Informatie Acquisitie

Plaats een tekstobject om informatie over elke knop op de joystick weer te geven.

Maak een script. De naam is willekeurig, maar in dit geval JoystickInfo is het .

Het script ziet er als volgt uit: De verkregen informatie varieert afhankelijk van het type controller. Het is erg moeilijk om voor elke controller te programmeren, dus ik som gewoon alle knoppen op en krijg het knoptype en de persinformatie.

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

Informatie over de aangesloten joystick vindt Joystick.current u in . Joystick Daarna krijgen we elke informatie van de klas.

Joystick Zoals je in de klasse kunt zien, zijn er definities zoals en , stick trigger maar er zijn geen definities zoals de A-knop of de startknop. Daarom moet u de Eigenschappen gebruiken om alle knoppen, sticksallControls op te sommen en het knoptype en de persinformatie te achterhalen.

Zodra het script is opgeslagen, voegt u EventSystem het toe aan een tekstobject en stelt u het in voor het weergeven van informatie.

Probeer de game uit te voeren met een controller die DirectInput ondersteunt. Elk stukje informatie kan worden opgehaald.

Afhankelijk van de controller krijgt u mogelijk niet de waarde zoals bedoeld wanneer u op een stick, pijltoets, enz. drukt. Omdat de knoppen niet op deze manier zijn gedefinieerd, is het moeilijk om voor elke knop nauwkeurige persinformatie te verkrijgen. Daarnaast zie je dat het best lastig is om de joystick volledig te ondersteunen, zo verschilt de opstelling van de knoppen per controller.

Als de game joysticks moet ondersteunen, zou het wenselijk zijn om een instellingenscherm te hebben zoals een toetsconfiguratie, zodat elke gebruiker de knopindeling van de controller die hij heeft kan aanpassen.

Informatie krijgen voor meerdere joysticks

Informatie over Joystick.all alle aangesloten joysticks is te vinden in . ReadOnlyArray Het foreach kan worden opgesomd in enzovoort.

Aangezien elke waarde een klasse is Joystick , kunt u joystickinformatie krijgen zoals in het vorige programma.