Beroperasi dengan Papan Kekunci (Versi Pakej Sistem Input)
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;
}
}
Keyboard
Kelas 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.