使用键盘操作(输入系统包版本)
验证环境
- 窗户
-
- 视窗 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,您也可以输入日语。 另一方面,如果您按下非字符键(例如光标键),则不会发生任何事情。