Funcționarea cu un joystick (versiunea ambalată a sistemului de intrare)

Pagina actualizată :
Data creării paginii :

Mediul de verificare

Windows
  • Ferestre 11
Unity Editor
  • 2020.3.25F1
Pachete de sisteme de intrare
  • 1.2.0

Cerințe preliminare pentru acest sfat

Următoarele setări sunt preconfigurate ca o condiție prealabilă pentru explicarea acestor sfaturi.

Despre XInput și DirectInput

Deși este limitat la Windows, există două formate de conectare pentru controlerele de jocuri: "DirectInput" și "XInput". "Joystick" aici corespunde cu "DirectInput".

În Joystick acest program, avem de-a face cu o clasă, dar se poate ocupa doar de controlere care acceptă "DirectInput". Pentru a utiliza un controler care acceptă "XInput", trebuie să utilizați o altă Gamepad clasă.

"DirectInput" este un format vechi de conectare, iar definiția butoanelor este relativ ambiguă și poate gestiona controlere cu forme speciale. Cu toate acestea, recent, "XInput" a devenit mainstream, iar numărul de controlere care nu acceptă "DirectInput" este în creștere. Deoarece "DirectInput" definește butoanele ca "1", "2" și "3", creatorii jocului trebuie să creeze un sistem care să permită corespondența dintre joc și butonul controlerului să fie setată corespunzător.

"XInput" este definit ca următoarea generație de "DirectInput" și are butoane A și B predefinite, declanșatoare, stick-uri etc. Prin urmare, forma controlerului poate fi utilizată numai, care este aproape fixă. Deoarece definiția butoanelor este bine definită, creatorii de jocuri pot crea jocuri care se potrivesc cu controlerul fără să se îngrijoreze de plasarea butoanelor. Un număr tot mai mare de controlere de joc recente sunt compatibile numai cu "XInput".

Despre joystick-uri

După cum sa menționat mai sus, nu există o definiție a butonului, deci pentru a-l utiliza efectiv, este necesar să adăugați procese supărătoare, cum ar fi atribuirea operațiilor de joc în timp ce examinați informațiile fiecărui buton. Nu cred că trebuie să utilizați DirectInput într-un joc nou, deoarece este vechi, dar rețineți că, dacă doriți cu adevărat să îl susțineți, programul dvs. poate fi complicat.

Acest eșantion este practic limitat la obținerea de informații despre butoanele listate. name De fapt, trebuie să verificați și să atribuiți operațiuni.

Achiziție de informații despre joystick

Plasați un obiect text pentru a afișa informații despre fiecare buton de pe joystick.

Creați un script. Numele este arbitrar, dar în acest caz JoystickInfo , este .

Scenariul arată astfel: Informațiile obținute variază în funcție de tipul de controler. Este foarte dificil să programez pentru fiecare controler, așa că doar enumer toate butoanele și obțin tipul butonului și informațiile de apăsare.

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

Puteți obține informații Joystick.current despre joystick-ul conectat în . Joystick După aceea, vom primi fiecare informație din clasă.

Joystick După cum puteți vedea din clasă, există definiții precum și , stick trigger dar nu există definiții precum butonul A sau butonul de pornire. Prin urmare, ar trebui să utilizați Proprietăți pentru a enumera toate butoanele,allControls stick-urile și pentru a afla tipul de buton și informațiile de presă.

Odată ce scriptul este salvat, EventSystem atașați-l și setați un obiect text pentru afișarea informațiilor.

Încercați să rulați jocul cu un controler care acceptă DirectInput. Fiecare informație poate fi recuperată.

În funcție de controler, este posibil să nu obțineți valoarea dorită atunci când apăsați un stick, o tastă săgeată etc. Deoarece butoanele nu sunt definite în acest fel, este dificil să obțineți informații precise de apăsare pentru fiecare buton. În plus, puteți vedea că este destul de dificil să susțineți pe deplin joystick-ul, cum ar fi aranjamentul butoanelor diferă în funcție de controler.

Dacă jocul trebuie să suporte joystick-uri, ar fi de dorit să aveți un ecran de setare ca o configurare a tastelor, astfel încât fiecare utilizator să poată personaliza aspectul butonului controlerului pe care îl are.

Cum să obțineți informații pentru mai multe joystick-uri

Informații despre Joystick.all toate joystick-urile conectate pot fi obținute în . ReadOnlyArray Poate foreach fi enumerat în și așa mai departe.

Deoarece fiecare valoare este Joystick o clasă, puteți obține informații despre joystick ca în programul anterior.