جوئی اسٹک کے ساتھ آپریشن (ان پٹ سسٹم پیک شدہ ورژن)

جب صفحے کی تازہ کاری :
صفحہ تخلیق تاریخ :

تصدیق کا ماحول

Windows
  • ونڈوز 11
یونٹی ایڈیٹر
  • 2020.3.25f1
Input System Packages
  • 1.2.0

اس ٹوٹکے کے لئے ضروری شرائط

مندرجہ ذیل ترتیبات ان تجاویز کی وضاحت کے لئے ایک شرط کے طور پر پہلے سے تشکیل دی گئی ہیں.

ایکس انپٹ اور ڈائریکٹ انپٹ کے بارے میں

اگرچہ یہ ونڈوز تک محدود ہے ، لیکن گیم کنٹرولرز کے لئے دو کنکشن فارمیٹس ہیں: "ڈائریکٹ انپٹ" اور "ایکس انپٹ"۔ یہاں "جوائے اسٹک" "ڈائریکٹ انپٹ" سے مطابقت رکھتا ہے۔

اس پروگرام میں Joystick ، ہم ایک کلاس سے نمٹ رہے ہیں ، لیکن یہ صرف کنٹرولرز کو سنبھال سکتا ہے جو "ڈائریکٹ انپٹ" کی حمایت کرتے ہیں۔ ایک کنٹرولر استعمال کرنے کے لئے جو "XInput" کی حمایت کرتا ہے ، آپ کو ایک مختلف Gamepad کلاس استعمال کرنے کی ضرورت ہے۔

"ڈائریکٹ انپٹ" ایک پرانا کنکشن فارمیٹ ہے ، اور بٹن کی تعریف نسبتا مبہم ہے ، اور یہ خاص شکلوں کے ساتھ کنٹرولرز کو سنبھال سکتا ہے۔ تاہم ، حال ہی میں ، "ایکس انپٹ" مرکزی دھارے میں آگیا ہے ، اور کنٹرولرز کی تعداد میں اضافہ ہورہا ہے جو "ڈائریکٹ انپٹ" کی حمایت نہیں کرتے ہیں۔ چونکہ "ڈائریکٹ انپٹ" بٹنوں کو "1"، "2" اور "3" کے طور پر بیان کرتا ہے ، لہذا گیم تخلیق کاروں کو ایک ایسا نظام بنانا ہوگا جو گیم اور کنٹرولر بٹن خط و کتابت کو مناسب طریقے سے ترتیب دینے کی اجازت دیتا ہے۔

"ایکس انپٹ" کو "ڈائریکٹ انپٹ" کی اگلی نسل کے طور پر بیان کیا گیا ہے اور اس میں پہلے سے طے شدہ اے اور بی بٹن ، ٹریگر ، اسٹک وغیرہ ہیں۔ لہذا ، کنٹرولر کی شکل صرف استعمال کی جاسکتی ہے ، جو تقریبا طے شدہ ہے۔ چونکہ بٹنوں کی تعریف اچھی طرح سے بیان کی گئی ہے ، لہذا گیم تخلیق کار ایسے گیمز تشکیل دے سکتے ہیں جو بٹنوں کی جگہ کے بارے میں فکر کیے بغیر کنٹرولر سے مطابقت رکھتے ہیں۔ حالیہ گیم کنٹرولرز کی بڑھتی ہوئی تعداد صرف "ایکس انپٹ" کے ساتھ مطابقت رکھتی ہے۔

جوئے اسٹک کے بارے میں

جیسا کہ اوپر ذکر کیا گیا ہے ، بٹن کی کوئی تعریف نہیں ہے ، لہذا اسے اصل میں استعمال کرنے کے لئے ، ہر بٹن کی معلومات کی جانچ پڑتال کرتے وقت گیم آپریشنز تفویض کرنے جیسے پریشان کن عمل شامل کرنا ضروری ہے۔ مجھے نہیں لگتا کہ آپ کو کسی نئے کھیل میں ڈائریکٹ انپٹ استعمال کرنے کی ضرورت ہے کیونکہ یہ پرانا ہے ، لیکن ذہن میں رکھیں کہ اگر آپ واقعی اس کی حمایت کرنا چاہتے ہیں تو ، آپ کا پروگرام پیچیدہ ہوسکتا ہے۔

یہ نمونہ بنیادی طور پر فہرست کردہ بٹنوں پر معلومات حاصل کرنے تک محدود ہے۔ 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 اسے معلومات ظاہر کرنے کے لئے ٹیکسٹ آبجیکٹ سے منسلک کریں اور سیٹ کریں۔

ڈائریکٹ انپٹ کی حمایت کرنے والے کنٹرولر کے ساتھ کھیل چلانے کی کوشش کریں۔ معلومات کا ہر ٹکڑا بازیافت کیا جا سکتا ہے.

کنٹرولر پر منحصر ہے ، جب آپ چھڑی ، تیر کی کلید وغیرہ دباتے ہیں تو آپ کو مطلوبہ قیمت نہیں مل سکتی ہے۔ چونکہ بٹن اس طرح سے بیان نہیں کیے گئے ہیں ، لہذا ہر بٹن کے لئے درست پریس معلومات حاصل کرنا مشکل ہے۔ اس کے علاوہ ، آپ دیکھ سکتے ہیں کہ جوئے اسٹک کو مکمل طور پر سپورٹ کرنا کافی مشکل ہے ، جیسے بٹنوں کی ترتیب کنٹرولر پر منحصر ہے۔

اگر کھیل کو جوئے اسٹک کی حمایت کرنا ہے تو ، یہ مطلوب ہوگا کہ سیٹنگ اسکرین ایک کلیدی کنفگ کی طرح ہو تاکہ ہر صارف اپنے پاس موجود کنٹرولر کے بٹن کی ترتیب کو اپنی مرضی کے مطابق بنا سکے۔

ایک سے زیادہ جوئے اسٹک کے لئے معلومات کیسے حاصل کریں

تمام منسلک جوئے اسٹک کے بارے Joystick.all میں معلومات حاصل کی جاسکتی ہیں۔ ReadOnlyArray اس foreach میں شمار کیا جا سکتا ہے وغیرہ وغیرہ۔

چونکہ ہر قیمت ایک کلاس ہے Joystick ، لہذا آپ پچھلے پروگرام کی طرح جوئے اسٹک کی معلومات حاصل کرسکتے ہیں۔