گیم پیڈ (ان پٹ سسٹم پیکیج ورژن) کے ساتھ کنٹرول کرنا

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

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

Windows
  • ونڈوز 11
یونٹی ایڈیٹر
  • 2020.3.25f1
ان پٹ سسٹم پیکیج
  • 1.2.0

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

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

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

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

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

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

ایکس انپٹ کو ڈائریکٹ انپٹ کی اگلی نسل کے طور پر بیان کیا گیا ہے اور اس میں پہلے سے طے شدہ اے اور بی بٹن ، ٹریگر ، اسٹک وغیرہ شامل ہیں۔ لہذا ، کنٹرولر کی صرف ایک مقررہ شکل استعمال کی جاسکتی ہے ، چونکہ بٹن کی تعریف اچھی طرح سے بیان کی گئی ہے ، لہذا گیم تخلیق کار بٹن کی جگہ کے بارے میں فکر کیے بغیر کنٹرولر کے مطابق گیمز تشکیل دے سکتے ہیں۔ حالیہ گیم کنٹرولرز جو صرف "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 ، اسے ڈسپلے ٹیکسٹ آبجیکٹ سے منسلک اور تشکیل دیں۔

گیم چلانے کی کوشش کریں اور دیکھیں کہ آیا ہر بٹن جواب دیتا ہے۔

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

ایکس بکسپلے اسٹیشن اور بہت کچھ
bButton circleButton buttonEast
aButton crossButton buttonSouth
xButton squareButton buttonWest
yButton مثلثButton بٹن شمال

ایک بٹن کے طور پر کیا فیصلہ کیا جا سکتا ہے وہ مندرجہ ذیل ہے۔

  • ایک بٹن، × بٹن، نیچے بٹن
  • بی بٹن، بٹن، دائیں بٹن
  • ایکس بٹن ، □ بٹن ، بائیں بٹن
  • وائی بٹن ، ڈاؤن ایرو بٹن ، اوپر کا بٹن
  • اسٹارٹ بٹن، مینو بٹن
  • بٹن ، دیکھیں بٹن منتخب کریں
  • بائیں کندھے کا بٹن، ایل 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 بجائے پراپرٹی کا استعمال کرکے جاری کرتے ہیں۔

طے کریں کہ آپ تیر کی چابیاں کب دبائیں

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

کسی فیصلے کو ظاہر کرنے کے لئے ٹیکسٹ آبجیکٹ رکھیں کہ آیا اسے آپریشن چیک کے طور پر دبایا گیا ہے یا نہیں۔

اسکرپٹ بنائیں۔ فائل کا نام من مانی ہے ، لیکن یہاں 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 حاصل کرسکتے ہیں۔

ڈی پی اے ڈی میں ہر سمت کے لئے خصوصیات ہیں leftupdown right، اور آپ اس بات کا تعین کرسکتے ہیں کہ آیا یہ پراپرٹی وغیرہ کے ذریعہ دبایا گیا ہے یا نہیں۔ isPressed

DpadControl.ReadValue آپ پریس کی حالت Vector2 حاصل کرنے کے لئے بھی طریقہ استعمال کرسکتے ہیں۔ اگر کچھ نہیں دبایا جاتا ہے (0، 0)، اگر بائیں دبایا جاتا ہے (-1، 0)، وغیرہ۔

اسکرپٹ کو محفوظ کرنے کے بعد EventSystem ، اسے منسلک کریں اور ڈسپلے کے لئے ٹیکسٹ آبجیکٹ سیٹ کریں۔

کھیل کو چلانے اور ڈی پی اے ڈی کے ساتھ بات چیت کرنے کی کوشش کریں۔

Vector2 ویسے، ایک نارملائزڈ حالت میں ہے، لہذا جب آپ تکرار کے ساتھ دباتے ہیں، تو یہ (1، 1) کے بجائے (0.7071، 0.7071) جیسے نمبر کے طور پر حاصل کیا جاتا ہے.

ٹریگر پریس کا تعین کریں

ایکس بکس کنٹرولرز میں بائیں اور دائیں طرف ٹریگر نامی بٹن ہوتے ہیں۔ پلے اسٹیشن پر ، یہ ایل 2 آر 2 سے مطابقت رکھتا ہے۔ یہ بٹن عام بٹن سے مختلف ہے ، اور آپ 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.rightStickGamepad.leftStick۔

آپریشن کنفرمیشن اسکرپٹ کے لئے ، ہم ٹریگر حاصل کرنے کے لئے پہلے استعمال ہونے والے اسکرپٹ کو موڑ دیں گے۔

// 省略

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 اسے پراپرٹی میں حاصل کرسکتے ہیں۔

اصل میں کھیل کو منتقل کرنے اور چھڑی کو چلانے کی کوشش کریں۔

gamepad کی معلومات حاصل کریں

آپ منسلک گیم پیڈ سے آئی ڈی ، نام ، وغیرہ حاصل کرسکتے ہیں۔ مثال کے طور پر ، کنٹرولر کی قسم کی شناخت 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 اسے منسلک کریں اور ڈسپلے کے لئے ٹیکسٹ آبجیکٹ سیٹ کریں۔

یہ دیکھنے کے لئے کھیل چلانے کی کوشش کریں کہ آیا معلومات ظاہر ہوتی ہیں۔