متحرک طور پر ایک ایکشن نقشہ مرتب کریں

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

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

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

جب کسی بٹن کو چلایا جاتا ہے تو ایونٹ ہینڈلنگ عام ایکشن نقشے کے اسکرپٹڈ ورژن کی پروسیسنگ کی طرح ہی ہوتی ہے۔ کال بیک کے عمل کو بھی اسی طرح موڑ دیا جاتا ہے۔

// 操作時のイベントを設定
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 جس کلید یا بٹن کو آپ اووررائڈ کرنا چاہتے ہیں اس کا راستہ لکھیں۔

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

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

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

InputAction اس بار، ہم اس کے لئے ایکشن نقشہ تبدیل کر رہے ہیں جس نے ایک مثال بنائی ہے، جی یو آئی کے ایکشن میپ سیٹنگ کے ذریعہ ایک اسکرپٹ بھی InputAction تیار کیا گیا ہے ، لہذا براہ کرم اسے اس میں لاگو کریں جو کرنا آسان ہے۔