कुंजीपटल के साथ काम करना (इनपुट सिस्टम पैकेज संस्करण)

पेज अद्यतन :
पेज निर्माण की तारीख :

सत्यापन वातावरण

विंडोज़
  • विंडोज 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 समय लौटाता है। इस कोड में, जिस क्षण कर्सर कुंजी दबाया जाता है, टेक्स्ट ऑब्जेक्ट 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);
    }
  }
}

जबकि स्पेसबार दबाया जाता है, पाठ ऑब्जेक्ट घुमाया जाता है। 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 स्क्रिप्ट दबाने वाली कुंजी प्रदर्शित करने के लिए एक पाठ ऑब्जेक्ट से जुड़ती है और सेट करती है।

गेम चलाएँ और सत्यापित करें कि आपके द्वारा दबाए जा रहे कुंजी प्रकट होती है.

वैसे, भले ही आप बहुत सारी कुंजियों को दबाते हैं, लेकिन सभी कुंजी प्रदर्शित नहीं हो सकती हैं, लेकिन इसके बारे में चिंता न करें क्योंकि यह कीबोर्ड वायरिंग के कारण एक शारीरिक समस्या है।

टाइप किए गए वर्ण प्राप्त करें

अब तक, आपको आपके द्वारा दबाए गए कुंजी का प्रकार मिलता था, लेकिन आपके द्वारा वास्तव में टाइप किए गए वर्णों को प्राप्त करना भी संभव है। उदाहरण के लिए, यदि "ए" कुंजी दबाया जाता है, तो अक्षर "ए" प्राप्त किया जा सकता है, और यदि "शिफ्ट + ए" कुंजी दबाया जाता है, तो अक्षर "ए" प्राप्त किया जा सकता है। यदि 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 , इसे अनुलग्न करें और प्रदर्शन के लिए पाठ ऑब्जेक्ट सेट करें।

गेम चलाने और कुंजी दबाने का प्रयास करें। आपको दर्ज किए गए पात्रों को देखना चाहिए। यदि आप इसे शिफ्ट कुंजी के रूप में एक ही समय में दबाते हैं, तो आपको बड़े अक्षरों और प्रतीकों को दर्ज करने में सक्षम होना चाहिए। यदि IME सक्षम है तो आप जापानी भी दर्ज कर सकते हैं। दूसरी ओर, यदि आप कर्सर कुंजी जैसे गैर-वर्ण कुंजी दबाते हैं, तो कुछ भी नहीं होगा।