ऑन-स्क्रीन नियंत्रण के साथ स्पर्श-अनुकूलित इनपुट नियंत्रण का उपयोग करें

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

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

विंडोज़
  • विंडोज 11
एकता संपादक
  • 2020.3.25f1
इनपुट सिस्टम पैकेज
  • 1.2.0

इस टिप के लिए आवश्यक शर्तें

इस टिप के विवरण के लिए एक आधार के रूप में निम्नलिखित सेटिंग्स पहले से बनाई गई हैं।

आपको निम्नलिखित युक्तियों से भी परिचित होना चाहिए:

स्पर्श के लिए ऑन-स्क्रीन नियंत्रण के बारे में

मैं अक्सर गेम खेलने के लिए कीबोर्ड या गेमपैड का उपयोग करता हूं। उन उपकरणों पर जिन्हें केवल स्पर्श द्वारा संचालित किया जा सकता है, जैसे कि स्मार्टफोन, आप स्पर्श द्वारा गेम खेलेंगे।

यूनिटी का इनपुट सिस्टम पैकेज टच इंटरैक्शन को अनुकरण करने के लिए ऑन-स्क्रीन कंट्रोल का उपयोग करता है जैसे कि वे एक नियंत्रक द्वारा नियंत्रित किए गए थे।

ऑन-स्क्रीन नियंत्रण से पहले

यह लेख थोड़ा लंबा है, लेकिन यह विषय सीधे ऑन-स्क्रीन नियंत्रण से संबंधित नहीं है। यदि आप इनपुट की जांच करने के लिए इनपुट सिस्टम पैकेज का उपयोग अन्य चरणों में कर सकते हैं, जैसे कि गेमपैड, तो यह ठीक है।

इस टिप में, हम एक एक्शन मैप बनाएंगे। वर्णन करता है कि गेमपैड को छूने का अनुकरण कैसे करें जैसे कि आप इसके साथ बातचीत कर रहे थे।

वैसे, यह एक्शन मैप्स के बजाय स्क्रिप्ट में Keyboard कक्षाओं और Gamepad कक्षाओं का उपयोग करने की विधि का भी समर्थन करता है। मैं इस बार इसकी व्याख्या नहीं करूंगा, लेकिन यदि आप इसे उन कक्षाओं के साथ आज़माना चाहते हैं, तो आप इसके बजाय निम्नलिखित पृष्ठ पर वर्णित कोड तैयार कर सकते हैं।

सबसे पहले, अपने इनपुट प्रदर्शित करने के लिए कैनवास पर एक टेक्स्ट ऑब्जेक्ट रखें। बाद में, हम स्पर्श ऑब्जेक्ट को नीचे रखेंगे, इसलिए कुछ जगह छोड़ दें।

सबसे पहले, निम्नानुसार एक एक्शन मैप बनाएं: आप वही क्रिया बना रहे हैं जो आपने कार्रवाई मानचित्र का वर्णन करते समय की थी.

चूंकि एक्शन मैप की व्याख्या मुख्य बात नहीं है, इसलिए बाइंडिंग सरल है। कार्रवाई मानचित्रों पर विवरण के लिए कृपया निम्नलिखित पृष्ठ देखें।

इस बार, इनपुट अधिग्रहण "संदेश भेजें" या "एकता घटनाओं का आह्वान करें" के बजाय स्क्रिप्ट द्वारा किया जाता है। यह स्क्रिप्ट तक ही सीमित नहीं है, और यह ठीक से काम करता है भले ही आप "संदेश भेजें" आदि का उपयोग करें।

सुनिश्चित करें कि आपने क्रिया मानचित्र से कोड जनरेट किया है.

स्क्रिप्ट इस तरह दिखती है: यह लगभग वैसा ही है जैसा कि एक्शन मैप की व्याख्या करते समय होता है।

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class InputActionScript : MonoBehaviour
{
  /// <summary>情報を表示させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  /// <summary>アクションマップから自動生成されたクラス。</summary>
  private InputActionSample _actionMap;

  private void Awake()
  {
    // 各操作を行ったときに呼ばれるイベントを設定する
    _actionMap = new InputActionSample();
    _actionMap.Action2D.Move.performed += context => OnMove(context);
    _actionMap.Action2D.Attack.performed += context => OnAttack(context);
    _actionMap.Action2D.Move.canceled += context => OnMove(context);
    _actionMap.Action2D.Attack.canceled += context => OnAttack(context);
  }

  private void OnEnable()
  {
    // このオブジェクトが有効になったときにアクションマップを有効にする
    _actionMap.Enable();
  }

  private void OnDisable()
  {
    // このオブジェクトが無効になったときにアクションマップが余計な動作を起こさないように無効にする
    _actionMap.Disable();
  }

  /// <summary>
  /// Move 操作をした時に呼ばれるメソッドです。
  /// </summary>
  /// <param name="context">コールバックパラメータ。</param>
  public void OnMove(InputAction.CallbackContext context)
  {
    // Move の入力量を取得
    var vec = context.ReadValue<Vector2>();
    TextObject.text = $"Move:({vec.x:f2}, {vec.y:f2})\n{TextObject.text}";
  }

  /// <summary>
  /// Attack 操作をした時に呼ばれるメソッドです。
  /// </summary>
  /// <param name="context">コールバックパラメータ。</param>
  public void OnAttack(InputAction.CallbackContext context)
  {
    // Attack ボタンの状態を取得
    var value = context.ReadValueAsButton();
    TextObject.text = $"Attack:{value}\n{TextObject.text}";
  }
}

EventSystem स्क्रिप्ट के साथ जुड़ा हुआ है।

यह देखने के लिए गेम चलाएं कि क्या यह एक एक्शन मैप के रूप में काम करता है।

ऑन-स्क्रीन बटन

ऑन-स्क्रीन बटन एक गेमपैड पर बटन दबाने का अनुकरण करता है, जैसे कि ए और बी, और कीबोर्ड पर कुंजियां जब आप स्क्रीन पर कुछ ऑब्जेक्ट को छूते हैं। वैसे, यह स्पर्श कहता है, लेकिन यह माउस क्लिक के साथ भी काम करता है।

सबसे पहले स्क्रीन पर बटन रखें। चूंकि आप सिर्फ एक घटक संलग्न करते हैं, इसलिए यह बटन के अलावा अन्य वस्तुओं के साथ काम करता है।

घटक से ऑन-स्क्रीन बटन > कोई इनपुट जोड़ें।

नियंत्रण पथ से गेमपैड का बटन पूर्व में सेट करें। इससे ऐसा लगता है कि स्पर्श करने पर गेमपैड पर बटन ईस्ट दबाया गया था।

सुनिश्चित करें कि जब आप गेम चलाते हैं और बटन क्लिक करते हैं तो हमला दिखाई देता है। यदि यह एक स्पर्श करने योग्य डिवाइस है, तो आप पुष्टि कर सकते हैं कि यह स्पर्श के साथ काम करता है।

ऑन-स्क्रीन स्टिक

ऑन-स्क्रीन स्टिक आपको अपने स्पर्श के साथ स्टिक जैसी वस्तुओं को स्थानांतरित करने देता है। जब आप एक छड़ी को स्थानांतरित करते हैं, तो इसे अनुकरण करना संभव है जैसे कि आपने एक गेमपैड स्टिक को स्थानांतरित किया था। स्पर्श के अलावा, माउस के साथ इसे स्थानांतरित करना भी संभव है।

स्क्रीन पर एक बटन ऑब्जेक्ट रखता है जो टच स्टिक होगा। हम यहां एक बटन का उपयोग कर रहे हैं, लेकिन यह बटन के अलावा अन्य वस्तुओं के साथ भी काम करता है।

घटक जोड़ें के अंतर्गत, इनपुट > ऑन-स्क्रीन स्टिक का चयन करें.

नियंत्रण पथ से, क्रिया मानचित्र में परिभाषित Gamepad LeftStick का चयन करें।

खेल चलाएं और स्टिक बटन खींचने का प्रयास करें। बटन एक सर्कल में चलते हैं, जैसे कि एक छड़ी हिला रहे हों। बेशक, आप यह भी जांच सकते हैं कि इनपुट सामग्री चल रही है या नहीं।

इस मामले में, हमने एक बटन रखा है, लेकिन एक गोलाकार फ्रेम और एक गोल स्टिक ऑब्जेक्ट रखकर इसे वर्चुअल स्टिक की तरह दिखाना भी संभव है।

वैसे, इस मूवेबल रेंज को ऑन-स्क्रीन स्टिक के "मूवमेंट रेंज" में बदला जा सकता है।