Operasi dengan kayu bedik (Versi pakej Sistem Input)

Laman dikemaskini :
Tarikh penciptaan halaman :

Persekitaran pengesahan

Windows
  • Windows 11
Penyunting Perpaduan
  • 2020.3.25f1
Pakej Sistem Input
  • 1.2.0

Prasyarat untuk petua ini

Tetapan berikut telah diprakonfigurasi sebagai prasyarat untuk penjelasan petua ini.

Mengenai XInput dan DirectInput

Walaupun terhad kepada Windows, terdapat dua format sambungan untuk pengawal permainan: "DirectInput" dan "XInput". "Joystick" di sini sepadan dengan "DirectInput".

Dalam Joystick program ini, kita berurusan dengan kelas, tetapi ia hanya boleh mengendalikan pengawal yang menyokong "DirectInput". Untuk menggunakan pengawal yang menyokong "XInput", anda perlu menggunakan kelas yang berbeza Gamepad .

"DirectInput" adalah format sambungan lama, dan definisi butang agak samar-samar, dan ia boleh mengendalikan pengawal dengan bentuk khas. Walau bagaimanapun, baru-baru ini, "XInput" telah menjadi arus perdana, dan bilangan pengawal yang tidak menyokong "DirectInput" semakin meningkat. Oleh kerana "DirectInput" mentakrifkan butang sebagai "1", "2", dan "3", pencipta permainan mesti membuat sistem yang membolehkan surat-menyurat butang permainan dan pengawal ditetapkan dengan sewajarnya.

"XInput" ditakrifkan sebagai generasi seterusnya "DirectInput" dan telah menentukan butang A dan B, pencetus, tongkat, dll. Oleh itu, bentuk pengawal hanya boleh digunakan, yang hampir tetap. Oleh kerana definisi butang ditakrifkan dengan baik, pencipta permainan boleh membuat permainan yang sepadan dengan pengawal tanpa perlu risau tentang penempatan butang. Peningkatan bilangan pengawal permainan baru-baru ini hanya serasi dengan "XInput".

Tentang Kayu Bedik

Seperti yang dinyatakan di atas, tidak ada definisi butang, jadi untuk benar-benar menggunakannya, perlu menambah proses yang menyusahkan seperti menetapkan operasi permainan semasa memeriksa maklumat setiap butang. Saya rasa anda tidak perlu menggunakan DirectInput dalam permainan baru kerana sudah lama, tetapi perlu diingat bahawa jika anda benar-benar ingin menyokongnya, program anda boleh menjadi rumit.

Sampel ini pada dasarnya terhad untuk mendapatkan maklumat mengenai butang yang disenaraikan. name Malah, anda perlu menyemak dan menetapkan operasi.

Pemerolehan Maklumat Joystick

Letakkan objek teks untuk memaparkan maklumat tentang setiap butang pada kayu bedik.

Buat skrip. Nama itu sewenang-wenangnya, tetapi dalam kes JoystickInfo ini , ia adalah .

Skrip kelihatan seperti ini: Maklumat yang diperoleh berbeza-beza bergantung pada jenis pengawal. Sangat sukar untuk diprogramkan untuk setiap pengawal, jadi saya hanya menghitung semua butang dan mendapatkan jenis butang dan tekan maklumat.

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 boleh mendapatkan maklumat Joystick.current mengenai kayu bedik yang disambungkan dalam . Joystick Selepas itu, kami akan mendapat setiap maklumat dari kelas.

Joystick Seperti yang anda lihat dari kelas, terdapat definisi seperti dan , stick trigger tetapi tidak ada definisi seperti butang A atau butang mula. Oleh itu, anda harus menggunakan Properties untuk menghitung semua butang, tongkat,allControls dan mengetahui jenis butang dan tekan maklumat.

Setelah skrip disimpan, EventSystem lampirkannya dan setkan objek teks untuk memaparkan maklumat.

Cuba jalankan permainan dengan pengawal yang menyokong DirectInput. Setiap maklumat boleh diambil.

Bergantung pada pengawal, anda mungkin tidak mendapat nilai seperti yang dimaksudkan apabila anda menekan tongkat, kekunci anak panah, dll. Oleh kerana butang tidak ditakrifkan dengan cara ini, sukar untuk mendapatkan maklumat akhbar yang tepat untuk setiap butang. Di samping itu, anda dapat melihat bahawa agak sukar untuk menyokong sepenuhnya kayu bedik, seperti susunan butang berbeza bergantung pada pengawal.

Sekiranya permainan ini menyokong kayu bedik, adalah wajar untuk mempunyai skrin tetapan seperti konfigurasi utama supaya setiap pengguna dapat menyesuaikan susun atur butang pengawal yang mereka miliki.

Bagaimana untuk mendapatkan maklumat untuk pelbagai kayu bedik

Maklumat mengenai Joystick.all semua kayu bedik yang disambungkan boleh didapati di . ReadOnlyArray Ia foreach boleh dihitung dan sebagainya.

Oleh kerana setiap nilai adalah Joystick kelas, anda boleh mendapatkan maklumat kayu bedik seperti dalam program sebelumnya.