Obsługa za pomocą klawiatury (wersja pakietu systemu wprowadzania)

Strona zaktualizowana :
Data utworzenia strony :

Środowisko weryfikacji

Windows
  • Okna 11
Edytor Unity
  • 2020.3.25f1
Pakiet systemu wejściowego
  • 1.2.0

Wymagania wstępne dotyczące tej porady

Poniższe ustawienia zostały wcześniej wprowadzone jako przesłanka do opisu tej wskazówki.

Określanie momentu naciśnięcia określonego

Po naciśnięciu spróbuj przesunąć obiekt. Umieść obiekt tekstowy w obszarze roboczym, aby potwierdzić przeniesienie. Rozmiar i pozycja mogą być odpowiednie.

Obsługa klawiatury odbywa się za pomocą skryptów. KeyboardOneFrame W tym przypadku tworzymy go jako .

Kod wygląda następująco:

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 Możesz uzyskać bieżący stan naciśnięcia klawiatury itp. z . keyboard.xxxxxxx.wasPressedThisFrame Zwraca tylko true czas momentu naciśnięcia. W tym kodzie w momencie naciśnięcia kursora operacja Move jest wykonywana na obiekcie transform Text . Ponieważ jest przetwarzany tylko w momencie naciśnięcia, ruch nie jest kontynuowany, nawet jeśli zostanie naciśnięty.

Po EventSystem zapisaniu skryptu dołącz do obiektu KeyboardOneFrame i kliknij Ustaw obiekt tekstowy, który ma zostać przeniesiony do obiektu Tekst.

Spróbuj uruchomić grę i sprawdzić, czy znak @ porusza się po naciśnięciu kursora. Upewnij się również, że przytrzymanie nie spowoduje przesunięcia symbolu @.

Jakie typy kluczy można określić?

Jest to napisane na oficjalnej stronie internetowej, więc sprawdź tam.

Określanie momentu zwolnienia określonego klucza

Nie tworzymy próbki, ale moment jej naciśnięcia zależy od właściwości, natomiast moment wasPressedThisFrame wasReleasedThisFrame jej zwolnienia może być oceniany przez .

Określanie podczas naciskania określonego

Jest to również określone przez skrypt. Możesz dodać go do poprzedniego kodu, ale tym razem utworzymy nowy plik skryptu o nazwie i zapiszemy go KeyboardPress .

Skrypt wygląda tak:

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);
    }
  }
}

Po naciśnięciu spacji obiekt tekstowy jest obracany. keyboard.xxxxxxxx.isPressed Zwraca cały true czas trwania klucza.

Dołącz zapisany EventSystem skrypt do obiektu tekstowego i ustaw obiekt tekstowy do obrócenia.

Upewnij się, że symbol @ obraca się do końca, gdy gra jest uruchomiona i przytrzymuje spację.

Pobierz wszystkie naciśnięte

Spróbuj wyświetlić wszystkie naciskane jako tekst. Umieściłeś obiekt tekstowy, aby wyświetlić naciśnięty.

KeyboardAllKeys Utwórz skrypt o nazwie .

Skrypt wygląda tak:

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 pozwala uzyskać informacje o wszystkich kluczach. Z isPressed tych można wyodrębnić tylko te, które są prawdziwe, i pobrać tylko, które naciskasz. Następnie naciśnięty jest konwertowany na ciąg znaków i wyświetlany jako tekst.

Utworzony EventSystem skrypt dołącza i ustawia obiekt tekstowy do wyświetlania naciskania.

Uruchom grę i sprawdź, czy naciśnięty jest widoczny.

Nawiasem mówiąc, nawet jeśli naciśniesz wiele, wszystkie mogą nie być wyświetlane, ale nie martw się o to, ponieważ jest to problem fizyczny z powodu okablowania klawiatury.

Wpisywanie znaków

Do tej pory miałeś typ, który nacisnąłeś, ale możliwe jest również uzyskanie znaków, które faktycznie wpisałeś. Na przykład, jeśli naciśnięty zostanie "A", można uzyskać literę "a", a jeśli naciśnięty zostanie "Shift + A", można uzyskać literę "A". Jeśli edytor IME jest włączony, można również pobrać język japoński.

Jednak tych wprowadzonych postaci nie można odzyskać we właściwościach i zostaną one nabyte w formie zdarzeń.

W przykładzie umieszczany jest obiekt tekstowy w celu wyświetlenia wprowadzonych znaków.

Utwórz skrypt. KeyboardTextInput Nazwa to .

Wprowadź skrypt w następujący sposób:

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;
  }
}

KeyboardKlasa onTextInput ma zdarzenie o nazwie , które jest wywoływane przy każdym wprowadzeniu tekstu. OnEnable Tutaj metoda jest rejestrowana w czasie iOnDisable anulowana w OnTextInput OnTextInput czasie . Keyboard.current jest unikalnym obiektem, który istnieje od momentu wykonania gry do momentu jej zakończenia, więc OnDisable pamiętaj, aby zwolnić go w czasie . Jeśli zawsze możesz sparować rejestrację i anulowanie wydarzenia, możesz ustawić to w dowolnym innym momencie.

OnTextInput W metodzie wprowadzony znak jest ustawiany jako argument c , więc jest dołączany jako tekst.

Po EventSystem zapisaniu skryptu dołącz go do obiektu tekstowego i ustaw obiekt tekstowy do wyświetlenia.

Spróbuj uruchomić grę i nacisnąć. Powinny zostać wyświetlone wprowadzone znaki. Jeśli naciśniesz go w tym samym czasie, co Shift, powinieneś być w stanie wprowadzić wielkie litery i symbole. Możesz także wprowadzić język japoński, jeśli edytor IME jest włączony. Z drugiej strony, jeśli naciśniesz bez znaku, taki jak kursora, nic się nie stanie.