Beroperasi dengan Papan Kekunci (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 dibuat terlebih dahulu sebagai premis untuk penerangan petua ini.

Tentukan masa kekunci tertentu ditekan

Apabila anda menekan kekunci, cuba alihkan objek. Letakkan objek teks dalam Kanvas untuk mengesahkan pengalihan. Saiz dan kedudukan boleh sesuai.

Pengendalian papan kekunci dilakukan oleh skrip. KeyboardOneFrame Dalam kes ini, kita menciptanya sebagai .

Kod kelihatan 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 boleh mendapatkan status tekan kekunci papan kekunci semasa dan lain-lain daripada . keyboard.xxxxxxx.wasPressedThisFrame Mengembalikan masa masa sahaja true kekunci ditekan. Dalam kod ini, sebaik sahaja kekunci kursor ditekan, operasi Move dilakukan pada objek transform Teks . Oleh kerana ia diproses hanya pada saat menekan, pergerakan tidak berterusan walaupun kunci ditekan.

Selepas EventSystem menyimpan skrip, lampirkan pada objek KeyboardOneFrame dan klik Mengesetkan objek teks untuk dialihkan ke objek Teks.

Cuba jalankan permainan dan semak sama ada @ tanda bergerak apabila anda menekan kekunci kursor. Juga, pastikan bahawa menahan kekunci tidak menggerakkan simbol @.

Apakah jenis kekunci yang boleh ditentukan?

Ia ditulis di laman web rasmi, jadi sila semak di sana.

Tentukan masa kunci tertentu dikeluarkan

Kami tidak membuat sampel, tetapi apabila wasPressedThisFrame anda menekannya ditentukan oleh harta itu, sementara saat wasReleasedThisFrame anda melepaskannya boleh dinilai oleh .

Tentukan semasa menekan kekunci tertentu

Ini juga ditentukan oleh skrip. Anda boleh menambahnya ke kod sebelumnya, tetapi kali ini kami akan membuat fail skrip baru yang dipanggil dan menulisnya KeyboardPress .

Skrip kelihatan 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);
    }
  }
}

Semasa bar ruang ditekan, objek teks diputar. keyboard.xxxxxxxx.isPressed Mengembalikan sepanjang true tempoh kekunci.

Lampirkan EventSystem skrip yang disimpan pada Objek Teks dan setkan objek teks untuk diputar.

Pastikan simbol @ berputar sepanjang jalan semasa permainan berjalan dan memegang bar ruang.

Dapatkan semua kekunci yang ditekan

Cuba paparkan semua kekunci yang anda tekan sebagai teks. Anda telah meletakkan objek teks untuk memaparkan kekunci yang anda tekan.

KeyboardAllKeys Buat skrip dengan nama .

Skrip kelihatan 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 membolehkan anda mendapatkan maklumat mengenai semua kekunci. Anda boleh mengeluarkan hanya kekunci yang benar dari isPressed kekunci tersebut dan hanya mengambil kunci yang anda tekan. Selepas itu, kekunci yang anda tekan ditukar kepada rentetan dan dipaparkan sebagai teks.

Skrip EventSystem yang dicipta melampirkan dan mengesetkan objek teks untuk memaparkan kekunci menekan.

Jalankan permainan dan sahkan bahawa kekunci yang anda tekan muncul.

Dengan cara ini, walaupun anda menekan banyak kekunci, semua kekunci mungkin tidak dipaparkan, tetapi jangan risau kerana ia adalah masalah fizikal kerana pendawaian papan kekunci.

Dapatkan aksara yang ditaip

Sehingga kini, anda mendapat jenis kekunci yang anda tekan, tetapi anda juga boleh mendapatkan aksara yang sebenarnya anda taip. Sebagai contoh, jika kekunci "A" ditekan, huruf "a" boleh diperolehi, dan jika kekunci "Shift + A" ditekan, huruf "A" boleh diperolehi. Jika IME didayakan, anda juga mungkin boleh mendapatkan semula bahasa Jepun.

Walau bagaimanapun, aksara yang dimasukkan ini tidak boleh diambil dalam sifat dan akan diperoleh dalam bentuk peristiwa.

Dalam sampel, objek teks diletakkan untuk memaparkan aksara yang dimasukkan.

Buat skrip. KeyboardTextInput Nama itu ialah .

Masukkan skrip seperti 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 ini onTextInput mempunyai acara yang dipanggil , yang dipanggil apabila teks dimasukkan. OnEnable Di sini, kaedah ini didaftarkan pada masa danOnDisable dibatalkan pada OnTextInput OnTextInput masa . Keyboard.current adalah objek unik yang wujud dari masa permainan dilaksanakan sehingga ia ditamatkan, jadi OnDisable pastikan anda melepaskannya pada masa . Jika anda sentiasa boleh menggandingkan pendaftaran acara dan pembatalan, anda boleh menetapkannya pada bila-bila masa lain.

OnTextInput Dalam kaedah ini, watak yang dimasukkan ditetapkan sebagai hujah c , jadi ia ditambah sebagai teks.

Selepas EventSystem menyimpan skrip, lampirkannya dan tetapkan objek teks untuk paparan.

Cuba jalankan permainan dan tekan kunci. Anda sepatutnya melihat watak-watak yang dimasukkan. Jika anda menekannya pada masa yang sama dengan kekunci Shift, anda sepatutnya boleh memasukkan huruf besar dan simbol. Anda juga boleh memasukkan bahasa Jepun jika IME didayakan. Sebaliknya, jika anda menekan kekunci bukan aksara seperti kekunci kursor, tiada apa yang akan berlaku.