Använda tangentbordet (version av inmatningssystempaket)

Sidan uppdaterad :
Datum för skapande av sida :

Verifiering miljö

Windows
  • Fönster 11
Unity-redaktör
  • 2020.3.25F1
Paket för inmatningssystem
  • 1.2.0

Förutsättningar för det här tipset

Följande inställningar har gjorts i förväg som en förutsättning för beskrivningen av detta tips.

Bestäm när en viss tangent trycks in

När du trycker på en tangent försöker du flytta objektet. Placera ett textobjekt på arbetsytan för att bekräfta flytten. Storleken och positionen kan vara lämplig.

Tangentbordshantering görs av skript. KeyboardOneFrame I det här fallet skapar vi det som .

Koden ser ut så här:

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 Du kan få aktuell tangentbordstangent, tryckningsstatus etc. från . keyboard.xxxxxxx.wasPressedThisFrame Returnerar endast true tidpunkten för det ögonblick som tangenten trycks ned. I den här koden, när markörknappen trycks in, utförs Move-åtgärden på Text-objektet transform . Eftersom den endast behandlas vid tryckningstillfället fortsätter rörelsen inte även om tangenten trycks in.

När du har EventSystem sparat skriptet bifogar du till objektet KeyboardOneFrame och klickar på Ange att textobjektet ska flyttas till Text-objektet.

Prova att köra spelet och kontrollera om @-markeringen rör sig när du trycker på markörtangenten. Se också till att @-symbolen inte flyttas om du håller ned tangenten.

Vilka typer av nycklar kan bestämmas?

Det är skrivet på den officiella hemsidan, så kolla där.

Bestäm när en viss nyckel släpps

Vi skapar inte ett prov, men det ögonblick du trycker på det bestäms av egenskapen, medan det ögonblick wasPressedThisFrame wasReleasedThisFrame du släpper det kan bedömas av .

Bestäm medan du trycker på en specifik tangent

Detta bestäms också av skriptet. Du kan lägga till den i föregående kod, men den här gången skapar vi en ny skriptfil som heter och skriver den KeyboardPress .

Skriptet ser ut så här:

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

När du trycker på mellanslagstangenten roteras textobjektet. keyboard.xxxxxxxx.isPressed Returneras under hela true nyckelns varaktighet.

Koppla det sparade skriptet EventSystem till Textobjekt och ange att textobjektet ska roteras.

Se till att @-symbolen roterar hela vägen medan spelet körs och håller mellanslagstangenten.

Få alla nedtryckta tangenter

Försök att visa alla tangenter du trycker på som text. Du har placerat ett textobjekt för att visa tangenten du trycker på.

KeyboardAllKeys Skapa ett skript med namnet .

Skriptet ser ut så här:

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 låter dig få information om alla nycklar. Du kan bara extrahera de som är sanna från isPressed dessa tangenter och bara hämta de tangenter du trycker på. Därefter konverteras tangenten du trycker på till en sträng och visas som text.

Det EventSystem skapade skriptet bifogar och ställer in ett textobjekt för att visa trycktangenten.

Kör spelet och kontrollera att tangenten du trycker på visas.

Förresten, även om du trycker på många tangenter, kanske inte alla tangenter visas, men oroa dig inte för det eftersom det är ett fysiskt problem på grund av tangentbordsledningar.

Hämta skrivna tecken

Hittills har du fått den typ av tangent du tryckte på, men det är också möjligt att få de tecken du faktiskt skrev. Till exempel, om "A" -tangenten trycks in, kan bokstaven "a" erhållas, och om "Shift + A" -tangenten trycks in kan bokstaven "A" erhållas. Om IME-programmet är aktiverat kan du kanske också hämta japanska.

Dessa angivna tecken kan dock inte hämtas i egenskaper och kommer att förvärvas i form av händelser.

I exemplet placeras ett textobjekt för att visa de angivna tecknen.

Skapa ett skript. KeyboardTextInput Namnet är .

Ange skriptet enligt följande:

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

KeyboardKlassen onTextInput har en händelse som heter , som anropas när text anges. OnEnable Här registreras metoden vid tidpunkten för ochOnDisable avbryts vid OnTextInput OnTextInput tidpunkten för . Keyboard.current är ett unikt objekt som existerar från det att spelet körs tills det avslutas, så OnDisable se till att släppa det vid tidpunkten för . Om du alltid kan para ihop händelseregistrering och avbokning kan du ställa in det när som helst.

OnTextInput I metoden anges det angivna tecknet som ett argument c , så det läggs till som text.

När du har sparat skriptet bifogar du EventSystem det till och ställer in ett textobjekt för visning.

Prova att köra spelet och trycka på . Du bör se de inmatade tecknen. Om du trycker på den samtidigt som Skift-tangenten bör du kunna ange stora bokstäver och symboler. Du kan också ange japanska om IME-programmet är aktiverat. Å andra sidan, om du trycker på en icke-teckentangent som markörtangenten, kommer ingenting att hända.