Darbība ar kursorsviru (ievades sistēmas iepakotā versija)

Lapa atjaunota :
Lapas izveides datums :

Verifikācijas vide

Windows
  • Operētājsistēmā Windows 11
Vienotības redaktors
  • 2020.3.25f1
Ievades sistēmas pakotnes
  • 1.2.0

Priekšnoteikumi šim padomam

Tālāk norādītie iestatījumi ir iepriekš konfigurēti kā priekšnosacījums šo padomu skaidrojumam.

Par XInput un DirectInput

Lai gan tas ir ierobežots ar Windows, spēļu kontrolieriem ir divi savienojuma formāti: "DirectInput" un "XInput". "Kursorsvira" šeit atbilst "DirectInput".

Šajā Joystick programmā mēs nodarbojamies ar klasi, bet tā var rīkoties tikai ar kontrolieriem, kas atbalsta "DirectInput". Lai izmantotu kontrolieri, kas atbalsta "XInput", jums jāizmanto cita Gamepad klase.

"DirectInput" ir vecs savienojuma formāts, un pogu definīcija ir salīdzinoši neskaidra, un tā var apstrādāt kontrolierus ar īpašām formām. Tomēr nesen "XInput" ir kļuvis par galveno, un palielinās to kontrolieru skaits, kuri neatbalsta "DirectInput". Tā kā "DirectInput" definē pogas kā "1", "2" un "3", spēļu veidotājiem ir jāizveido sistēma, kas ļauj atbilstoši iestatīt spēles un kontroliera pogu korespondenci.

"XInput" ir definēts kā nākamās paaudzes "DirectInput", un tam ir iepriekš definētas A un B pogas, trigeri, nūjas utt. Tāpēc var izmantot tikai kontroliera formu, kas ir gandrīz fiksēta. Tā kā pogu definīcija ir labi definēta, spēļu veidotāji var izveidot spēles, kas atbilst kontrolierim, neuztraucoties par pogu izvietojumu. Arvien vairāk jaunāko spēļu kontrolieru ir saderīgi tikai ar "XInput".

Par kursorsvirām

Kā minēts iepriekš, pogai nav definīcijas, tāpēc, lai to faktiski izmantotu, ir nepieciešams pievienot apgrūtinošus procesus, piemēram, spēļu operāciju piešķiršanu, pārbaudot katras pogas informāciju. Es nedomāju, ka jums ir jāizmanto DirectInput jaunā spēlē, jo tā ir veca, bet paturiet prātā, ka, ja jūs patiešām vēlaties to atbalstīt, jūsu programma var būt sarežģīta.

Šis paraugs būtībā aprobežojas ar informācijas iegūšanu par uzskaitītajām pogām. name Faktiski jums ir jāpārbauda un jāpiešķir operācijas.

Kursorsviras informācijas iegūšana

Novietojiet teksta objektu, lai parādītu informāciju par katru kursorsviras pogu.

Izveidojiet skriptu. Nosaukums ir patvaļīgs, bet šajā gadījumā JoystickInfo – tas ir .

Skripts izskatās šādi: Iegūtā informācija atšķiras atkarībā no kontroliera veida. Katram kontrolierim ir ļoti grūti programmēt, tāpēc es vienkārši uzskaitu visas pogas un saņemu pogas veidu un nospiežu informāciju.

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

Informāciju Joystick.current par pievienoto kursorsviru varat iegūt sadaļā . Joystick Pēc tam mēs saņemsim katru informāciju no klases.

Joystick Kā redzat no klases, ir tādas definīcijas kā un , stick trigger bet nav tādu definīciju kā A poga vai sākuma poga. Tāpēc jums vajadzētu izmantot rekvizītus, lai uzskaitītu visas pogas,allControls nūjas un uzzinātu pogas veidu un nospiestu informāciju.

Kad skripts ir saglabāts, EventSystem pievienojiet to un iestatiet teksta objektu informācijas parādīšanai.

Mēģiniet palaist spēli ar kontrolieri, kas atbalsta DirectInput. Katru informācijas daļu var izgūt.

Atkarībā no kontroliera jūs, iespējams, nesaņemsit vērtību, kā paredzēts, nospiežot nūju, bulttaustiņu utt. Tā kā pogas nav definētas šādā veidā, ir grūti iegūt precīzu nospiešanas informāciju par katru pogu. Turklāt jūs varat redzēt, ka ir diezgan grūti pilnībā atbalstīt kursorsviru, piemēram, pogu izvietojums atšķiras atkarībā no kontroliera.

Ja spēle ir paredzēta, lai atbalstītu kursorsviras, būtu vēlams, lai būtu iestatīšanas ekrāns, piemēram, taustiņu konfigurācija, lai katrs lietotājs varētu pielāgot sava kontroliera pogu izkārtojumu.

Kā iegūt informāciju par vairākām kursorsvirām

Informāciju par Joystick.all visām pievienotajām kursorsvirām var iegūt . ReadOnlyArray To foreach var uzskaitīt un tā tālāk.

Tā kā katra vērtība ir Joystick klase, jūs varat iegūt kursorsviras informāciju tāpat kā iepriekšējā programmā.