Робота з клавіатурою (версія пакета системи вводу)

Сторінка оновлюється :
Дата створення сторінки :

Середовище перевірки

Вікна
  • вікна 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 ввімкнуто. З іншого боку, якщо натиснути несимвольну клавішу, таку як клавіша курсору, нічого не станеться.