Hoạt động với bàn phím (Phiên bản gói hệ thống đầu vào)

Trang Cập Nhật :
Ngày tạo trang :

Môi trường xác minh

Windows
  • cửa sổ 11
Biên tập viên Unity
  • 2020.3.25f1
Gói hệ thống đầu vào
  • 1.2.0

Điều kiện tiên quyết cho mẹo này

Các cài đặt sau đây đã được thực hiện trước làm tiền đề cho mô tả về mẹo này.

Xác định thời điểm nhấn một phím cụ thể

Khi bạn nhấn một phím, hãy cố gắng di chuyển đối tượng. Đặt một đối tượng văn bản trong Canvas để xác nhận di chuyển. Kích thước và vị trí có thể phù hợp.

Xử lý bàn phím được thực hiện bởi các tập lệnh. KeyboardOneFrame Trong trường hợp này, chúng tôi tạo nó dưới dạng .

Mã trông như thế này:

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 Bạn có thể nhận được trạng thái nhấn phím bàn phím hiện tại, v.v. từ . keyboard.xxxxxxx.wasPressedThisFrame Chỉ true trả về thời gian của thời điểm nhấn phím. Trong mã này, thời điểm nhấn phím con trỏ, thao tác Di chuyển được thực hiện trên đối tượng transform Văn bản . Vì nó chỉ được xử lý tại thời điểm nhấn, chuyển động không tiếp tục ngay cả khi nhấn phím.

Sau khi EventSystem lưu tập lệnh, đính kèm vào đối tượng KeyboardOneFrame và nhấp vào Đặt đối tượng văn bản sẽ được di chuyển đến đối tượng Văn bản.

Hãy thử chạy trò chơi và kiểm tra xem dấu @ có di chuyển không khi bạn nhấn phím con trỏ. Ngoài ra, hãy đảm bảo rằng việc giữ phím không di chuyển biểu tượng @.

Những loại khóa có thể được xác định?

Nó được viết trên trang web chính thức, vì vậy vui lòng kiểm tra ở đó.

Xác định thời điểm một khóa cụ thể được nhả ra

Chúng tôi không tạo mẫu, nhưng thời điểm bạn nhấn nó được xác định bởi thuộc tính, trong khi thời điểm wasPressedThisFrame wasReleasedThisFrame bạn nhả nó có thể được đánh giá bằng .

Xác định trong khi nhấn một phím cụ thể

Điều này cũng được xác định bởi kịch bản. Bạn có thể thêm nó vào mã trước đó, nhưng lần này chúng ta sẽ tạo một tệp tập lệnh mới có tên và viết nó KeyboardPress .

Kịch bản trông như thế này:

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

Trong khi nhấn phím cách, đối tượng văn bản được xoay. keyboard.xxxxxxxx.isPressed trả về cho toàn bộ true thời gian của khóa.

Đính kèm tập lệnh đã EventSystem lưu vào Đối tượng Văn bản và đặt đối tượng văn bản sẽ được xoay.

Đảm bảo biểu tượng @ xoay hết cỡ trong khi trò chơi đang chạy và giữ phím cách.

Nhận tất cả các phím được nhấn

Cố gắng hiển thị tất cả các phím bạn đang nhấn dưới dạng văn bản. Bạn đã đặt một đối tượng văn bản để hiển thị phím bạn đang nhấn.

KeyboardAllKeys Tạo một tập lệnh với tên .

Kịch bản trông như thế này:

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 Cho phép bạn lấy thông tin về tất cả các phím. Bạn chỉ có thể trích xuất những phím đúng từ isPressed các phím đó và chỉ truy xuất các phím bạn đang nhấn. Sau đó, phím bạn đang nhấn được chuyển đổi thành một chuỗi và hiển thị dưới dạng văn bản.

Tập EventSystem lệnh đã tạo đính kèm và đặt một đối tượng văn bản để hiển thị phím nhấn.

Chạy trò chơi và xác minh rằng phím bạn đang nhấn xuất hiện.

Nhân tiện, ngay cả khi bạn nhấn nhiều phím, tất cả các phím có thể không được hiển thị, nhưng đừng lo lắng về điều đó vì đó là vấn đề vật lý do hệ thống dây điện bàn phím.

Nhận ký tự đã nhập

Cho đến bây giờ, bạn có loại phím bạn nhấn, nhưng cũng có thể lấy các ký tự bạn thực sự nhập. Ví dụ: nếu nhấn phím "A", có thể thu được chữ "a" và nếu nhấn phím "Shift + A", có thể thu được chữ "A". Nếu IME được bật, bạn cũng có thể truy xuất tiếng Nhật.

Tuy nhiên, các ký tự đã nhập này không thể được truy xuất trong thuộc tính và sẽ được mua dưới dạng sự kiện.

Trong mẫu, một đối tượng văn bản được đặt để hiển thị các ký tự đã nhập.

Tạo tập lệnh. KeyboardTextInput Tên là .

Nhập tập lệnh như sau:

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

KeyboardLớp có onTextInput một sự kiện được gọi là , được gọi bất cứ khi nào văn bản được nhập. OnEnable Tại đây, phương thức được đăng ký tại thời điểm và hủy bỏ tại OnTextInput OnTextInput thời điểmOnDisable . Keyboard.current là một đối tượng duy nhất tồn tại từ thời điểm trò chơi được thực thi cho đến khi nó bị chấm dứt, vì vậy OnDisable hãy chắc chắn phát hành nó tại thời điểm . Nếu bạn luôn có thể ghép nối đăng ký và hủy sự kiện, bạn có thể đặt nó bất kỳ lúc nào khác.

OnTextInput Trong phương thức, ký tự đã nhập được đặt làm đối số c , vì vậy nó được nối dưới dạng văn bản.

Sau khi EventSystem lưu tập lệnh, hãy đính kèm nó và đặt một đối tượng văn bản để hiển thị.

Hãy thử chạy trò chơi và nhấn phím. Bạn sẽ thấy các ký tự được nhập. Nếu bạn nhấn nó cùng lúc với phím Shift, bạn sẽ có thể nhập chữ in hoa và ký hiệu. Bạn cũng có thể nhập tiếng Nhật nếu IME được bật. Mặt khác, nếu bạn nhấn một phím không phải ký tự như phím con trỏ, sẽ không có gì xảy ra.