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

Страницата се актуализира :
Дата на създаване на страница :

Среда за проверка

Уиндоус
  • Прозорци 11
Редактор на единство
  • 2020.3.25ф1
Пакет на входната система
  • 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 . Тъй като се обработва само в момента на натискане, движението не продължава дори ако клавишът е натиснат.

След като 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 скрипт към текстов обект и задайте текстовия обект да бъде завъртян.

Уверете се, че символът @ се върти докрай, докато играта се изпълнява и държи клавиша за интервал.

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

Опитайте се да покажете всички клавиши, които натискате като текст. Поставили сте текстов обект, за да се покаже клавишът, който натискате.

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 е разрешен. От друга страна, ако натиснете клавиш, който не е знаков, като клавиша на курсора, нищо няма да се случи.