Betjening med joystick (Input System-pakket version)

Side opdateret :
Dato for oprettelse af side :

Miljø til bekræftelse

Windows
  • Windows 11
Enhedslistens redaktør
  • 2020.3.25f1
Input System Pakker
  • 1.2.0

Forudsætninger for dette tip

Følgende indstillinger er forudkonfigureret som en forudsætning for forklaringen af disse tip.

Om XInput og DirectInput

Selvom det er begrænset til Windows, er der to forbindelsesformater til spilcontrollere: "DirectInput" og "XInput". "Joystick" svarer her til "DirectInput".

I Joystick dette program har vi at gøre med en klasse, men den kan kun håndtere controllere, der understøtter "DirectInput". For at bruge en controller, der understøtter "XInput", skal du bruge en anden Gamepad klasse.

"DirectInput" er et gammelt forbindelsesformat, og definitionen af knapper er relativt tvetydig, og den kan håndtere controllere med specielle former. Men for nylig er "XInput" blevet mainstream, og antallet af controllere, der ikke understøtter "DirectInput", stiger. Da "DirectInput" definerer knapper som "1", "2" og "3", skal spilskabere oprette et system, der gør det muligt at indstille spil- og controllerknapkorrespondancen korrekt.

"XInput" defineres som den næste generation af "DirectInput" og har foruddefinerede A- og B-knapper, udløsere, pinde osv. Derfor kan controllerens form kun bruges, hvilket næsten er fast. Da definitionen af knapper er veldefineret, kan spilskabere oprette spil, der matcher controlleren uden at bekymre sig om placeringen af knapper. Et stigende antal nyere spilcontrollere er kun kompatible med "XInput".

Om joysticks

Som nævnt ovenfor er der ingen definition af knappen, så for faktisk at kunne bruge den er det nødvendigt at tilføje besværlige processer såsom tildeling af spiloperationer, mens du undersøger oplysningerne om hver knap. Jeg tror ikke, du behøver at bruge DirectInput i et nyt spil, fordi det er gammelt, men husk på, at hvis du virkelig vil støtte det, kan dit program være kompliceret.

Denne prøve er grundlæggende begrænset til at indhente oplysninger om de anførte knapper. name Faktisk skal du kontrollere og tildele operationer.

Joystick Information Erhvervelse

Placer et tekstobjekt for at få vist oplysninger om hver knap på joysticket.

Opret et script. Navnet er vilkårligt, men i dette tilfælde JoystickInfo er det .

Scriptet ser sådan ud: De opnåede oplysninger varierer afhængigt af typen af controller. Det er meget vanskeligt at programmere til hver controller, så jeg opregner bare alle knapperne og får knaptypen og presseoplysningerne.

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å oplysninger Joystick.current om det tilsluttede joystick i . Joystick Derefter får vi hver information fra klassen.

Joystick Som du kan se fra klassen, er der definitioner som og , stick trigger men der er ingen definitioner som A-knappen eller startknappen. Derfor bør du bruge Egenskaber til at opregne alle knapper,allControls pinde og finde ud af knaptypen og presseoplysningerne.

Når scriptet er gemt, EventSystem skal du vedhæfte det til og indstille et tekstobjekt til visning af information.

Prøv at køre spillet med en controller, der understøtter DirectInput. Hvert stykke information kan hentes.

Afhængigt af controlleren får du muligvis ikke værdien som tilsigtet, når du trykker på en pind, piletast osv. Da knapperne ikke er defineret på denne måde, er det vanskeligt at få nøjagtige trykoplysninger for hver knap. Derudover kan du se, at det er ret svært at understøtte joysticket fuldt ud, såsom arrangementet af knapperne varierer afhængigt af controlleren.

Hvis spillet skal understøtte joysticks, ville det være ønskeligt at have en indstillingsskærm som en nøglekonfiguration, så hver bruger kan tilpasse knaplayoutet på den controller, de har.

Sådan får du oplysninger om flere joysticks

Oplysninger om Joystick.all alle tilsluttede joysticks kan fås i . ReadOnlyArray Det foreach kan opregnes i og så videre.

Da hver værdi er Joystick en klasse, kan du få joystickoplysninger som i det foregående program.