הגדרת מפת פעולות באופן דינמי

עודכן דף :
תאריך יצירת דף :

סביבת אימות

חלונות
  • חלונות 11
עורך Unity
  • 2020.3.25F1
חבילת מערכת קלט
  • 1.2.0

תנאים מוקדמים לטיפ זה

ההגדרות הבאות נקבעו מראש כהנחת יסוד לתיאור עצה זו.

כדאי שתכירו גם את הטיפים הבאים:

אודות תצורת מפת פעולות דינאמית

מקובל להוסיף ולהגדיר מפות פעולה לפרויקט מראש, במקרה זה, הקצאות לחצן הבקר קבועות במהלך ביצוע המשחק והמשתמש אינו יכול לשנות אותן באופן חופשי במהלך המשחק. זה צפוי בעיקר עבור משחקים הדורשים תצורת מפתח.

עצה זו מתארת כיצד לשנות באופן שרירותי את הקצאות המפתח של מפת פעולות בקובץ Script.

טיפול דינמי בשינויי מפת פעולה

הפעם, מפת הפעולה הראשונית נקבעת גם היא על ידי הסקריפט, ושינוי מפת הפעולה באמצע נעשה גם בתסריט. אני חושב ששיטה זו משמשת בעת טעינה והגדרה של תצורת המפתח שנשמרה בעת הפעלת המשחק.

תוכן הדוגמה הוא לשנות את הקצאת המפתח של מפת הפעולות בעת לחיצה על הלחצן, ולהציג את התוכן המופעל כטקסט. מיקום הלחצנים וטקסט התצוגה מסודרים כפי שמוצג באיור, אך הם אינם חשובים במיוחד, לכן אנא מקם אותם באופן חופשי.

תהליך קביעת התצורה הראשונית של מפת הפעולות

צור קובץ Script. השם שרירותי, אבל במקרה 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 המחרוזת שצוינה עבור Method, וכן הלאה, זהה למחרוזת המוצגת ב- Path במסך ההגדרות של מפת הפעולות. כדי להציג מחרוזת תווים, לחץ על הלחצן "T" מימין.

הטיפול באירועים שנקרא בעת הפעלת לחצן זהה לעיבוד של גירסת script של מפת פעולות רגילה. גם תהליך ההתקשרות החוזרת מוסט כפי שהוא.

// 操作時のイベントを設定
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 כתוב את הנתיב של המקש או הלחצן שברצונך לדרוס.

אגב, זה רק הגדרת נתיב ההחלפה, כך שהנתיב המקורי נשאר כפי שהוא. לדוגמה, בפעולה Attack, שנה את מקש z למקש הרווח. יתר על כן, אם ברצונך לשנות ממקש רווח למקש x, התיאור יוחלף עבור מקש z במקום להתבסס על רווח, באופן הבא.

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

לאחר השמירה, הפעל את המשחק ולחץ על הלחצן כדי לראות אם המקשים או הלחצנים שאתה מקיים איתם אינטראקציה משתנים.

InputAction הפעם, אנו משנים את מפת הפעולה עבור זו שיצרה מופע של , יש גם InputAction סקריפט שנוצר על ידי הגדרת מפת הפעולה של ממשק המשתמש הגרפי, אז אנא יישם אותו בזה שקל לעשות.