使用鍵盤操作(輸入系統套件版本)

更新頁 :
頁面創建日期 :

驗證環境

窗戶
  • 視窗 11
統一編輯器
  • 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.wasPressedThisFrametrue 返回按鍵按下的時間。 在此代碼中,按下游標鍵的那一刻,將對 Text 物件 transform 執行 Move 操作。 由於僅在按下時進行處理,因此即使按下按鍵也不會繼續運動。

保存文稿后 EventSystem ,附加到物件 KeyboardOneFrame 並按下 設置要移動到文字物件的文字物件。

嘗試運行遊戲並檢查按下游標鍵時 @ 標記是否移動。 此外,請確保按住該鍵不會移動 @ 符號。

可以確定哪些類型的金鑰?

它寫在官方網站上,所以請檢查那裡。

確定釋放特定金鑰的時刻

我們不創建樣本,但您按下它的那一刻由屬性決定,而您釋放它的那一刻wasPressedThisFramewasReleasedThisFrame可以通過.

按特定鍵時確定

這也由腳本決定。 您可以將其添加到前面的代碼中,但是這次我們將創建一個新的腳本檔,稱為並編寫它 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 並設置用於顯示按鍵的文字物件。

運行遊戲並驗證您按下的鍵是否出現。

順便說一句,即使您按了很多鍵,也可能不會顯示所有鍵,但不要擔心,因為這是由於鍵盤布線引起的物理問題。

獲取鍵入的字元

到目前為止,您獲得了按下的鍵類型,但也有可能獲得您實際鍵入的字元。 例如,如果按下“A”鍵,則可以獲得字母“a”,如果按下“Shift+A”鍵,則可以獲得字母“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 時取消OnTextInputOnTextInputKeyboard.current是一個唯一的物件,從遊戲執行到遊戲終止為止一直存在,因此OnDisable請務必在 . 如果您始終可以配對活動註冊和取消,則可以在任何其他時間進行設置。

OnTextInput 在該方法中,輸入的字元被設置為參數 c ,因此它被追加為文本。

保存文稿后 EventSystem ,將其附加到並設置要顯示的文字物件。

嘗試運行遊戲並按鍵。 您應該會看到輸入的字元。 如果與 Shift 鍵同時按下它,您應該能夠輸入大寫字母和符號。 如果啟用了 IME,您也可以輸入日語。 另一方面,如果您按下非字元鍵(例如游標鍵),則不會發生任何事情。