Mengontrol dengan Gamepad (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 dibuat sebelumnya sebagai premis untuk deskripsi tip ini.

Tentang XInput dan DirectInput

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

Program ini berkaitan dengan kelas, tetapi ini Gamepad hanya dapat menangani pengontrol yang mendukung "XInput". Untuk menggunakan controller yang mendukung DirectInput, Anda perlu menggunakan kelas yang berbeda Joystick .

"DirectInput" adalah format koneksi lama dan definisi tombolnya 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. "DirectInput" memiliki definisi tombol seperti "1", "2", dan "3", sehingga pembuat game harus membuat korespondensi tombol antara game dan pengontrol sehingga dapat diatur dengan tepat.

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

Menentukan apakah tombol sedang ditekan

Anda dapat menentukan apakah tombol ditekan atau tidak oleh properti serta xxxxxxxx.isPressed keyboard dan mouse. Di sini, saya ingin menampilkan jenis tombol yang saya tekan dalam teks.

Pertama, tempatkan objek teks tampilan.

Buat skrip untuk putusan. Nama file sewenang-wenang, tetapi ini GamepadButtons dia .

Skripnya terlihat seperti ini:

using System.Text;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class GamepadButtons : 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 gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // ボタンを押している間は xxxxxxxx.isPressed が true を返します

    // B ボタンや East ボタン、○ボタンは読み方が違うだけで同じボタンです
    // これは PlayStation や Xbox, Switch などでボタンの読み方が違うためです
    if (gamepad.aButton.isPressed) Builder.AppendLine($"A");
    if (gamepad.bButton.isPressed) Builder.AppendLine($"B");
    if (gamepad.xButton.isPressed) Builder.AppendLine($"X");
    if (gamepad.yButton.isPressed) Builder.AppendLine($"Y");

    if (gamepad.buttonEast.isPressed) Builder.AppendLine($"East");
    if (gamepad.buttonWest.isPressed) Builder.AppendLine($"West");
    if (gamepad.buttonNorth.isPressed) Builder.AppendLine($"North");
    if (gamepad.buttonSouth.isPressed) Builder.AppendLine($"South");

    if (gamepad.circleButton.isPressed) Builder.AppendLine($"Circle");
    if (gamepad.crossButton.isPressed) Builder.AppendLine($"Cross");
    if (gamepad.triangleButton.isPressed) Builder.AppendLine($"Triangle");
    if (gamepad.squareButton.isPressed) Builder.AppendLine($"Square");

    // コントローラーの中央にあるスタートボタン、セレクトボタン、メニューボタン、ビューボタンなどに該当します。
    if (gamepad.startButton.isPressed) Builder.AppendLine($"Start");
    if (gamepad.selectButton.isPressed) Builder.AppendLine($"Select");

    // 左と右のスティックをまっすぐ押し込んだかどうかを判定します
    if (gamepad.leftStickButton.isPressed) Builder.AppendLine($"LeftStickButton");
    if (gamepad.rightStickButton.isPressed) Builder.AppendLine($"RightStickButton");

    // 左上と右上にあるボタン。PlayStation だと L1 や R1 に該当します
    if (gamepad.leftShoulder.isPressed) Builder.AppendLine($"LeftShoulder");
    if (gamepad.rightShoulder.isPressed) Builder.AppendLine($"RightShoulder");

    // 押しているボタン一覧をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

Setelah EventSystem Anda menyimpan skrip, lampirkan ke dan konfigurasikan objek teks tampilan.

Coba jalankan game dan lihat apakah setiap tombol merespons.

Omong-omong, tombol-tombol berikut didefinisikan sebagai tombol yang sama, meskipun beberapa tombol disiapkan karena dibaca secara berbeda tergantung pada konsol game. Di masing-masing program di atas, proses penilaian disertakan, jadi ketika Anda menekan tombol, tiga tombol ditampilkan.

Xbox, PlayStation , dan lainnya
bTombol Tombol lingkaran tombolTimur
aTombol Tombol silang tombolSelatan
xTombol Tombol persegi buttonWest
Tombol y segitigaTombol tombolUtara

Apa yang bisa dinilai sebagai tombol adalah sebagai berikut.

  • Tombol, tombol ×, tombol bawah
  • Tombol B, tombol ○, tombol kanan
  • Tombol X, Tombol □, Tombol Kiri
  • Tombol Y, tombol Panah Bawah, tombol Atas
  • Tombol Mulai, tombol Menu
  • Pilih Tombol, Tombol Lihat
  • Tombol bahu kiri, tombol L1
  • Tombol bahu kanan, tombol R1
  • Tombol stik kiri
  • Tombol tongkat kanan

Menentukan apakah tombol ditekan

Penilaian pada saat pers dapat ditentukan oleh properti seperti pada xxxxxxxx.wasPressedThisFrame keyboard dan mouse. Mengembalikan nilai saat true ditekan, dan mengembalikan meskipun false ditekan dan ditahan setelahnya.

Mari kita tampilkan tombol yang ditekan sebagai teks sebagai pemeriksaan operasi. Tempatkan objek teks untuk ditampilkan.

Nama file skrip bisa apa saja, tapi ini GamepadButtonsOneFrame dia .

Skripnya terlihat seperti ini: Untuk mempermudah, hanya 4 tombol yang dinilai.

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class GamepadButtonsOneFrame : MonoBehaviour
{
  /// <summary>情報を表示させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    if (TextObject == null)
    {
      Debug.Log($"{nameof(TextObject)} が null です。");
      return;
    }

    // 1つ目のゲームパッドの情報を取得
    var gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    // ボタンが押された瞬間かどうかを判定
    if (gamepad.aButton.wasPressedThisFrame) TextObject.text += "A";
    if (gamepad.bButton.wasPressedThisFrame) TextObject.text += "B";
    if (gamepad.xButton.wasPressedThisFrame) TextObject.text += "X";
    if (gamepad.yButton.wasPressedThisFrame) TextObject.text += "Y";
  }
}

Setelah EventSystem menyimpan skrip, lampirkan ke dan atur objek teks untuk ditampilkan.

Coba jalankan game dan tekan tombol. Saya pikir tombol yang Anda tekan akan ditambahkan. Anda juga dapat melihat bahwa menahan tombol tidak menambahkan teks apa pun.

Menentukan apakah saat tombol dilepaskan

Tidak ada sampel, tetapi Anda dapat menentukan apakah ini saat wasPressedThisFrame Anda melepaskannya dengan menggunakan properti, bukan wasReleasedThisFrame properti.

Menentukan kapan Anda menekan tombol panah

Menentukan pers DPAD. Tergantung pada konsol game, itu akan terbang dengan tombol panah dan D-pad, tetapi keduanya diperlakukan sama. DPAD pada dasarnya hanya menentukan apakah Anda mendorong ke arah itu atau tidak. Tidak ada penilaian seperti "mendorong sedikit" seperti tongkat.

Menempatkan objek teks untuk menampilkan keputusan apakah ditekan atau tidak sebagai pemeriksaan operasi.

Buat skrip. Nama file sewenang-wenang, tetapi ini GamepadDpad dia .

Skripnya terlihat seperti ini:

using System.Text;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class GamepadDpad : 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 gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // Dpad の押下情報を Vector2 として取得するパターン
    var value = gamepad.dpad.ReadValue();
    Builder.Append($"(x:{value.x}, y:{value.y})");

    // Dpad の各方向のボタンを押しているかどうかの判定
    if (gamepad.dpad.left.isPressed) Builder.Append(" left");
    if (gamepad.dpad.right.isPressed) Builder.Append(" right");
    if (gamepad.dpad.up.isPressed) Builder.Append(" up");
    if (gamepad.dpad.down.isPressed) Builder.Append(" down");

    // Dpad の情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

Anda bisa mendapatkan informasi Gamepad.dpad DPAD di .

DPAD memiliki leftupdown rightproperti untuk setiap arah, dan Anda dapat menentukan apakah ditekan atau tidak oleh properti dll. isPressed

DpadControl.ReadValue Anda juga dapat menggunakan metode ini untuk mendapatkan status Vector2 pers di . Jika tidak ada yang ditekan (0, 0), jika kiri ditekan (-1, 0), dan seterusnya.

Setelah EventSystem menyimpan skrip, lampirkan ke dan atur objek teks untuk ditampilkan.

Coba jalankan game dan berinteraksi dengan DPAD.

Vector2 Ngomong-ngomong, dalam keadaan normal, jadi ketika Anda menekan secara diagonal, itu diperoleh sebagai angka seperti (0, 7071, 0, 7071) bukan (1, 1).

Menentukan penekanan pemicu

Pengontrol Xbox memiliki tombol yang disebut pemicu di kiri dan kanan. Di PlayStation, ini sesuai dengan L2R2. Tombol ini berbeda dari tombol normal, dan Anda bisa mendapatkan jumlah yang Anda tekan 0,0 ~ 1,0. Beberapa pengontrol lain dilengkapi dengan nama selain pemicu, tetapi pada pengontrol yang lebih tua, dll., Mereka hanya dapat ditempatkan sebagai tombol, dalam hal ini penilaian penekanan ditangani hanya sebagai 0, 1.

Di sini, saya ingin memeriksa jumlah penekanan pemicu. Menempatkan objek teks untuk ditampilkan di Canvas.

Buat skrip. Karena akan digunakan di tempat lain, kami akan menamainya di sini GamepadReadValue .

Skripnya terlihat seperti ini:

using System.Text;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class GamepadReadValue : 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 gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // トリガーの押下量を取得
    Builder.AppendLine($"LeftTrigger:{gamepad.leftTrigger.ReadValue()}");
    Builder.AppendLine($"RightTrigger:{gamepad.rightTrigger.ReadValue()}");

    // 情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

Gamepad Setiap leftTriggerkelas memiliki properti dan rightTrigger ReadValue Anda bisa mendapatkan jumlah penekanan dalam kisaran 0,0 ~ 1,0 dengan memanggil metode. Pemicu juga dapat diperlakukan sebagai tombol, sehingga isPressed Anda juga dapat menilai seperti. isPressed true Omong-omong, jumlah menjadi ReadValue didasarkan pada 0, 5.

Setelah menyimpan skrip, EventSystem lampirkan ke dan atur objek teks untuk ditampilkan.

Coba jalankan game dan pindahkan pelatuknya.

Menentukan informasi tongkat

Tongkat bisa mendapatkan informasi dari tongkat kiri dan tongkat kanan masing-masing, dan Anda bisa mendapatkan jumlah berapa banyak tongkat didorong ke bawah ke arah mana. Tentu saja, jika Anda tidak memiliki tongkat di pengontrol Anda, Anda tidak akan bisa mendapatkan informasi ini.

Informasi tongkat dapat diambil dengan , Gamepad.rightStick masing-masingGamepad.leftStick.

Untuk skrip konfirmasi operasi, kami akan mengalihkan skrip yang digunakan sebelumnya untuk mendapatkan pemicu.

// 省略

public class GamepadReadValue : MonoBehaviour
{
  // 省略

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    // 省略

    // トリガーの押下量を取得
    Builder.AppendLine($"LeftTrigger:{gamepad.leftTrigger.ReadValue()}");
    Builder.AppendLine($"RightTrigger:{gamepad.rightTrigger.ReadValue()}");

    // スティックの入力を取得
    var leftStickValue = gamepad.leftStick.ReadValue();
    Builder.AppendLine($"LeftStick:{leftStickValue.normalized * leftStickValue.magnitude}");
    var rightStickValue = gamepad.rightStick.ReadValue();
    Builder.AppendLine($"RightStick:{rightStickValue.normalized * rightStickValue.magnitude}");

    // 情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

leftStickrightStick Anda bisa mendapatkan informasi pers dengan memanggil metode dari Vector2 ReadValue atau . Vector2 Jadi Anda bisa mendapatkan seberapa x y banyak Anda menekan sumbu X dan sumbu Y dengan dan properti, Jika Anda ingin mendapatkan arah yang Anda tekan, Anda bisa mendapatkannya di properti, dan jika Anda ingin mendapatkan jumlah yang Anda tekan, Anda magnitude normalized bisa mendapatkannya di properti.

Cobalah untuk benar-benar memindahkan permainan dan mengoperasikan tongkat.

Mendapatkan informasi gamepad

Anda bisa mendapatkan ID, nama, dll. dari gamepad yang terhubung. Misalnya, lihat untuk mengidentifikasi name jenis pengontrol yang terhubung, atau Anda dapat merujuk ke gamepad mana yang deviceId akan dikaitkan ketika beberapa gamepad terhubung.

Di sini, kami akan menampilkan informasi dalam teks untuk memeriksa operasi.

Nama skrip sewenang-wenang, tetapi ini GamepadInfo dia .

Skripnya terlihat seperti ini:

using System.Text;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class GamepadInfo : 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 gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // ゲームパッドの各情報を取得
    Builder.AppendLine($"deviceId:{gamepad.deviceId}");
    Builder.AppendLine($"name:{gamepad.name}");
    Builder.AppendLine($"displayName:{gamepad.displayName}");
    Builder.AppendLine($"shortDisplayName:{gamepad.shortDisplayName}");
    Builder.AppendLine($"path:{gamepad.path}");
    Builder.AppendLine($"layout:{gamepad.layout}");

    // 情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

Gamepad Anda bisa mendapatkan berbagai informasi dari file . Berikut beberapa kutipannya.

Setelah menyimpan skrip, EventSystem lampirkan ke dan atur objek teks untuk ditampilkan.

Coba jalankan game untuk melihat apakah informasinya muncul.