Operacija su vairasvirte (įvesties sistemos paketo versija)

Puslapis atnaujintas :
Puslapio sukūrimo data :

Tikrinimo aplinka

Windows
  • Langai 11
"Unity" redaktorius
  • 2020.3.25f1
Įvesties sistemos paketai
  • 1.2.0

Būtinos šio patarimo sąlygos

Toliau nurodyti parametrai yra iš anksto sukonfigūruoti kaip būtina šių patarimų paaiškinimo sąlyga.

Apie XInput ir DirectInput

Nors tai apsiriboja "Windows", žaidimų valdikliams yra du ryšio formatai: "DirectInput" ir "XInput". "Vairasvirtė" čia atitinka "DirectInput".

Šioje Joystick programoje mes susiduriame su klase, tačiau ji gali tvarkyti tik valdiklius, kurie palaiko "DirectInput". Norėdami naudoti valdiklį, palaikantį "XInput", turite naudoti kitą Gamepad klasę.

"DirectInput" yra senas ryšio formatas, o mygtukų apibrėžimas yra gana dviprasmiškas ir gali valdyti valdiklius su specialiomis formomis. Tačiau pastaruoju metu "XInput" tapo pagrindiniu, o valdiklių, kurie nepalaiko "DirectInput", skaičius didėja. Kadangi "DirectInput" apibrėžia mygtukus kaip "1", "2" ir "3", žaidimų kūrėjai turi sukurti sistemą, leidžiančią tinkamai nustatyti žaidimo ir valdiklio mygtukų korespondenciją.

"XInput" apibrėžiamas kaip naujos kartos "DirectInput" ir turi iš anksto nustatytus A ir B mygtukus, paleidiklius, lazdeles ir kt. Todėl galima naudoti tik valdiklio formą, kuri yra beveik fiksuota. Kadangi mygtukų apibrėžimas yra gerai apibrėžtas, žaidimų kūrėjai gali kurti žaidimus, atitinkančius valdiklį, nesijaudindami dėl mygtukų išdėstymo. Vis daugiau naujausių žaidimų valdiklių yra suderinami tik su "XInput".

Apie vairasvirtes

Kaip minėta pirmiau, nėra mygtuko apibrėžimo, todėl norint iš tikrųjų jį naudoti, būtina pridėti varginančius procesus, pvz., Priskirti žaidimo operacijas, nagrinėjant kiekvieno mygtuko informaciją. Nemanau, kad jums reikia naudoti "DirectInput" naujame žaidime, nes jis yra senas, tačiau atminkite, kad jei tikrai norite jį palaikyti, jūsų programa gali būti sudėtinga.

Šis pavyzdys iš esmės apsiriboja informacijos apie išvardytus mygtukus gavimu. name Tiesą sakant, turite patikrinti ir priskirti operacijas.

Vairasvirtės informacijos gavimas

Padėkite teksto objektą, kad būtų rodoma informacija apie kiekvieną vairasvirtės mygtuką.

Sukurkite scenarijų. Pavadinimas yra savavališkas, bet šiuo atveju JoystickInfo , tai yra .

Scenarijus atrodo taip: Gauta informacija skiriasi priklausomai nuo valdiklio tipo. Labai sunku programuoti kiekvienam valdikliui, todėl tiesiog išvardiju visus mygtukus ir gaunu mygtuko tipą bei paspaudžiu informaciją.

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

Informacijos apie Joystick.current prijungtą vairasvirtę galite gauti . Joystick Po to mes gausime kiekvieną informaciją iš klasės.

Joystick Kaip matote iš klasės, yra apibrėžimų, tokių kaip ir , tačiau nėra apibrėžimų, stick trigger tokių kaip mygtukas A arba pradžios mygtukas. Todėl turėtumėte naudoti Nekilnojamasis turtas norėdami išvardyti visus mygtukus, lazdelesallControls ir sužinoti mygtuko tipą bei paspausti informaciją.

Išsaugoję scenarijų, EventSystem pridėkite jį prie teksto objekto ir nustatykite teksto objektą informacijai rodyti.

Pabandykite paleisti žaidimą su valdikliu, kuris palaiko "DirectInput". Kiekvieną informaciją galima gauti.

Priklausomai nuo valdiklio, paspaudę lazdą, rodyklės klavišą ir pan., galite negauti vertės, kaip numatyta. Kadangi mygtukai nėra apibrėžti tokiu būdu, sunku gauti tikslią kiekvieno mygtuko paspaudimo informaciją. Be to, matote, kad gana sunku visiškai palaikyti vairasvirtę, pavyzdžiui, mygtukų išdėstymas skiriasi priklausomai nuo valdiklio.

Jei žaidimas palaiko vairasvirtes, būtų pageidautina turėti nustatymo ekraną, pavyzdžiui, raktų konfigūraciją, kad kiekvienas vartotojas galėtų tinkinti turimo valdiklio mygtukų išdėstymą.

Kaip gauti informaciją apie kelias vairasvirtes

Informaciją apie Joystick.all visas prijungtas vairasvirtes galima gauti . ReadOnlyArray Jis foreach gali būti išvardytas ir pan.

Kadangi kiekviena vertė yra Joystick klasė, galite gauti vairasvirtės informaciją, kaip ir ankstesnėje programoje.