Робота з клавіатурою (версія пакета системи вводу)
Середовище перевірки
- Вікна
-
- вікна 11
- Редактор єдності
-
- 2020.3.25f1
- Пакет системи введення
-
- 1.2.0
Передумови для цієї поради
Наступні настройки були зроблені заздалегідь як передумова для опису цієї поради.
Визначте момент натискання конкретної клавіші
При натисканні клавіші спробуйте перемістити об'єкт. Помістіть текстовий об'єкт на полотно, щоб підтвердити переміщення. Розмір і положення можуть бути відповідними.
Обробка клавіатури здійснюється скриптами. KeyboardOneFrame
У цьому випадку ми створюємо його як .
Код виглядає так:
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
Ви можете отримати поточний стан натискання клавіші клавіатури тощо з .
keyboard.xxxxxxx.wasPressedThisFrame
Повертає лише true
час натискання клавіші.
У цьому коді, в момент натискання клавіші курсору, операція переміщення виконується над текстовим об'єктом transform
.
Так як він обробляється тільки в момент натискання, рух не продовжується навіть при натисканні клавіші.
Після EventSystem
збереження скрипта прикріпіть до об'єкта KeyboardOneFrame
і натисніть
Встановіть переміщення текстового об'єкта до об'єкта Текст.
Спробуйте запустити гру і перевірити, чи рухається знак @ при натисканні клавіші курсору. Також переконайтеся, що утримання клавіші не переміщує символ @.
Які типи ключів можна визначити?
Це написано на офіційному сайті, тому, будь ласка, перевірте там.
Визначення моменту відпускання конкретного ключа
Ми не створюємо зразок, але момент, коли ви його натискаєте, визначається властивістю, тоді як про момент, коли wasPressedThisFrame
wasReleasedThisFrame
ви його відпускаєте, можна судити за .
Визначення під час натискання певної клавіші
Це також визначається сценарієм. Ви можете додати його до попереднього коду, але цього разу ми створимо новий файл сценарію під назвою і запишемо його KeyboardPress
.
Сценарій виглядає так:
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);
}
}
}
Під час натискання пробілу текстовий об'єкт повертається.
keyboard.xxxxxxxx.isPressed
Повертає протягом усього true
терміну дії ключа.
Прикріпіть збережений EventSystem
сценарій до Text Object і встановіть текстовий об'єкт для обертання.
Переконайтеся, що символ @ обертається до кінця, поки гра запущена та утримує пробіл.
Отримати всі натиснуті клавіші
Спробуйте відобразити всі клавіші, які ви натискаєте, у вигляді тексту. Ви розмістили текстовий об'єкт для відображення клавіші, яку ви натискаєте.
KeyboardAllKeys
Створіть скрипт з ім'ям .
Сценарій виглядає так:
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
дозволяє отримати інформацію про всі ключі.
Ви можете витягти з цих клавіш лише ті, які є істинними isPressed
, і отримати лише ті клавіші, які ви натискаєте.
Після цього натискається клавіша перетворюється в рядок і відображається у вигляді тексту.
Створений EventSystem
скрипт приєднується і задає текстовий об'єкт для відображення клавіші натискання.
Запустіть гру і переконайтеся, що з'явилася клавіша, яку ви натискаєте.
До речі, навіть якщо ви натискаєте багато клавіш, всі клавіші можуть не відображатися, але не турбуйтеся про це, тому що це фізична проблема через проводку клавіатури.
Отримання введених символів
До цього часу ви отримували тип клавіші, яку ви натиснули, але також можна отримати символи, які ви насправді ввели. Наприклад, при натисканні клавіші «А» можна отримати букву «а», а при натисканні клавіші «Shift+A» можна отримати букву «А». Якщо редактор IME ввімкнуто, ви також можете отримати доступ до японської мови.
Однак ці введені символи не можуть бути отримані у властивостях і будуть придбані у вигляді подій.
У зразку розміщується текстовий об'єкт для відображення введених символів.
Створіть сценарій. KeyboardTextInput
Ім'я .
Введіть скрипт наступним чином:
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
Клас onTextInput
має подію з назвою , яка викликається кожного разу, коли вводиться текст.
OnEnable
Тут спосіб реєструється в терміни іOnDisable
скасовується в OnTextInput
OnTextInput
терміни .
Keyboard.current
є унікальним об'єктом, який існує з моменту виконання гри до її припинення, тому OnDisable
обов'язково випустіть його під час .
Якщо ви завжди можете поєднати реєстрацію та скасування події, ви можете встановити її в будь-який інший час.
OnTextInput
У методі введений символ задається як аргумент c
, тому він додається як текст.
Після EventSystem
збереження сценарію прикріпіть його і встановіть текстовий об'єкт для відображення.
Спробуйте запустити гру і натиснути клавішу. Ви повинні побачити введені символи. Якщо натиснути її одночасно з клавішею Shift, ви повинні мати можливість вводити великі літери та символи. Також можна ввести японську мову, якщо редактор IME ввімкнуто. З іншого боку, якщо натиснути несимвольну клавішу, таку як клавіша курсору, нічого не станеться.