使用键盘操作(输入系统包版本)

更新页 :
页面创建日期 :

验证环境

窗户
  • 视窗 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,您也可以输入日语。 另一方面,如果您按下非字符键(例如光标键),则不会发生任何事情。