गतिशील रूप से एक क्रिया मानचित्र सेट करें

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

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

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

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

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

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

डायनेमिक क्रिया मानचित्र कॉन्फ़िगरेशन के बारे में

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

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

डायनेमिक एक्शन मैप परिवर्तन हैंडलिंग

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

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

क्रिया मानचित्र प्रारंभिक कॉन्फ़िगरेशन प्रक्रिया

कोई स्क्रिप्ट बनाएँ. नाम मनमाना है, लेकिन इस मामले InputActionMap में यह है। इस बार, सभी प्रक्रियाओं को यहां वर्णित किया जाएगा, लेकिन वास्तविक उत्पादन में, कृपया उन्हें परियोजना के निर्माण के अनुसार विभाजित करें।

स्क्रिप्ट इस तरह दिखती है: सबसे पहले, स्टार्टअप पर एक डिफ़ॉल्ट एक्शन मैप बनाएं।

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

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

  /// <summary>Move アクション用の定義。</summary>
  public InputAction MoveAction { get; set; }

  /// <summary>Attack アクション用の定義。</summary>
  public InputAction AttackAction { get; set; }

  private void Awake()
  {
    // Move アクションの作成
    MoveAction = new InputAction("Move");

    // バインド(キー割り当て)の追加
    // 設定する文字列の形式はアクションマップ設定画面の Path に表示される文字列となる
    MoveAction.AddBinding("<Gamepad>/leftStick");

    // キーボードに上下左右を割り当てるにはコンポジットの 2DVector を設定する
    MoveAction.AddCompositeBinding("2DVector")
        .With("Up", "<Keyboard>/upArrow")
        .With("Down", "<Keyboard>/downArrow")
        .With("Left", "<Keyboard>/leftArrow")
        .With("Right", "<Keyboard>/rightArrow");

    // Attack アクションの作成
    AttackAction = new InputAction("Attack");

    // バインド(キー割り当て)の追加
    AttackAction.AddBinding("<Gamepad>/buttonSouth");
    AttackAction.AddBinding("<Keyboard>/z");

    // 操作時のイベントを設定
    MoveAction.performed += context => OnMove(context);
    MoveAction.canceled += context => OnMove(context);
    AttackAction.performed += context => OnAttack(context);
    AttackAction.canceled += context => OnAttack(context);
  }

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

  private void OnDisable()
  {
    // アクションマップが誤動作しないようにオブジェクト終了時に無効にする
    MoveAction.Disable();
    AttackAction.Disable();
  }

  /// <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}";
  }
}

सबसे पहले, कक्षा में उतनी ही क्रियाएँ परिभाषित करें जितनी आप InputAction फ़ील्ड में लागू करना चाहते हैं। यहां, हम "मूव" और "अटैक" के लिए फ़ील्ड तैयार करेंगे, जिनका उपयोग पिछले एक्शन मैप स्पष्टीकरण में भी किया गया था। यदि क्रियाओं की संख्या बढ़ जाती है, तो आपको उस संख्या को घोषित करने की आवश्यकता है, लेकिन यदि कई हैं, तो आप उन्हें , आदि के साथ प्रबंधित कर सकते हैं List Dictionary । इसका उपयोग यहां नहीं किया जाता है, लेकिन यदि आपके पास अपनी कक्षा InputActionMap है, तो आप इसे वहां प्रबंधित कर सकते हैं।

प्रारंभ कीरण नामक Awake विधि में InputAction तात्कालिकता और महत्वपूर्ण असाइनमेंट AddBinding किया जाता है। आप सोच सकते हैं कि आप एक प्रोग्राम के रूप में क्या कर रहे हैं जो एक्शन मैप सेटिंग स्क्रीन पर बाइंडिंग जोड़ता है। AddBinding विधि, आदि के लिए निर्दिष्ट स्ट्रिंग कार्रवाई मानचित्र सेटिंग स्क्रीन पर पथ में प्रदर्शित स्ट्रिंग के समान है। वर्ण स्ट्रिंग प्रदर्शित करने के लिए, दाईं ओर "T" बटन दबाएँ.

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

// 操作時のイベントを設定
MoveAction.performed += context => OnMove(context);
MoveAction.canceled += context => OnMove(context);
AttackAction.performed += context => OnAttack(context);
AttackAction.canceled += context => OnAttack(context);
/// <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}";
}

सक्षम करें, अक्षम करें एक इकाई है InputAction , इसलिए जितनी चाहें उतनी क्रियाओं का वर्णन करें। यदि यह परेशानी भरा है, तो आप इसे List आदि के साथ प्रबंधित कर सकते हैं।

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

स्क्रिप्ट सहेजने के बाद EventSystem , इसे प्रदर्शन के लिए पाठ ऑब्जेक्ट से अनुलग्न और कॉन्फ़िगर करें.

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

एक्शन मैप डायनेमिक परिवर्तन संसाधन

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

// 省略

public class InputActionMap : MonoBehaviour
{
  // 省略

  /// <summary>
  /// ボタンをクリックしたときに呼ばれる。
  /// </summary>
  public void OnClickButton()
  {
  }
}

बटन के लिए क्लिक ईवेंट सेट करता है.

एक्शन मैप पुनर्लेखन प्रक्रिया निम्नानुसार है:

/// <summary>
/// ボタンをクリックしたときに呼ばれる。
/// </summary>
public void OnClickButton()
{
  TextObject.text = "アクションマップを変更しました。";

  // Move アクションのキーを置き換える
  MoveAction.ApplyBindingOverride(new InputBinding { path = "<Gamepad>/leftStick", overridePath = "<Gamepad>/dpad" } );
  MoveAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/upArrow", overridePath = "<Keyboard>/w" });
  MoveAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/downArrow", overridePath = "<Keyboard>/s" });
  MoveAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/leftArrow", overridePath = "<Keyboard>/a" });
  MoveAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/rightArrow", overridePath = "<Keyboard>/d" });

  // Attack アクションのキーを置き換える
  AttackAction.ApplyBindingOverride(new InputBinding { path = "<Gamepad>/buttonSouth", overridePath = "<Gamepad>/buttonEast" });
  AttackAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/z", overridePath = "<Keyboard>/space" });
}

चूंकि प्रत्येक क्रिया के लिए ApplyBindingOverride एक विधि प्रदान की जाती है, इसलिए कुंजी या बटन का पथ जिसे प्रारंभ किया गया था, path overridePath उस कुंजी या बटन का पथ लिखें जिसे आप ओवरराइड करना चाहते हैं।

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

AttackAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/z", overridePath = "<Keyboard>/x" });

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

InputAction इस बार, हम उस व्यक्ति के लिए एक्शन मैप बदल रहे हैं जिसने एक उदाहरण बनाया है, जीयूआई की एक्शन मैप सेटिंग द्वारा उत्पन्न एक स्क्रिप्ट भी InputAction है, इसलिए कृपया इसे उस में लागू करें जो करना आसान है।