खेल व्यवहार ों के लिए बटन असाइन करने के लिए क्रिया मानचित्र का उपयोग करें

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

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

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

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

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

एक्शन मैप्स के बारे में

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

एक क्रिया मानचित्र बनाना

यहां, मैं एक एक्शन मैप बनाना चाहता हूं और टेक्स्ट में उपयोगकर्ता की इनपुट जानकारी प्रदर्शित करना चाहता हूं। एक्शन मैप्स का उपयोग करके उपयोगकर्ता इनपुट प्राप्त करने के कई तरीके हैं।

इनपुट क्रिया बनाने के लिए प्रोजेक्ट में किसी भी फ़ोल्डर को राइट-क्लिक करें। बनाए जाने वाले फ़ोल्डर का स्थान मनमाना है, लेकिन कृपया इसे अपने प्रोजेक्ट के अनुसार प्रबंधित करें। फ़ाइल का नाम भी मनमाना है, लेकिन यहां InputActionSample यह है।

जब आप बनाई गई फ़ाइल डबल-क्लिक करते हैं, तो निम्न विंडो प्रदर्शित होगी।

सबसे पहले, एक्शन मैप बनाने के लिए एक्शन मैप्स में + बटन पर क्लिक करें। एक निर्माण इकाई के रूप में, यदि दृश्य के आधार पर ऑपरेशन की सामग्री बदलती है, तो इसे उस इकाई में परिभाषित किया जाएगा। उदाहरण के लिए, साइड-स्क्रॉलिंग एक्शन गेम के मामले में, कार्रवाई के दौरान और मेनू में ऑपरेशन की सामग्री बदल जाती है, इसलिए आप प्रत्येक के लिए एक एक्शन मैप बनाएंगे।

यहां, एक उदाहरण के रूप में, हम एक साइड-स्क्रॉलिंग एक्शन को परिभाषित करते हैं और इसे "साइडस्क्रॉल एक्शनमैप" नाम देते हैं।

इसके बाद, क्रियाएँ बनाएँ। चूंकि यह एक नमूना है, इसलिए मैं उनमें से कई नहीं बनाऊंगा, लेकिन यहां हम आंदोलन के लिए "मूव" एक्शन और हमले के लिए "हमला" बनाएंगे। चूंकि एक पहले से ही बनाया गया है, कृपया नाम बदलें या एक नया बनाएं, ऊपरी दाएं कोने में + बटन पर क्लिक करें और इसे दर्ज करें।

सबसे पहले, चाल कॉन्फ़िगरेशन कॉन्फ़िगर करें। नियंत्रक मानता है कि आप स्टिक, डी-पैड और कीबोर्ड कर्सर कुंजियों का उपयोग करें। साइड-स्क्रॉलिंग कार्रवाई के मामले में, ऐसे मामले हैं जहां केवल बाएं और दाएं का उपयोग किया जाता है, लेकिन यहां हम मानते हैं कि आप ऊपरी कुंजी के साथ कूदने और नीचे की कुंजी के साथ झुकने पर विचार करते हुए चार दिशाओं का उपयोग करते हैं।

जब आप मूव का चयन करते हैं, तो दाईं ओर एक क्रिया प्रकार चयन होता है, इसलिए इसे "मान" पर सेट करें।

आपको नीचे नियंत्रण प्रकार दिखाई देगा, इसलिए वेक्टर 2 का चयन करें। ऐसा इसलिए है क्योंकि ऊपर और नीचे वाई को सौंपा गया है, और बाएं और दाएं एक्स को सौंपा गया है।

फिर उस कुंजी का चयन करें जिसे आप इस ईवेंट को असाइन करना चाहते हैं. बीच में कोई बाइंडिंग नहीं चुनें और दाईं ओर पथ का चयन करें। यहां हम गेमपैड लेफ्टस्टिक का चयन करते हैं।

यह गेमपैड के लेफ्टस्टिक को मूव से बांधता है।

अन्य नियंत्रकों को भी बांधने के लिए, मूव के दाईं ओर + बटन से "बाइंडिंग जोड़ें" का चयन करें।

अब जब नो बाइंडिंग जोड़ा गया है, तो हम गेमपैड के लिए एक डीपैड असाइन करते हैं।

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

स्टिक और डीपैड ऐसे बटन हैं जो ऊपर, नीचे, बाएं और दाएं मानते हैं, इसलिए उन्हें इसके साथ जोड़ा जा सकता है, लेकिन कीबोर्ड के मामले में, वे सभी एकल कुंजी हैं, इसलिए ऊपर, नीचे, बाएं और दाएं के लिए कोई परिभाषा नहीं है। कुंजीपटल को ऊपर, नीचे, बाएँ, या दाएँ सेट करने के लिए, + बटन से नीचे बाएँ समग्र जोड़ें का चयन करें.

फिर एक 2 डी वेक्टर जोड़ा जाएगा और आप इसे नीचे दिए गए आंकड़े में दिखाए गए अनुसार प्रत्येक अप डाउन राइट को असाइन कर सकते हैं।

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

यूपी अब अप एरो के लिए सेट है।

इसी तरह, नीचे, बाएं और दाएं सेट करें और आपका काम पूरा हो गया है।

बेशक, न केवल कर्सर कुंजी बल्कि डब्ल्यूएएसडी भी सेट किया जा सकता है।

इसके बाद, हमला कॉन्फ़िगर करें। हमला असाइन करना आसान है क्योंकि यह एक बटन है। सबसे पहले, हमला का चयन करें और सुनिश्चित करें कि क्रिया प्रकार एक बटन है।

फिर कोई बाइंडिंग नहीं चुनें और उस बटन का चयन करें जिसे आप पथ से असाइन करना चाहते हैं।

यदि आप अधिक जोड़ना चाहते हैं, तो + बटन से "बाइंडिंग जोड़ें" चुनें।

जितना चाहें उतना जोड़ें। चूंकि इसे एक बटन के रूप में माना जाता है, इसलिए कीबोर्ड को गेम कंट्रोलर के समान ही सेट किया जा सकता है।

जब सभी सेटिंग्स पूरी हो जाएं, तो सहेजने के लिए "संपत्ति सहेजें" पर क्लिक करें। आप इस विंडो को बंद कर सकते हैं.

अंत में, प्रोजेक्ट की इनपुटएक्शन फ़ाइल (इस मामले में, आपके द्वारा पहले बनाई गई इनपुटएक्शन सैंपल फ़ाइल) के साथ, इंस्पेक्टर में "सी # क्लास जेनरेट करें" की जांच करें। पैरामीटर जोड़ा जाएगा, लेकिन "लागू करें" बटन पर क्लिक करें जैसा कि यह है।

यह समान नाम के साथ एक स्क्रिप्ट फ़ाइल उत्पन्न करेगा। इसमें कक्षाएं शामिल हैं जो कार्यक्रमों से कार्रवाई मानचित्रों का उपयोग करने के लिए उपयोगी हैं।

इनपुट जानकारी कैसे प्राप्त करें

एक्शन मैप के आधार पर इनपुट प्राप्त करने के कई तरीके हैं। यह टिप तीन पैटर्न बताती है, लेकिन वास्तव में गेम बनाते समय उनमें से एक पर ध्यान केंद्रित करना बेहतर होता है। यदि आप उन्हें अलग से उपयोग करते हैं, तो इसे प्रबंधित करना मुश्किल होगा।

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

संदेश भेजें में इनपुट जानकारी प्राप्त करें

यहां पहली विधि यह है कि "संदेश भेजें" में इनपुट जानकारी कैसे प्राप्त करें।

इस बार, मैं पाठ में दर्ज की गई जानकारी प्रदर्शित करना चाहता हूं, इसलिए मैं एक टेक्स्ट ऑब्जेक्ट रखूंगा।

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

इसके बाद, खाली ऑब्जेक्ट में एक प्लेयर इनपुट घटक जोड़ें। प्लेयर इनपुट एक्शन मैप और स्क्रिप्ट को जोड़ने के लिए एक महत्वपूर्ण घटक है।

"घटक जोड़ें" में, "इनपुट" श्रेणी में "प्लेयर इनपुट" है, इसलिए इसे जोड़ें।

एक बार प्लेयर इनपुट घटक जोड़ने के बाद, "क्रियाएं" में आपके द्वारा बनाए गए एक्शन मैप को सेट करें। इसे प्रोजेक्ट से ड्रॉप करें या इसे + आइकन से दाईं ओर चुनें।

सत्यापित करें कि डिफ़ॉल्ट मैप वही है जिसे आपने एक्शन मैप में बनाया है.

सत्यापित करें कि व्यवहार "संदेश भेजें" है।

इसके बाद, एक स्क्रिप्ट बनाएँ। फ़ाइल का नाम कुछ भी हो सकता है, लेकिन यहाँ InputSendMessage यह है।

स्क्रिप्ट इस तरह दिखती है:

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

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

  /// <summary>
  /// Move アクションが実行されたときに呼ばれる。
  /// </summary>
  /// <param name="inputValue">入力量。</param>
  public void OnMove(InputValue inputValue)
  {
    var vec = inputValue.Get<Vector2>();
    TextObject.text = $"Move:({vec.x:f2}, {vec.y:f2})\n{TextObject.text}";
  }

  /// <summary>
  /// Attack アクションが実行されたときに呼ばれる。
  /// </summary>
  public void OnAttack(InputValue inputValue)
  {
    TextObject.text = $"Attack:{inputValue.isPressed}\n{TextObject.text}";
  }
}
  • ऑब्जेक्ट में एक प्लेयर इनपुट संलग्न है जो संदेश भेजें सेट करता है
  • मोनोबिहेवियर से विरासत में

यदि शर्तें पूरी हो जाती हैं, तो यदि आप "OnXXXXXXXX" नामक एक विधि को परिभाषित करते हैं, निर्दिष्ट क्रिया कार्रवाई किए जाने पर लक्ष्य विधि को बुलाया जाएगा. "XXXXXXX" कार्रवाई मानचित्र में बनाई गई क्रियाओं का नाम है। यहां, हमने "मूव" और "अटैक" क्रियाएं बनाई हैं, इसलिए विधि के नाम क्रमशः "ऑनमूव" और "ऑनअटैक" हैं।

OnMove आप निम्नलिखित के तर्क InputValue से दर्ज की गई राशि प्राप्त कर सकते हैं। चूंकि नियंत्रण प्रकार "वेक्टर 2" पर सेट है, इसलिए इनपुट मान InputValue.Get<Vector2> में प्राप्त किया जाएगा।

OnAttackInputValue.isPressed आप यह भी जान सकते हैं कि आप दबाव डाल रहे हैं या नहीं।

स्क्रिप्ट सहेजने के बाद, इसे प्लेयर इनपुट घटक वाले ऑब्जेक्ट से अनुलग्न करें। पाठ ऑब्जेक्ट को भी प्रदर्शन के लिए सेट करें.

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

जैसा कि आप देख सकते हैं जब आप इसे स्थानांतरित करते हैं, तो आप देख सकते हैं कि विधि को केवल तभी कहा जाता है जब पिछली स्थिति से मूल्य में परिवर्तन होता है। उदाहरण के लिए, छड़ी को बाईं ओर ले जाते समय, इसे एकल-दिमाग कहा जाता है, लेकिन बाईं ओर नहीं (- OnMove 1,0)। OnMove हमला बटन भी केवल उसी क्षण प्रतिक्रिया देता है जब इसे दबाया जाता है, और यदि इसे दबाया और रखा जाता है, तो विधि को नहीं कहा जाता है।

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

वैसे, वर्तमान स्थिति में, बटन जारी होने पर इसे कॉल नहीं किया जाता है, इसलिए यह निर्धारित करना संभव नहीं है कि बटन कब OnAttack जारी किया जाता है। इसका जवाब देने के लिए, कार्रवाई मानचित्र सेटिंग्स में बटन को परिभाषित करने वाली हमला कार्रवाई का चयन करें और "इंटरैक्शन" से "दबाएं" जोड़ें। उसके बाद, जोड़े गए प्रेस के ट्रिगर व्यवहार को "प्रेस और रिलीज़" पर सेट करें और इसे सहेजें।

निष्पादित होने पर, आप देख सकते हैं कि बटन जारी होने पर भी OnAttack इसे कहा जाता है। isPressed false चूंकि यह बन जाता है, इसलिए यह निर्धारित करना भी संभव है कि यह रिलीज का समय है या नहीं।

वैसे, कृपया इस इंटरैक्शन को हटा दें क्योंकि भविष्य में इसका उपयोग नहीं किया जाएगा।

एकता घटनाओं का आह्वान के साथ इनपुट प्राप्त करें

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

सबसे पहले, पाठ ऑब्जेक्ट रखें ताकि इनपुट जानकारी प्रदर्शित की जा सके।

एकता ईवेंट का आह्वान एक खाली ऑब्जेक्ट बनाता है जो संबंधित कार्रवाई करता है।

खाली ऑब्जेक्ट में इनपुट > प्लेयर इनपुट जोड़ें।

क्रियाओं के लिए आपके द्वारा बनाई गई क्रिया मानचित्र फ़ाइल सेट करें (इस मामले में, InputActionSample) और आपके द्वारा बनाए गए क्रिया मानचित्र (इस मामले में, SideScrollActionMap) को डिफ़ॉल्ट मैप पर सेट करें. एकता घटनाओं का आह्वान करने के लिए व्यवहार सेट करें।

कोई स्क्रिप्ट बनाएँ. नाम मनमाना है, लेकिन इस मामले InputInvokeUnityEvents में यह है।

स्क्रिप्ट इस तरह दिखती है:

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

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

  /// <summary>
  /// Move 操作を行ったときに呼ばれる。
  /// </summary>
  /// <param name="context">コールバック内容。</param>
  public void OnMove(InputAction.CallbackContext context)
  {
    var vec = context.ReadValue<Vector2>();
    TextObject.text = $"Move:({vec.x:f2}, {vec.y:f2})\n{TextObject.text}";
  }

  /// <summary>
  /// Move 操作を行ったときに呼ばれる。
  /// </summary>
  /// <param name="context">コールバック内容。</param>
  public void OnAttack(InputAction.CallbackContext context)
  {
    var value = context.ReadValueAsButton();
    TextObject.text = $"Attack:{value}\n{TextObject.text}";
  }
}

विधि का नाम OnMoveOnAttack जिसे तब कहा जाता है जब उपयोगकर्ता इसके साथ इंटरैक्ट करता है, जैसा कि संदेश भेजें के मामले में होता है। Invocate Unity ईवेंट में, आप इस विधि का नाम अपनी इच्छानुसार सेट कर सकते हैं.

जब प्रत्येक को बुलाया जाता है, तो इसे एक InputAction.CallbackContext तर्क के रूप में पारित किया जाता है, ताकि आप वहां से इनपुट स्थिति प्राप्त कर सकें। यदि आप कार्रवाई में "मान" सेट करते हैं, तो आप इसे विधि में प्राप्त कर सकते हैं, और यदि आप "बटन" सेट ReadValueAsButton करते हैं, तो आप ReadValue इसे विधि में प्राप्त कर सकते हैं।

स्क्रिप्ट सहेजने के बाद, प्लेयर इनपुट को उस ऑब्जेक्ट से अनुलग्न करें जिसे आप सेट कर रहे हैं और प्रदर्शन पाठ ऑब्जेक्ट सेट करें।

इसके बाद, प्लेयर इनपुट में "इवेंट" और "एक्शन मैप नाम (साइडस्क्रॉल एक्शनमैप)" का विस्तार करें और आपको अपने द्वारा बनाई गई क्रियाएं "मूव" और "अटैक" देखना चाहिए।

सबसे पहले, इसे जोड़ने के लिए मूव पर + बटन पर क्लिक करें।

निचले बाएं कोने में ऑब्जेक्ट आपका अपना ऑब्जेक्ट है, और फ़ंक्शन आपके द्वारा अभी बनाई गई OnMove विधि पर सेट है।

हमला ईवेंट को भी कॉन्फ़िगर करें.

यह देखने के लिए गेम चलाएं कि यह कैसे काम करता है।

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

इनपुट जानकारी प्राप्त करने के लिए स्वत: जनरेट की गई स्क्रिप्ट का उपयोग करें

तीसरा खंड वर्णन करता है कि किसी क्रिया मानचित्र फ़ाइल से उत्पन्न स्क्रिप्ट का उपयोग करके इनपुट जानकारी कैसे प्राप्त करें.

चूंकि अन्य अधिग्रहण प्रक्रियाओं के साथ संघर्ष की संभावना है, कृपया अन्य अधिग्रहण प्रक्रियाओं को अक्षम करें।

इनपुट जानकारी प्रदर्शित करने के लिए कोई पाठ ऑब्जेक्ट रखें.

साथ ही, इनपुट जानकारी पुनर्प्राप्त करने के लिए एक खाली ऑब्जेक्ट बनाएँ। यह आलेख एक स्वत: जनरेटेड स्क्रिप्ट का उपयोग करता है, इसलिए आपको प्लेयर इनपुट जोड़ने की आवश्यकता नहीं है।

एक्शन मैप से स्वचालित रूप से उत्पन्न स्क्रिप्ट सिर्फ एक लाइब्रेरी है, इसलिए एक अलग नियंत्रण स्क्रिप्ट बनाएं। नाम मनमाना है, लेकिन इस मामले InputScript में यह है।

स्क्रिप्ट इस तरह दिखती है:

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

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

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

  private void Awake()
  {
    // 各操作を行ったときに呼ばれるイベントを設定する
    _actionMap = new InputActionSample();
    _actionMap.SideScrollActionMap.Move.performed += context => OnMove(context);
    _actionMap.SideScrollActionMap.Attack.performed += 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}";
  }
}

फ़ील्ड में कार्रवाई मानचित्र से एक स्वत: उत्पन्न वर्ग InputActionSample परिभाषित करें. यह वर्ग क्रिया मानचित्र में प्रत्येक क्रिया सेट को परिभाषित करता है, और आप उन ईवेंट ्स को सेट कर सकते हैं जिन्हें उन क्रियाओं को निष्पादित करते समय बुलाया जाता है.

Awake विधि में, InputActionSample एक उदाहरण बनाया जाता है और कार्रवाई के समय बुलाया गया ईवेंट सेट किया जाता है। जब आप ये कार्रवाई करते हैं, तो OnMoveविधि OnAttack को अब कहा जाता है।

हालाँकि, चूंकि हम केवल घटना को यहां सेट करते हैं, इसलिए हमें OnEnable कार्रवाई मानचित्र को सक्षम करने के लिए विधि को Enable कॉल करने की आवश्यकता है।

इसके अलावा, चूंकि उपयोगकर्ता के इनपुट व्यवहार को एक वैश्विक ऑपरेशन के रूप में माना जाता है, इस ऑब्जेक्ट को अमान्य किए जाने के बाद क्रिया मानचित्र को अतिरिक्त करने से रोकने OnDisable के लिए, हम इसे अक्षम करने की विधि में Disable विधि को कॉल करते हैं।

स्क्रिप्ट सहेजने के बाद, इसे आपके द्वारा बनाए गए खाली ऑब्जेक्ट से अनुलग्न करें और पाठ ऑब्जेक्ट को प्रदर्शन के लिए सेट करें।

यह देखने के लिए गेम चलाएं कि यह कैसे काम करता है।

जैसा कि आप देख सकते हैं, जब मूव ऑपरेशन (0, 0) हो जाता है तो OnMove विधि को कॉल नहीं किया जाता है। मुझे यकीन नहीं है कि क्यों, लेकिन ऐसा लगता है कि प्रदर्शन की गई घटना वास्तव में केवल कीस्ट्रोक सक्षम के साथ एक लेती है।

वैसे, यदि आपने अटैक के लिए एक्शन मैप में इंटरैक्शन सेट नहीं किया है, तो बटन जारी करते समय इसे कॉल नहीं किया OnAttack जाएगा।

इसे संभालने के लिए canceled , आपको एक ईवेंट सेट करने की आवश्यकता है। यदि आप (0, 0) पर विशेष प्रसंस्करण नहीं करना चाहते हैं, तो आप विधि को वैसा ही कह सकते हैं जैसा कि यह है OnMove । हमले के लिए भी यही सच है।

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

चलाएँ और सत्यापित करें कि चाल:(0, 0) या हमला: गलत प्रकट होता है.