使用鍵盤操作(輸入系統套件版本)
驗證環境
- 窗戶
-
- 視窗 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.wasPressedThisFrame
僅 true
返回按鍵按下的時間。
在此代碼中,按下游標鍵的那一刻,將對 Text 物件 transform
執行 Move 操作。
由於僅在按下時進行處理,因此即使按下按鍵也不會繼續運動。
保存文稿后 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
並設置用於顯示按鍵的文字物件。
運行遊戲並驗證您按下的鍵是否出現。
順便說一句,即使您按了很多鍵,也可能不會顯示所有鍵,但不要擔心,因為這是由於鍵盤布線引起的物理問題。
獲取鍵入的字元
到目前為止,您獲得了按下的鍵類型,但也有可能獲得您實際鍵入的字元。 例如,如果按下“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
時取消OnTextInput
OnTextInput
。
Keyboard.current
是一個唯一的物件,從遊戲執行到遊戲終止為止一直存在,因此OnDisable
請務必在 .
如果您始終可以配對活動註冊和取消,則可以在任何其他時間進行設置。
OnTextInput
在該方法中,輸入的字元被設置為參數 c
,因此它被追加為文本。
保存文稿后 EventSystem
,將其附加到並設置要顯示的文字物件。
嘗試運行遊戲並按鍵。 您應該會看到輸入的字元。 如果與 Shift 鍵同時按下它,您應該能夠輸入大寫字母和符號。 如果啟用了 IME,您也可以輸入日語。 另一方面,如果您按下非字元鍵(例如游標鍵),則不會發生任何事情。