Работа с клавиатурой (версия системного пакета ввода)

Страница обновлена :
Дата создания страницы :

Среда верификации

Виндоус
  • Windows 11
Редактор Unity
  • 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 время нажатия клавиши. В этом коде в момент нажатия клавиши курсора выполняется операция Move над объектом transform Text . Поскольку он обрабатывается только в момент нажатия, движение не продолжается даже при нажатии клавиши.

После EventSystem сохранения скрипта прикрепите к объекту KeyboardOneFrame и нажмите кнопку Задайте текстовый объект, который необходимо переместить, в объект Text.

Попробуйте запустить игру и проверить, перемещается ли знак @ при нажатии клавиши курсора. Кроме того, убедитесь, что удерживание клавиши не приводит к перемещению символа @.

Какие типы ключей можно определить?

Это написано на официальном сайте, поэтому, пожалуйста, проверьте там.

Определите момент отпускания определенного ключа

Мы не создаем образец, но момент, когда вы нажимаете на него, определяется свойством, а момент, когда 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 сценарий к текстовому объекту и задайте текстовый объект для поворота.

Убедитесь, что символ @ вращается до упора во время игры и удерживает пробел.

Получить все нажатые клавиши

Попробуйте отобразить все клавиши, которые вы нажимаете, в виде текста. Вы поместили текстовый объект для отображения клавиши, которую вы нажимаете.

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 включен. С другой стороны, если вы нажмете несимвольную клавишу, такую как клавиша курсора, ничего не произойдет.