Beroperasi dengan Keyboard (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.

Tentukan saat tombol tertentu ditekan

Saat Anda menekan tombol, coba pindahkan objek. Tempatkan objek teks di Canvas untuk mengonfirmasi pemindahan. Ukuran dan posisinya bisa sesuai.

Penanganan keyboard dilakukan oleh skrip. KeyboardOneFrame Dalam hal ini, kami membuatnya sebagai file .

Kodenya terlihat seperti ini:

using UnityEngine;
using UnityEngine.UI;           // 追加
using UnityEngine.InputSystem;  // 追加

public class KeyboardOneFrame : MonoBehaviour
{
  /// <summary>移動させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

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

    // キーボードの情報を取得
    var keyboard = Keyboard.current;
    if (keyboard == null)
    {
      Debug.Log("キーボードがありません。");
      return;
    }

    var transform = TextObject.transform;

    // wasPressedThisFrame は押した瞬間のみ true となる
    // キーは「keyboard[Key.RightArrow]」のような指定の仕方もある
    if (keyboard.leftArrowKey.wasPressedThisFrame)
    {
      transform.Translate(-1, 0, 0);
    }
    if (keyboard.rightArrowKey.wasPressedThisFrame)
    {
      transform.Translate(1, 0, 0);
    }
    if (keyboard.upArrowKey.wasPressedThisFrame)
    {
      transform.Translate(0, 1, 0);
    }
    if (keyboard.downArrowKey.wasPressedThisFrame)
    {
      transform.Translate(0, -1, 0);
    }
  }
}

Keyboard.current Anda bisa mendapatkan tombol keyboard saat ini, status tekan, dll. dari . keyboard.xxxxxxx.wasPressedThisFrame Hanya true mengembalikan waktu saat tombol ditekan. Dalam kode ini, saat tombol kursor ditekan, operasi Move dilakukan pada objek transform Text . Karena diproses hanya pada saat menekan, gerakan tidak berlanjut bahkan jika tombol ditekan.

Setelah EventSystem menyimpan skrip, lampirkan ke objek KeyboardOneFrame dan klik Atur objek teks yang akan dipindahkan ke objek Teks.

Coba jalankan game dan periksa apakah tanda @ bergerak saat Anda menekan tombol kursor. Juga, pastikan bahwa menahan tombol tidak memindahkan simbol @.

Jenis kunci apa yang dapat ditentukan?

Itu tertulis di situs web resmi, jadi silakan periksa di sana.

Menentukan saat kunci tertentu dirilis

Kami tidak membuat sampel, tetapi saat Anda menekannya ditentukan oleh properti, sedangkan saat wasPressedThisFrame wasReleasedThisFrame Anda melepaskannya dapat dinilai oleh .

Menentukan sambil menekan tombol tertentu

Ini juga ditentukan oleh naskah. Anda dapat menambahkannya ke kode sebelumnya, tetapi kali ini kita akan membuat file skrip baru bernama dan menulisnya KeyboardPress .

Skripnya terlihat seperti ini:

using UnityEngine;
using UnityEngine.UI;           // 追加
using UnityEngine.InputSystem;  // 追加

public class KeyboardPress : MonoBehaviour
{
  /// <summary>回転させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

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

    // キーボードの情報を取得
    var keyboard = Keyboard.current;
    if (keyboard == null)
    {
      Debug.Log("キーボードがありません。");
      return;
    }

    var transform = TextObject.transform;

    // isPressed は押している間はずっと true となる
    // キーは「Keyboard.current[Key.Space]」のような指定の仕方もある
    if (keyboard.spaceKey.isPressed)
    {
      transform.Rotate(0, 0, 1);
    }
  }
}

Saat bilah spasi ditekan, objek teks diputar. keyboard.xxxxxxxx.isPressed kembali untuk seluruh true durasi kunci.

Lampirkan skrip yang EventSystem disimpan ke Objek Teks dan atur objek teks yang akan diputar.

Pastikan simbol @ berputar sepenuhnya saat game berjalan dan tahan bilah spasi.

Dapatkan semua tombol yang ditekan

Cobalah untuk menampilkan semua tombol yang Anda tekan sebagai teks. Anda telah menempatkan objek teks untuk menampilkan tombol yang Anda tekan.

KeyboardAllKeys Buat skrip dengan nama .

Skripnya terlihat seperti ini:

using System.Linq;
using UnityEngine;
using UnityEngine.InputSystem;  // 追加
using UnityEngine.UI;           // 追加

public class KeyboardAllKeys : MonoBehaviour
{
  /// <summary>移動させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

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

    // キーボードの情報を取得
    var keyboard = Keyboard.current;
    if (keyboard == null)
    {
      Debug.Log("キーボードがありません。");
      TextObject.text = "";
      return;
    }

    // allKeys からすべてのキーの情報を走査し isPressed で押しているキーのみを抽出する
    TextObject.text = string.Join(", ", keyboard.allKeys.Where(x => x.isPressed).Select(x => x.keyCode.ToString()));
  }
}

keyboard.allKeys memungkinkan Anda mendapatkan informasi tentang semua kunci. Anda hanya dapat mengekstrak yang benar dari isPressed tombol tersebut dan hanya mengambil tombol yang Anda tekan. Setelah itu, tombol yang Anda tekan diubah menjadi string dan ditampilkan sebagai teks.

Skrip EventSystem yang dibuat menempel dan mengatur objek teks untuk menampilkan tombol penekan.

Jalankan game dan verifikasi bahwa tombol yang Anda tekan muncul.

Omong-omong, meskipun Anda menekan banyak tombol, semua tombol mungkin tidak ditampilkan, tetapi jangan khawatir karena ini adalah masalah fisik karena kabel keyboard.

Mendapatkan karakter yang diketik

Sampai sekarang, Anda mendapatkan jenis tombol yang Anda tekan, tetapi juga mungkin untuk mendapatkan karakter yang benar-benar Anda ketik. Misalnya, jika tombol "A" ditekan, huruf "a" dapat diperoleh, dan jika tombol "Shift + A" ditekan, huruf "A" dapat diperoleh. Jika IME diaktifkan, Anda mungkin juga dapat mengambil bahasa Jepang.

Namun, karakter yang dimasukkan ini tidak dapat diambil di properti dan akan diperoleh dalam bentuk peristiwa.

Dalam sampel, objek teks ditempatkan untuk menampilkan karakter yang dimasukkan.

Buat skrip. KeyboardTextInput Namanya .

Masukkan skrip sebagai berikut:

using UnityEngine;
using UnityEngine.InputSystem;  // 追加
using UnityEngine.UI;           // 追加

public class KeyboardTextInput : MonoBehaviour
{
  /// <summary>移動させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  /// <summary>
  /// オブジェクトが有効になったときに呼ばれるイベント。
  /// </summary>
  public void OnEnable()
  {
    // 文字が入力されたときに呼ばれるイベントをセット
    Keyboard.current.onTextInput += OnTextInput;
  }

  /// <summary>
  /// オブジェクトが無効になったときに呼ばれるイベント。
  /// </summary>
  public void OnDisable()
  {
    // 文字が入力されたときに呼ばれるイベントを解除
    Keyboard.current.onTextInput -= OnTextInput;
  }

  /// <summary>
  /// 文字を入力するたびに呼ばれる。
  /// </summary>
  /// <param name="c">入力された文字。</param>
  public void OnTextInput(char c)
  {
    TextObject.text += c;
  }
}

KeyboardKelas onTextInput memiliki acara yang disebut , yang dipanggil setiap kali teks dimasukkan. OnEnable Di sini, metode terdaftar pada waktu danOnDisable dibatalkan pada OnTextInput OnTextInput waktu . Keyboard.current adalah objek unik yang ada sejak game dijalankan hingga dihentikan, jadi OnDisable pastikan untuk melepaskannya pada waktu . Jika Anda selalu dapat memasangkan pendaftaran dan pembatalan acara, Anda dapat mengaturnya di lain waktu.

OnTextInput Dalam metode ini, karakter yang dimasukkan ditetapkan sebagai argumen c , sehingga ditambahkan sebagai teks.

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

Coba jalankan game dan tekan tombol. Anda akan melihat karakter yang dimasukkan. Jika Anda menekannya bersamaan dengan tombol Shift, Anda seharusnya dapat memasukkan huruf kapital dan simbol. Anda juga dapat memasukkan bahasa Jepang jika IME diaktifkan. Di sisi lain, jika Anda menekan tombol non-karakter seperti tombol kursor, tidak akan terjadi apa-apa.