जॉयस्टिक के साथ ऑपरेशन (इनपुट सिस्टम पैक संस्करण)

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

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

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

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

निम्न सेटिंग्स इन युक्तियों के स्पष्टीकरण के लिए एक शर्त के रूप में पूर्व-कॉन्फ़िगर हैं।

XInput और DirectInput के बारे में

यद्यपि यह विंडोज तक सीमित है, गेम नियंत्रकों के लिए दो कनेक्शन प्रारूप हैं: "डायरेक्टइनपुट" और "एक्सइनपुट"। "जॉयस्टिक" यहां "डायरेक्टइनपुट" से मेल खाती है।

इस कार्यक्रम में Joystick , हम एक वर्ग से निपट रहे हैं, लेकिन यह केवल नियंत्रकों को संभाल सकता है जो "डायरेक्टइनपुट" का समर्थन करते हैं। "XInput" का समर्थन करने वाले नियंत्रक का उपयोग करने के लिए, आपको एक अलग Gamepad वर्ग का उपयोग करने की आवश्यकता है।

"डायरेक्टइनपुट" एक पुराना कनेक्शन प्रारूप है, और बटन की परिभाषा अपेक्षाकृत अस्पष्ट है, और यह विशेष आकार वाले नियंत्रकों को संभाल सकता है। हालांकि, हाल ही में, "XInput" मुख्यधारा बन गया है, और नियंत्रकों की संख्या जो "डायरेक्टइनपुट" का समर्थन नहीं करते हैं, बढ़ रही है। चूंकि "डायरेक्टइनपुट" बटन को "1", "2" और "3" के रूप में परिभाषित करता है, गेम रचनाकारों को एक ऐसी प्रणाली बनानी चाहिए जो गेम और नियंत्रक बटन पत्राचार को उचित रूप से सेट करने की अनुमति देती है।

"XInput" को "DirectInput" की अगली पीढ़ी के रूप में परिभाषित किया गया है और इसमें पूर्वनिर्धारित A और B बटन, ट्रिगर्स, स्टिक आदि हैं। इसलिए, नियंत्रक के आकार का उपयोग केवल किया जा सकता है, जो लगभग तय है। चूंकि बटन की परिभाषा अच्छी तरह से परिभाषित है, गेम निर्माता ऐसे गेम बना सकते हैं जो बटन के प्लेसमेंट के बारे में चिंता किए बिना नियंत्रक से मेल खाते हैं। हाल के गेम नियंत्रकों की बढ़ती संख्या केवल "XInput" के साथ संगत हैं।

जॉयस्टिक्स के बारे में

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

यह नमूना मूल रूप से सूचीबद्ध बटन पर जानकारी प्राप्त करने तक सीमित है। name वास्तव में, आपको संचालन की जांच और असाइन करने की आवश्यकता है।

जॉयस्टिक सूचना अधिग्रहण

जॉयस्टिक पर प्रत्येक बटन के बारे में जानकारी प्रदर्शित करने के लिए एक टेक्स्ट ऑब्जेक्ट रखें।

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

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

using System.Text;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
using UnityEngine.UI;

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

  StringBuilder Builder = new StringBuilder();

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    if (TextObject == null)
    {
      Debug.Log($"{nameof(TextObject)} が null です。");
      return;
    }

    // 1つ目のジョイスティックの情報を取得
    var joystick = Joystick.current;
    if (joystick == null)
    {
      Debug.Log("ジョイスティックがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // ジョイスティックの情報取得
    Builder.AppendLine($"deviceId:{joystick.deviceId}");
    Builder.AppendLine($"name:{joystick.name}");
    Builder.AppendLine($"displayName:{joystick.displayName}");

    // ジョイスティックにはボタンの大部分が定義されていないので
    // 基本的には allControls で列挙して入力の種類と値を確認していく
    foreach (var key in joystick.allControls)
    {
      if (key is StickControl stick)
      {
        if (stick.up.isPressed) Builder.AppendLine($"{key.name} Up");
        if (stick.down.isPressed) Builder.AppendLine($"{key.name} Down");
        if (stick.left.isPressed) Builder.AppendLine($"{key.name} Left");
        if (stick.right.isPressed) Builder.AppendLine($"{key.name} Right");

        var value = stick.ReadValue();
        if (value.magnitude > 0f)
        {
          Builder.AppendLine($"{key.name}:{value.normalized * value.magnitude}");
        }
      }
      else if (key is Vector2Control vec2)
      {
        var value = vec2.ReadValue();
        if (value.magnitude > 0f)
        {
          Builder.AppendLine($"{key.name}:{value.normalized * value.magnitude}");
        }
        if (vec2.x.ReadValue() != 0f)
        {
          Builder.AppendLine($"{key.name}.x:{vec2.x.ReadValue()}");
        }
        if (vec2.y.ReadValue() != 0f)
        {
          Builder.AppendLine($"{key.name}.x:{vec2.y.ReadValue()}");
        }
      }
      else if (key is ButtonControl button)
      {
        if (button.isPressed) Builder.AppendLine($"{key.name} isPress");
        var value = button.ReadValue();
        if (value != 0f)
        {
          Builder.AppendLine($"{key.name}:{value}");
        }
      }
      else if (key is AxisControl axis)
      {
        if (axis.IsPressed()) Builder.AppendLine($"{key.name} isPress");

        var value = axis.ReadValue();
        if (value != 0f)
        {
          Builder.AppendLine($"{key.name}:{value}");
        }
      }
      else
      {
        Builder.AppendLine($"Type={key.GetType()}");
      }
    }

    // 押しているボタン一覧をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

आप कनेक्टेड जॉयस्टिक के बारे में जानकारी Joystick.current प्राप्त कर सकते हैं। Joystick उसके बाद, हम कक्षा से प्रत्येक जानकारी प्राप्त करेंगे।

Joystick जैसा कि आप कक्षा से देख सकते हैं, इस तरह की परिभाषाएं हैं, stick trigger लेकिन ए बटन या स्टार्ट बटन जैसी कोई परिभाषा नहीं है। इसलिए, आपको सभी बटन, स्टिक्सallControls की गणना करने और बटन प्रकार का पता लगाने और जानकारी दबाने के लिए गुणों का उपयोग करना चाहिए।

एक बार स्क्रिप्ट सहेजे जाने के बाद, EventSystem इसे संलग्न करें और जानकारी प्रदर्शित करने के लिए एक टेक्स्ट ऑब्जेक्ट सेट करें।

DirectInपुट का समर्थन करने वाले नियंत्रक के साथ खेल चलाने का प्रयास करें। जानकारी का प्रत्येक टुकड़ा पुनर्प्राप्त किया जा सकता है।

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

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

कई जॉयस्टिक के लिए जानकारी कैसे प्राप्त करें

सभी जुड़े जॉयस्टिक के बारे Joystick.all में जानकारी प्राप्त की जा सकती है। ReadOnlyArray इसे foreach आदि में गिना जा सकता है।

चूंकि प्रत्येक मान एक वर्ग है Joystick , इसलिए आप पिछले कार्यक्रम की तरह जॉयस्टिक जानकारी प्राप्त कर सकते हैं।