Käyttö ohjaussauvalla (syöttöjärjestelmän pakattu versio)

Sivu päivitetty :
Sivun luontipäivämäärä :

Varmennusympäristö

Windows
  • Windows 11
Unity-editori
  • 2020.3.25F1
Syöttöjärjestelmän paketit
  • 1.2.0

Tämän vinkin edellytykset

Seuraavat asetukset on määritetty valmiiksi näiden vihjeiden selityksen edellytykseksi.

Tietoja XInputista ja DirectInputista

Vaikka se on rajoitettu Windowsiin, peliohjaimille on kaksi yhteysmuotoa: "DirectInput" ja "XInput". "Joystick" vastaa tässä "DirectInput".

Tässä Joystick ohjelmassa käsittelemme luokkaa, mutta se pystyy käsittelemään vain ohjaimia, jotka tukevat "DirectInputia". Jos haluat käyttää ohjainta, joka tukee "XInputia", sinun on käytettävä toista Gamepad luokkaa.

"DirectInput" on vanha yhteysmuoto, ja painikkeiden määritelmä on suhteellisen epäselvä, ja se pystyy käsittelemään ohjaimia, joilla on erityisiä muotoja. Viime aikoina "XInput" on kuitenkin tullut valtavirtaan, ja niiden ohjainten määrä, jotka eivät tue "DirectInputia", kasvaa. Koska "DirectInput" määrittelee painikkeet "1", "2" ja "3", pelintekijöiden on luotava järjestelmä, joka mahdollistaa pelin ja ohjaimen painikkeiden vastaavuuden asettamisen asianmukaisesti.

"XInput" määritellään seuraavan sukupolven "DirectInput" -tuotteeksi, ja siinä on ennalta määritetyt A- ja B-painikkeet, liipaisimet, sauvat jne. Siksi ohjaimen muotoa voidaan käyttää vain, joka on melkein kiinteä. Koska painikkeiden määritelmä on hyvin määritelty, pelintekijät voivat luoda ohjainta vastaavia pelejä huolimatta painikkeiden sijoittelusta. Yhä useammat viimeaikaiset peliohjaimet ovat yhteensopivia vain "XInputin" kanssa.

Tietoja ohjaussauvoista

Kuten edellä mainittiin, painiketta ei ole määritelty, joten sen käyttämiseksi on tarpeen lisätä hankalia prosesseja, kuten pelitoimintojen määrittäminen tutkittaessa kunkin painikkeen tietoja. Mielestäni sinun ei tarvitse käyttää DirectInputia uudessa pelissä, koska se on vanha, mutta muista, että jos todella haluat tukea sitä, ohjelmasi voi olla monimutkainen.

Tämä näyte rajoittuu periaatteessa tietojen saamiseen luetelluista painikkeista. name Itse asiassa sinun on tarkistettava ja määritettävä toiminnot.

Joystick-tietojen hankinta

Aseta tekstiobjekti näyttämään tietoja jokaisesta ohjaussauvan painikkeesta.

Luo komentosarja. Nimi on mielivaltainen, mutta tässä tapauksessa JoystickInfo se on .

Skripti näyttää tältä: Saadut tiedot vaihtelevat ohjaimen tyypin mukaan. Jokaiselle ohjaimelle on erittäin vaikea ohjelmoida, joten luettelen vain kaikki painikkeet ja saan painiketyypin ja painan tietoja.

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

Saat tietoja Joystick.current liitetystä ohjaussauvasta kohdassa . Joystick Sen jälkeen saamme kaikki tiedot luokasta.

Joystick Kuten luokasta näet, on olemassa määritelmiä, kuten ja , mutta määritelmiä, kuten A-painiketta tai käynnistyspainiketta, stick trigger ei ole. Siksi sinun tulisi käyttää ominaisuuksia luetellaksesi kaikki painikkeet,allControls sauvat ja selvittääksesi painiketyypin ja painamalla tietoja.

Kun skripti on tallennettu, EventSystem liitä se tekstiobjektiin ja aseta se tietojen näyttämistä varten.

Yritä suorittaa peli ohjaimella, joka tukee DirectInput-toimintoa. Jokainen tieto voidaan hakea.

Ohjaimesta riippuen et ehkä saa aiottua arvoa, kun painat sauvaa, nuolinäppäintä jne. Koska painikkeita ei ole määritelty tällä tavalla, on vaikea saada tarkkoja painallustietoja jokaisesta painikkeesta. Lisäksi voit nähdä, että ohjaussauvaa on melko vaikea tukea täysin, kuten painikkeiden järjestely vaihtelee ohjaimesta riippuen.

Jos pelin on tarkoitus tukea ohjaussauvoja, olisi toivottavaa, että asetusnäyttö, kuten näppäinmääritys, jotta jokainen käyttäjä voi mukauttaa ohjaimen painikkeiden asettelua.

Kuinka saada tietoja useista ohjaussauvoista

Tietoja kaikista kytketyistä Joystick.all ohjaussauvoista saa kohdasta . ReadOnlyArray Se foreach voidaan luetella ja niin edelleen.

Koska jokainen arvo on Joystick luokka, voit saada ohjaussauvan tietoja kuten edellisessä ohjelmassa.