Töötamine klaviatuuriga (sisendsüsteemi paketi versioon)

Lehekülg uuendatud :
Lehe loomise kuupäev :

Kontrollimise keskkond

Windows
  • Windows 11
Ühtsuse toimetaja
  • 2020.3.25f1
Sisendsüsteemi pakett
  • 1.2.0

Selle näpunäite eeltingimused

Selle vihje kirjeldamise eelduseks on eelnevalt tehtud järgmised sätted.

Määrake hetk, mil konkreetset klahvi vajutatakse

Kui vajutate klahvi, proovige objekti teisaldada. Käigu kinnitamiseks asetage tekstiobjekt lõuendile. Suurus ja asend võivad olla sobivad.

Klaviatuuri käsitsemine toimub skriptide abil. KeyboardOneFrame Sel juhul loome selle kui .

Kood näeb välja selline:

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 Praeguse klaviatuuriklahvi vajutamise oleku jne saate aadressilt . keyboard.xxxxxxx.wasPressedThisFrame tagastab ainult true klahvi vajutamise aja. Selles koodis, kui kursoriklahvi vajutatakse, tehakse tekstiobjektil transform teisaldamistoiming . Kuna seda töödeldakse ainult vajutamise hetkel, ei jätku liikumine isegi siis, kui klahvi vajutatakse.

Pärast EventSystem skripti salvestamist manustage objektile KeyboardOneFrame ja klõpsake nuppu Seadke tekstiobjekt teisaldatavaks tekstiobjektiks.

Proovige mängu käivitada ja kontrollige, kas @-märk liigub, kui vajutate kursoriklahvi. Samuti veenduge, et klahvi all hoidmine ei liigutaks sümbolit @.

Milliseid võtmeid saab määrata?

See on kirjutatud ametlikul veebisaidil, nii et palun kontrollige seal.

Määrake konkreetse võtme vabastamise aeg

Me ei loo näidist, kuid hetke, mil te seda vajutate, määrab omadus, samas kui hetke wasPressedThisFrame , mil wasReleasedThisFrame te selle vabastate, saab hinnata .

Määrake konkreetse klahvi vajutamisel

Selle määrab ka skript. Saate selle eelmisele koodile lisada, kuid seekord loome uue skriptifaili nimega ja kirjutame selle KeyboardPress .

Skript näeb välja selline:

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

Tühikuklahvi vajutamise ajal pööratakse tekstiobjekti. keyboard.xxxxxxxx.isPressed tagastab kogu true võtme kestuse.

Manustage EventSystem salvestatud skript tekstiobjektile ja määrake pööratav tekstiobjekt.

Veenduge, et sümbol @ pöörleks mängu töötamise ja tühikuklahvi hoidmise ajal lõpuni.

Hankige kõik vajutatud klahvid

Proovige kuvada kõik klahvid, mida vajutate, tekstina. Olete vajutatava klahvi kuvamiseks paigutanud tekstiobjekti.

KeyboardAllKeys Looge skript nimega .

Skript näeb välja selline:

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 Võimaldab teil saada teavet kõigi võtmete kohta. Nendest klahvidest isPressed saate välja võtta ainult need, mis on tõesed, ja tuua ainult need klahvid, mida vajutate. Pärast seda teisendatakse vajutatav klahv stringiks ja kuvatakse tekstina.

Loodud EventSystem skript kinnitub ja määrab tekstiobjekti vajutamisklahvi kuvamiseks.

Käivitage mäng ja kontrollige, kas ilmub klahv, mida vajutate.

Muide, isegi kui vajutate palju klahve, ei pruugi kõiki klahve kuvada, kuid ärge muretsege selle pärast, sest see on klaviatuuri juhtmestiku tõttu füüsiline probleem.

Tipitud märkide hankimine

Siiani on teil vajutatud klahvitüüp, kuid on võimalik saada ka tegelikult sisestatud märke. Näiteks kui vajutatakse klahvi "A", saab tähe "a" ja kui vajutatakse klahvi "Shift+A", saab tähe "A". Kui IME on lubatud, on võimalik, et saate ka jaapani keele alla laadida.

Kuid neid sisestatud märke ei saa atribuutidest alla laadida ja need omandatakse sündmuste kujul.

Proovis paigutatakse sisestatud märkide kuvamiseks tekstiobjekt.

Skripti loomine. KeyboardTextInput Nimi on .

Sisestage skript järgmiselt:

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

KeyboardKlassis onTextInput on sündmus nimega , mida nimetatakse teksti sisestamisel. OnEnable Siin registreeritakse meetod ajastusel jaOnDisable tühistatakse OnTextInput OnTextInput . Keyboard.current on ainulaadne objekt, mis eksisteerib alates mängu käivitamisest kuni selle lõpetamiseni, seega OnDisable vabastage see kindlasti . Kui saate alati sündmuse registreerimise ja tühistamise siduda, saate selle määrata igal muul ajal.

OnTextInput Meetodis on sisestatud märk seatud argumendina c , nii et see lisatakse tekstina.

Pärast EventSystem skripti salvestamist lisage see ja määrake kuvamiseks tekstiobjekt.

Proovige mängu käivitada ja vajutada klahvi. Peaksite nägema sisestatud märke. Kui vajutate seda samal ajal tõstuklahviga Shift, peaksite saama sisestada suurtähti ja sümboleid. Võite sisestada ka jaapani keele, kui IME on lubatud. Teisest küljest, kui vajutate mittemärgilist klahvi, näiteks kursoriklahvi, ei juhtu midagi.