गेमपैड के साथ नियंत्रण (इनपुट सिस्टम पैकेज संस्करण)

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

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

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

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

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

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

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

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

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

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

निर्धारित करें कि क्या कोई बटन दबाया जा रहा है

आप यह निर्धारित कर सकते हैं कि कोई बटन गुणों के साथ-साथ कीबोर्ड और माउस द्वारा दबाया xxxxxxxx.isPressed गया है या नहीं। यहां, मैं उस बटन के प्रकार को प्रदर्शित करना चाहता हूं जिसे मैं पाठ में दबा रहा हूं।

सबसे पहले, एक प्रदर्शन पाठ ऑब्जेक्ट रखें।

फैसले के लिए एक स्क्रिप्ट बनाएँ। फ़ाइल का नाम मनमाना है, लेकिन यहां GamepadButtons यह है।

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

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

public class GamepadButtons : 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 gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // ボタンを押している間は xxxxxxxx.isPressed が true を返します

    // B ボタンや East ボタン、○ボタンは読み方が違うだけで同じボタンです
    // これは PlayStation や Xbox, Switch などでボタンの読み方が違うためです
    if (gamepad.aButton.isPressed) Builder.AppendLine($"A");
    if (gamepad.bButton.isPressed) Builder.AppendLine($"B");
    if (gamepad.xButton.isPressed) Builder.AppendLine($"X");
    if (gamepad.yButton.isPressed) Builder.AppendLine($"Y");

    if (gamepad.buttonEast.isPressed) Builder.AppendLine($"East");
    if (gamepad.buttonWest.isPressed) Builder.AppendLine($"West");
    if (gamepad.buttonNorth.isPressed) Builder.AppendLine($"North");
    if (gamepad.buttonSouth.isPressed) Builder.AppendLine($"South");

    if (gamepad.circleButton.isPressed) Builder.AppendLine($"Circle");
    if (gamepad.crossButton.isPressed) Builder.AppendLine($"Cross");
    if (gamepad.triangleButton.isPressed) Builder.AppendLine($"Triangle");
    if (gamepad.squareButton.isPressed) Builder.AppendLine($"Square");

    // コントローラーの中央にあるスタートボタン、セレクトボタン、メニューボタン、ビューボタンなどに該当します。
    if (gamepad.startButton.isPressed) Builder.AppendLine($"Start");
    if (gamepad.selectButton.isPressed) Builder.AppendLine($"Select");

    // 左と右のスティックをまっすぐ押し込んだかどうかを判定します
    if (gamepad.leftStickButton.isPressed) Builder.AppendLine($"LeftStickButton");
    if (gamepad.rightStickButton.isPressed) Builder.AppendLine($"RightStickButton");

    // 左上と右上にあるボタン。PlayStation だと L1 や R1 に該当します
    if (gamepad.leftShoulder.isPressed) Builder.AppendLine($"LeftShoulder");
    if (gamepad.rightShoulder.isPressed) Builder.AppendLine($"RightShoulder");

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

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

गेम चलाने का प्रयास करें और देखें कि प्रत्येक बटन प्रतिक्रिया देता है या नहीं।

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

XboxPlayStation और अधिक
bButton सर्कल बटन बटन ईस्ट
aButton क्रॉसबटन बटन दक्षिण
xButton SquareButton बटनवेस्ट
yButton त्रिकोण बटन बटन उत्तर

बटन के रूप में क्या आंका जा सकता है यह इस प्रकार है।

  • एक बटन, × बटन, डाउन बटन
  • बी बटन, 3 बटन, दाएँ बटन
  • एक्स बटन, □ बटन, बाएं बटन
  • वाई बटन, डाउन एरो बटन, ऊपर बटन
  • प्रारंभ बटन, मेनू बटन
  • बटन, दृश्य बटन का चयन करें
  • बाएं कंधे बटन, एल 1 बटन
  • दाएं कंधे बटन, आर 1 बटन
  • बाएं स्टिक बटन
  • राइट स्टिक बटन

निर्धारित करें कि बटन दबाया गया है या नहीं

प्रेस के समय निर्णय कीबोर्ड और माउस के गुणों xxxxxxxx.wasPressedThisFrame द्वारा निर्धारित किया जा सकता है। उस क्षण true का मूल्य लौटाता है जब इसे दबाया जाता है, और उसके बाद दबाए जाने और पकड़े जाने पर false भी वापस आ जाता है।

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

स्क्रिप्ट का फ़ाइल नाम कुछ भी हो सकता है, लेकिन यहां GamepadButtonsOneFrame यह है।

स्क्रिप्ट इस तरह दिखती है: सादगी के लिए, केवल 4 बटन को आंका जाता है।

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

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

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

    // 1つ目のゲームパッドの情報を取得
    var gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    // ボタンが押された瞬間かどうかを判定
    if (gamepad.aButton.wasPressedThisFrame) TextObject.text += "A";
    if (gamepad.bButton.wasPressedThisFrame) TextObject.text += "B";
    if (gamepad.xButton.wasPressedThisFrame) TextObject.text += "X";
    if (gamepad.yButton.wasPressedThisFrame) TextObject.text += "Y";
  }
}

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

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

निर्धारित करें कि क्या बटन जारी होने का क्षण

कोई नमूना नहीं है, लेकिन आप यह निर्धारित कर सकते हैं कि क्या यह वह क्षण है wasPressedThisFrame जब आप इसे संपत्ति के wasReleasedThisFrame बजाय संपत्ति का उपयोग करके जारी करते हैं।

निर्धारित करें कि आप तीर कुंजियों को कब दबाते हैं

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

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

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

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

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

public class GamepadDpad : 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 gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // Dpad の押下情報を Vector2 として取得するパターン
    var value = gamepad.dpad.ReadValue();
    Builder.Append($"(x:{value.x}, y:{value.y})");

    // Dpad の各方向のボタンを押しているかどうかの判定
    if (gamepad.dpad.left.isPressed) Builder.Append(" left");
    if (gamepad.dpad.right.isPressed) Builder.Append(" right");
    if (gamepad.dpad.up.isPressed) Builder.Append(" up");
    if (gamepad.dpad.down.isPressed) Builder.Append(" down");

    // Dpad の情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

आप यहां डीपीएडी जानकारी Gamepad.dpad प्राप्त कर सकते हैं।

DPAD में प्रत्येक दिशा के लिए गुण होते हैं leftupdown right, और आप यह निर्धारित कर सकते हैं कि इसे संपत्ति आदि द्वारा दबाया गया है या नहीं। isPressed

DpadControl.ReadValue आप प्रेस की स्थिति Vector2 प्राप्त करने के लिए विधि का भी उपयोग कर सकते हैं। यदि कुछ भी दबाया नहीं गया है (0, 0), यदि बचा हुआ दबाया जाता है (-1, 0), और इसी तरह।

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

गेम चलाने और DPAD के साथ बातचीत करने का प्रयास करें।

Vector2 वैसे, एक सामान्यीकृत स्थिति में है, इसलिए जब आप विकर्ण रूप से दबाते हैं, तो इसे (1, 1) के बजाय (0.7071, 0.7071) जैसी संख्या के रूप में प्राप्त किया जाता है।

ट्रिगर प्रेस निर्धारित करें

एक्सबॉक्स नियंत्रकों में बाईं और दाईं ओर ट्रिगर नामक बटन होते हैं। PlayStation पर, यह L2R2 से मेल खाती है। यह बटन एक सामान्य बटन से अलग है, और आप 0.0 ~ 1.0 में दबाए जा रहे राशि प्राप्त कर सकते हैं। कुछ अन्य नियंत्रक ट्रिगर के अलावा अन्य नामों से लैस हैं, लेकिन पुराने नियंत्रकों आदि में, उन्हें केवल बटन के रूप में रखा जा सकता है, इस स्थिति में दबाने का निर्णय केवल 0, 1 के रूप में संभाला जाता है।

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

कोई स्क्रिप्ट बनाएँ. चूंकि इसका उपयोग कहीं और किया जाएगा, इसलिए हम इसे यहां GamepadReadValue नाम देंगे।

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

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

public class GamepadReadValue : 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 gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // トリガーの押下量を取得
    Builder.AppendLine($"LeftTrigger:{gamepad.leftTrigger.ReadValue()}");
    Builder.AppendLine($"RightTrigger:{gamepad.rightTrigger.ReadValue()}");

    // 情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

Gamepad प्रत्येक leftTriggerवर्ग में एक संपत्ति होती है और rightTrigger ReadValue आप विधि को कॉल करके 0.0 ~ 1.0 की सीमा में प्रेस की मात्रा प्राप्त कर सकते हैं। ट्रिगर्स को बटन के रूप में भी माना जा सकता है, इसलिए isPressed आप इस तरह का न्याय भी कर सकते हैं। isPressed true वैसे, बन की ReadValue मात्रा 0.5 पर आधारित है।

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

गेम चलाने और ट्रिगर को स्थानांतरित करने का प्रयास करें।

स्टिक जानकारी निर्धारित करें

छड़ी क्रमशः बाईं छड़ी और दाईं छड़ी की जानकारी प्राप्त कर सकती है, और आप यह प्राप्त कर सकते हैं कि छड़ी को किस दिशा में कितना नीचे धकेला गया है। बेशक, यदि आपके पास अपने नियंत्रक पर छड़ी नहीं है, तो आप यह जानकारी प्राप्त नहीं कर पाएंगे।

स्टिक जानकारी क्रमशः Gamepad.leftStick के साथ Gamepad.rightStick पुनर्प्राप्त की जा सकती है।

ऑपरेशन पुष्टिकरण स्क्रिप्ट के लिए, हम ट्रिगर प्राप्त करने के लिए पहले उपयोग की गई स्क्रिप्ट को डायवर्ट करेंगे।

// 省略

public class GamepadReadValue : MonoBehaviour
{
  // 省略

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    // 省略

    // トリガーの押下量を取得
    Builder.AppendLine($"LeftTrigger:{gamepad.leftTrigger.ReadValue()}");
    Builder.AppendLine($"RightTrigger:{gamepad.rightTrigger.ReadValue()}");

    // スティックの入力を取得
    var leftStickValue = gamepad.leftStick.ReadValue();
    Builder.AppendLine($"LeftStick:{leftStickValue.normalized * leftStickValue.magnitude}");
    var rightStickValue = gamepad.rightStick.ReadValue();
    Builder.AppendLine($"RightStick:{rightStickValue.normalized * rightStickValue.magnitude}");

    // 情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

leftStickrightStick आप विधि ReadValue पर कॉल Vector2 करके प्रेस की जानकारी प्राप्त कर सकते हैं या . Vector2 तो आप प्राप्त कर सकते हैं कि आप एक्स अक्ष और वाई अक्ष पर कितना x y दबाव डाल रहे हैं। यदि आप जिस दिशा को दबा रहे हैं उसे प्राप्त करना चाहते हैं, तो आप इसे संपत्ति में प्राप्त कर सकते हैं, और यदि आप उस राशि को प्राप्त करना चाहते हैं जिसे आप दबा रहे हैं, तो आप magnitude normalized इसे संपत्ति में प्राप्त कर सकते हैं।

वास्तव में खेल को स्थानांतरित करने और स्टिक को संचालित करने का प्रयास करें।

गेमपैड जानकारी प्राप्त करें

आप कनेक्टेड गेमपैड से आईडी, नाम आदि प्राप्त कर सकते हैं। उदाहरण के लिए, कनेक्ट किए गए नियंत्रक के प्रकार की पहचान name करने के लिए देखें, या आप संदर्भित कर सकते हैं कि कई गेमपैड कनेक्ट होने पर किस deviceId गेमपैड के साथ जुड़ना है।

यहां, हम ऑपरेशन की जांच करने के लिए पाठ में जानकारी प्रदर्शित करेंगे।

स्क्रिप्ट का नाम मनमाना है, लेकिन यहां GamepadInfo यह है।

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

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

public class GamepadInfo : 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 gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // ゲームパッドの各情報を取得
    Builder.AppendLine($"deviceId:{gamepad.deviceId}");
    Builder.AppendLine($"name:{gamepad.name}");
    Builder.AppendLine($"displayName:{gamepad.displayName}");
    Builder.AppendLine($"shortDisplayName:{gamepad.shortDisplayName}");
    Builder.AppendLine($"path:{gamepad.path}");
    Builder.AppendLine($"layout:{gamepad.layout}");

    // 情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

Gamepad आप पुनर्प्राप्त जानकारी से विभिन्न जानकारी प्राप्त कर सकते हैं। यहाँ कुछ अंश दिए गए हैं.

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

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