تنظیم یک نقشه عمل به صورت پویا

صفحه به روز شده :
تاریخ ایجاد صفحه :

محیط تایید

ویندوز
  • ویندوز 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 می خواهید برای پیاده سازی در این زمینه. در اینجا، ما زمینه ها را برای "Move" و "Attack" اماده می کنیم که در توضیح نقشه عمل قبلی نیز استفاده شده است. اگر تعداد اقدامات افزایش یابد، شما باید این تعداد را اعلام کنید، اما اگر تعداد زیادی وجود 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 را به فاصله تغییر دهید. علاوه بر این، اگر می خواهید از کلید فضا به کلید x تغییر دهید، توضیحات برای کلید z به جای بر اساس فضا، به شرح زیر است.

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

پس از ذخیره، بازی را اجرا کنید و روی دکمه کلیک کنید تا ببینید ایا کلیدها یا دکمه هایی که با انها ارتباط برقرار می کنید تغییر می کنند.

InputAction این بار، ما در حال تغییر نقشه عمل برای یکی که یک نمونه از ، همچنین InputAction یک اسکریپت تولید شده توسط تنظیم نقشه عمل GUI وجود دارد، بنابراین لطفا ان را در یکی که اسان است انجام دهید.