إعداد خريطة إجراءات ديناميكيا

تحديث الصفحة :
تاريخ إنشاء الصفحة :

بيئة التحقق

نوافذ
  • ويندوز ١١
محرر الوحدة
  • 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 بك ، فيمكنك إدارته هناك.

يتم تنفيذ إنشاء مثيل وتعيين AddBinding المفتاح بالطريقة المسماة InputAction Awake عند التهيئة. يمكنك التفكير في ما تفعله كبرنامج يضيف ربطا على شاشة إعداد خريطة العمل. AddBinding السلسلة المحددة للطريقة وما إلى ذلك هي نفسها السلسلة المعروضة في المسار على شاشة إعداد خريطة الإجراءات. لعرض سلسلة أحرف ، اضغط على الزر "T" على اليمين.

معالجة الحدث التي يتم استدعاؤها عند تشغيل زر هي نفس معالجة الإصدار النصي لخريطة الإجراءات العادية. يتم أيضا تحويل عملية رد الاتصال كما هي.

// 操作時のイベントを設定
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 اكتب مسار المفتاح أو الزر الذي تريد تجاوزه.

بالمناسبة ، هذا هو مجرد تعيين مسار الكتابة فوقها ، لذلك يبقى المسار الأصلي كما هو. على سبيل المثال، في إجراء هجوم، قم بتغيير المفتاح z إلى مفتاح المسافة. علاوة على ذلك ، إذا كنت تريد التغيير من مفتاح space إلى x ، الكتابة فوق الوصف لمفتاح z بدلا من الاعتماد على المساحة ، على النحو التالي.

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

بمجرد الحفظ ، قم بتشغيل اللعبة وانقر فوق الزر لمعرفة ما إذا كانت المفاتيح أو الأزرار التي تتفاعل معها تتغير.

InputAction هذه المرة ، نقوم بتغيير خريطة العمل لتلك التي أنشأت مثيل ، يوجد أيضا InputAction برنامج نصي تم إنشاؤه بواسطة إعداد خريطة العمل لواجهة المستخدم الرسومية ، لذا يرجى تنفيذه في البرنامج الذي يسهل القيام به.