Pengoperasian dengan joystick (versi paket Sistem Input)

Halaman Diperbarui :
Tanggal pembuatan halaman :

Lingkungan verifikasi

Windows
  • jendela 11
Editor Kesatuan
  • 25f1/3/2020
Paket Sistem Input
  • 1.2.0

Prasyarat untuk tip ini

Pengaturan berikut telah dikonfigurasi sebelumnya sebagai prasyarat untuk penjelasan tips ini.

Tentang XInput dan DirectInput

Meskipun terbatas pada Windows, ada dua format koneksi untuk pengontrol game: "DirectInput" dan "XInput". "Joystick" di sini sesuai dengan "DirectInput".

Dalam Joystick program ini, kita berurusan dengan kelas, tetapi hanya dapat menangani pengontrol yang mendukung "DirectInput". Untuk menggunakan pengontrol yang mendukung "XInput", Anda perlu menggunakan kelas yang berbeda Gamepad .

"DirectInput" adalah format koneksi lama, dan definisi tombol relatif ambigu, dan dapat menangani pengontrol dengan bentuk khusus. Namun, baru-baru ini, "XInput" telah menjadi arus utama, dan jumlah pengontrol yang tidak mendukung "DirectInput" meningkat. Karena "DirectInput" mendefinisikan tombol sebagai "1", "2", dan "3", pembuat game harus membuat sistem yang memungkinkan korespondensi tombol game dan pengontrol diatur dengan tepat.

"XInput" didefinisikan sebagai generasi berikutnya dari "DirectInput" dan telah menentukan tombol A dan B, pemicu, tongkat, dll. Oleh karena itu, bentuk pengontrol hanya dapat digunakan, yang hampir tetap. Karena definisi tombol didefinisikan dengan baik, pembuat game dapat membuat game yang sesuai dengan pengontrol tanpa khawatir tentang penempatan tombol. Semakin banyak pengontrol game terbaru hanya kompatibel dengan "XInput".

Tentang joystick

Seperti disebutkan di atas, tidak ada definisi tombol, jadi untuk benar-benar menggunakannya, perlu menambahkan proses yang merepotkan seperti menetapkan operasi game sambil memeriksa informasi dari setiap tombol. Saya tidak berpikir Anda perlu menggunakan DirectInput dalam permainan baru karena sudah tua, tetapi perlu diingat bahwa jika Anda benar-benar ingin mendukungnya, program Anda bisa rumit.

Sampel ini pada dasarnya terbatas untuk mendapatkan informasi tentang tombol yang terdaftar. name Bahkan, Anda perlu memeriksa dan menetapkan operasi.

Akuisisi Informasi Joystick

Tempatkan objek teks untuk menampilkan informasi tentang setiap tombol pada joystick.

Buat skrip. Namanya sewenang-wenang, tetapi dalam kasus JoystickInfo ini , itu adalah .

Skripnya terlihat seperti ini: Informasi yang diperoleh bervariasi tergantung pada jenis pengontrol. Sangat sulit untuk memprogram untuk setiap pengontrol, jadi saya hanya menghitung semua tombol dan mendapatkan jenis tombol dan menekan informasi.

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

Anda bisa mendapatkan informasi Joystick.current tentang joystick yang terhubung di . Joystick Setelah itu, kita akan mendapatkan setiap informasi dari kelas.

Joystick Seperti yang Anda lihat dari kelas, ada definisi seperti dan , stick trigger tetapi tidak ada definisi seperti tombol A atau tombol mulai. Oleh karena itu, Anda harus menggunakan Properties untuk menghitung semua tombol, tongkat,allControls dan mencari tahu jenis tombol dan informasi tekan.

Setelah skrip disimpan, EventSystem lampirkan ke dan atur objek teks untuk menampilkan informasi.

Coba jalankan game dengan pengontrol yang mendukung DirectInput. Setiap informasi dapat diambil.

Tergantung pada pengontrol, Anda mungkin tidak mendapatkan nilai sebagaimana dimaksud ketika Anda menekan tongkat, tombol panah, dll. Karena tombol tidak didefinisikan dengan cara ini, sulit untuk mendapatkan informasi pers yang akurat untuk setiap tombol. Selain itu, Anda dapat melihat bahwa cukup sulit untuk sepenuhnya mendukung joystick, seperti pengaturan tombol berbeda tergantung pada pengontrol.

Jika gim ini mendukung joystick, akan diinginkan untuk memiliki layar pengaturan seperti konfigurasi tombol sehingga setiap pengguna dapat menyesuaikan tata letak tombol pengontrol yang mereka miliki.

Cara mendapatkan informasi untuk beberapa joystick

Informasi tentang Joystick.all semua joystick yang terhubung dapat diperoleh di . ReadOnlyArray Itu foreach dapat disebutkan dalam dan seterusnya.

Karena setiap nilai adalah Joystick kelas, Anda bisa mendapatkan informasi joystick seperti pada program sebelumnya.