การทํางานด้วยคีย์บอร์ด (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;
}
}
Keyboard
onTextInput
ชั้นเรียนมีเหตุการณ์ที่เรียกว่า ซึ่งเรียกว่าเมื่อใดก็ตามที่ป้อนข้อความ
OnEnable
ที่นี่วิธีการลงทะเบียนในเวลาและOnDisable
ยกเลิกในเวลาOnTextInput
OnTextInput
ของ .
Keyboard.current
เป็นวัตถุเฉพาะที่มีอยู่ตั้งแต่เวลาที่เกมถูกดําเนินการจนกว่าจะถูกยกเลิกดังนั้นOnDisable
อย่าลืมปล่อยมันในเวลาของ .
หากคุณสามารถจับคู่การลงทะเบียนและการยกเลิกกิจกรรมได้ตลอดเวลาคุณสามารถตั้งค่าได้ตลอดเวลา
OnTextInput
ในวิธีการอักขระที่ป้อนจะถูกตั้งค่าเป็นอาร์กิวเมนต์ ดังนั้นจึงถูกผนวกเป็น c
ข้อความ
หลังจาก EventSystem
บันทึกสคริปต์แล้วให้แนบและตั้งค่าวัตถุข้อความสําหรับการแสดงผล
ลองเล่นเกมและกดปุ่ม คุณควรเห็นอักขระที่ป้อน หากคุณกดพร้อมกันกับปุ่ม Shift คุณควรจะสามารถป้อนตัวพิมพ์ใหญ่และสัญลักษณ์ได้ คุณยังสามารถป้อนภาษาญี่ปุ่นได้ถ้าเปิดใช้งาน IME ในทางกลับกันหากคุณกดปุ่มที่ไม่ใช่อักขระเช่นปุ่มเคอร์เซอร์จะไม่มีอะไรเกิดขึ้น