Funcionament amb un joystick (versió empaquetada del sistema d'entrada)

Pàgina actualitzada :
Data de creació de la pàgina :

Entorn de verificació

Windows
  • Finestres 11
Editor d'unitat
  • 25.3.2020
Paquets del sistema d'entrada
  • 1.2.0

Requisits previs per a aquest consell

Els següents paràmetres estan preconfigurats com a requisit previ per a l'explicació d'aquests consells.

Quant a XInput i DirectInput

Tot i que està limitat a Windows, hi ha dos formats de connexió per als controladors de joc: "DirectInput" i "XInput". "Joystick" aquí correspon a "DirectInput".

En Joystick aquest programa, estem tractant amb una classe, però només pot manejar controladors que suportin "DirectInput". Per utilitzar un controlador que admeti "XInput", heu d'utilitzar una classe diferent Gamepad .

"DirectInput" és un format de connexió antic i la definició de botons és relativament ambigua i pot gestionar controladors amb formes especials. No obstant això, recentment, "XInput" s'ha convertit en corrent principal, i el nombre de controladors que no suporten "DirectInput" està augmentant. Atès que "DirectInput" defineix els botons com "1", "2" i "3", els creadors de jocs han de crear un sistema que permeti configurar la correspondència del joc i del botó del controlador adequadament.

"XInput" es defineix com la propera generació de "DirectInput" i té predefinits botons A i B, disparadors, pals, etc. Per tant, només es pot utilitzar la forma del controlador, que és gairebé fixa. Com que la definició de botons està ben definida, els creadors de jocs poden crear jocs que coincideixin amb el controlador sense preocupar-se de la col·locació dels botons. Un nombre creixent de controladors de joc recents només són compatibles amb "XInput".

Sobre els joysticks

Com s'ha esmentat anteriorment, no hi ha cap definició del botó, de manera que per utilitzar-lo realment, cal afegir processos problemàtics, com ara assignar operacions de joc mentre s'examina la informació de cada botó. No crec que necessiteu utilitzar DirectInput en un joc nou perquè és antic, però tingueu en compte que si realment voleu donar-li suport, el vostre programa pot ser complicat.

Aquesta mostra es limita bàsicament a obtenir informació sobre els botons llistats. name De fet, cal comprovar i assignar operacions.

Joystick Adquisició d'informació

Col·loqueu un objecte de text per mostrar informació sobre cada botó del joystick.

Creeu un script. El nom és arbitrari, però en aquest cas JoystickInfo , és .

El guió té aquest aspecte: La informació obtinguda varia en funció del tipus de responsable del tractament. És molt difícil programar per a cada controlador, així que només enumero tots els botons i obtinc el tipus de botó i premo informació.

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

Podeu obtenir informació Joystick.current sobre el joystick connectat a . Joystick Després d'això, obtindrem cada informació de la classe.

Joystick Com podeu veure a la classe, hi ha definicions com i , stick trigger però no hi ha definicions com el botó A o el botó d'inici. Per tant, hauríeu d'utilitzar les propietats per enumerar tots els botons, pals,allControls esbrinar el tipus de botó i prémer la informació.

Un cop desat l'script, EventSystem adjunteu-lo i configureu un objecte de text per mostrar informació.

Proveu d'executar el joc amb un controlador compatible amb DirectInput. Es pot recuperar cada informació.

Depenent del controlador, és possible que no obtingueu el valor previst quan premeu un pal, una tecla de fletxa, etc. Com que els botons no estan definits d'aquesta manera, és difícil obtenir informació de premsa precisa per a cada botó. A més, podeu veure que és bastant difícil suportar completament el joystick, com ara la disposició dels botons difereix en funció del controlador.

Si el joc és per suportar joysticks, seria desitjable tenir una pantalla de configuració com una configuració de tecles perquè cada usuari pugui personalitzar la disposició del botó del controlador que té.

Com obtenir informació per a diversos joysticks

La informació sobre Joystick.all tots els joysticks connectats es pot obtenir a . ReadOnlyArray Es foreach pot enumerar en i així successivament.

Com que cada valor és Joystick una classe, podeu obtenir informació del joystick com en el programa anterior.