การทํางานด้วยคีย์บอร์ด (Input System Package Version)

ปรับปรุงหน้า :
วันที่สร้างเพจ :

สภาพแวดล้อมการตรวจสอบ

หน้าต่าง
  • หน้าต่าง 11
บรรณาธิการ Unity
  • ปี 2020.3.25f1
แพ็คเกจระบบอินพุต
  • 1.2.0

ข้อกําหนดเบื้องต้นสําหรับเคล็ดลับนี้

การตั้งค่าต่อไปนี้ได้ทําไว้ล่วงหน้าเพื่อเป็นหลักฐานสําหรับคําอธิบายของเคล็ดลับนี้

กําหนดช่วงเวลาที่กดปุ่มเฉพาะ

เมื่อคุณกดแป้น ให้ลองย้ายวัตถุ วางวัตถุข้อความใน Canvas เพื่อยืนยันการย้าย ขนาดและตําแหน่งสามารถเหมาะสม

การจัดการแป้นพิมพ์ทําได้โดยสคริปต์ 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 ช่วงเวลาของช่วงเวลาที่กดปุ่มเท่านั้น ในรหัสนี้ทันทีที่กดปุ่มเคอร์เซอร์การดําเนินการย้ายจะดําเนินการบนวัตถุ transform ข้อความ เนื่องจากมีการประมวลผลเฉพาะในขณะที่กดการเคลื่อนไหวจะไม่ดําเนินต่อไปแม้ว่าจะกดปุ่มก็ตาม

หลังจาก 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);
    }
  }
}

ในขณะที่กด spacebar วัตถุข้อความจะถูกหมุน 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;
  }
}

KeyboardonTextInputชั้นเรียนมีเหตุการณ์ที่เรียกว่า ซึ่งเรียกว่าเมื่อใดก็ตามที่ป้อนข้อความ OnEnableที่นี่วิธีการลงทะเบียนในเวลาและOnDisableยกเลิกในเวลาOnTextInputOnTextInputของ . Keyboard.currentเป็นวัตถุเฉพาะที่มีอยู่ตั้งแต่เวลาที่เกมถูกดําเนินการจนกว่าจะถูกยกเลิกดังนั้นOnDisableอย่าลืมปล่อยมันในเวลาของ . หากคุณสามารถจับคู่การลงทะเบียนและการยกเลิกกิจกรรมได้ตลอดเวลาคุณสามารถตั้งค่าได้ตลอดเวลา

OnTextInput ในวิธีการอักขระที่ป้อนจะถูกตั้งค่าเป็นอาร์กิวเมนต์ ดังนั้นจึงถูกผนวกเป็น c ข้อความ

หลังจาก EventSystem บันทึกสคริปต์แล้วให้แนบและตั้งค่าวัตถุข้อความสําหรับการแสดงผล

ลองเล่นเกมและกดปุ่ม คุณควรเห็นอักขระที่ป้อน หากคุณกดพร้อมกันกับปุ่ม Shift คุณควรจะสามารถป้อนตัวพิมพ์ใหญ่และสัญลักษณ์ได้ คุณยังสามารถป้อนภาษาญี่ปุ่นได้ถ้าเปิดใช้งาน IME ในทางกลับกันหากคุณกดปุ่มที่ไม่ใช่อักขระเช่นปุ่มเคอร์เซอร์จะไม่มีอะไรเกิดขึ้น