Menyediakan peta tindakan secara dinamik

Laman dikemaskini :
Tarikh penciptaan halaman :

Persekitaran pengesahan

Windows
  • Windows 11
Penyunting Perpaduan
  • 2020.3.25f1
Pakej Sistem Input
  • 1.2.0

Prasyarat untuk petua ini

Tetapan berikut telah dibuat terlebih dahulu sebagai premis untuk penerangan petua ini.

Anda juga harus biasa dengan petua berikut:

Perihal konfigurasi peta tindakan dinamik

Adalah perkara biasa untuk menambah dan menetapkan peta tindakan kepada projek terlebih dahulu, Dalam kes ini, tugasan butang pengawal ditetapkan semasa pelaksanaan permainan dan tidak boleh diubah secara bebas oleh pengguna semasa permainan. Ini terutamanya dijangka untuk permainan yang memerlukan konfigurasi utama.

Petua ini menerangkan cara sewenang-wenangnya menukar tugasan utama peta tindakan dalam skrip.

Pengendalian perubahan peta tindakan dinamik

Kali ini, peta tindakan awal juga ditetapkan oleh skrip, dan perubahan peta tindakan di tengah juga dilakukan dalam skrip. Saya rasa kaedah ini digunakan semasa memuatkan dan menetapkan konfigurasi kunci yang disimpan pada permulaan permainan.

Kandungan sampel adalah untuk mengubah tugasan utama peta tindakan apabila anda menekan butang dan memaparkan kandungan yang dikendalikan sebagai teks. Penempatan butang dan teks paparan disusun seperti yang ditunjukkan dalam gambar, tetapi mereka tidak begitu penting, jadi sila letakkannya dengan bebas.

Proses Konfigurasi Awal Peta Tindakan

Buat skrip. Nama itu sewenang-wenangnya, tetapi dalam kes InputActionMap ini ia adalah . Kali ini, semua proses akan diterangkan di sini, tetapi dalam pengeluaran sebenar, sila bahagikannya mengikut penciptaan projek.

Skrip kelihatan seperti ini: Mula-mula, buat peta tindakan lalai semasa permulaan.

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}";
  }
}

Pertama, tentukan seberapa banyak tindakan dalam kelas yang anda InputAction mahu laksanakan di lapangan. Di sini, kami akan menyediakan medan untuk "Move" dan "Attack", yang juga digunakan dalam penjelasan peta tindakan sebelumnya. Sekiranya bilangan tindakan meningkat, anda perlu mengisytiharkan nombor itu, tetapi jika terdapat List Dictionary banyak, anda boleh menguruskannya dengan , dan sebagainya. Ia tidak digunakan di sini, tetapi jika anda mempunyai kelas anda sendiri InputActionMap , anda boleh menguruskannya di sana.

Instantiation dan tugasan AddBinding utama dalam kaedah yang InputAction dipanggil Awake pada permulaan dilakukan. Anda boleh memikirkan apa yang anda lakukan sebagai program yang menambah pengikatan pada skrin tetapan peta tindakan. AddBinding Rentetan yang ditentukan untuk Kaedah, dsb. adalah sama dengan rentetan yang dipaparkan dalam Laluan pada skrin tetapan peta tindakan. Untuk memaparkan rentetan aksara, tekan butang "T" di sebelah kanan.

Pengendalian acara yang dipanggil apabila butang dikendalikan adalah sama dengan pemprosesan versi skrip peta tindakan biasa. Proses panggil balik juga dialihkan seperti sedia ada.

// 操作時のイベントを設定
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}";
}

Dayakan, Lumpuhkan adalah InputAction unit, jadi terangkan seberapa banyak tindakan yang anda mahukan. Sekiranya menyusahkan, anda boleh menguruskannya List dengan dsb.

private void OnEnable()
{
  // オブジェクトが有効になったときにアクションマップを有効にする
  MoveAction.Enable();
  AttackAction.Enable();
}

Selepas EventSystem anda menyimpan skrip, lampirkannya dan konfigurasikan objek teks untuk paparan.

Jalankan permainan dan lihat sama ada maklumat input muncul. Hasilnya hendaklah sama dengan versi skrip proses statik peta tindakan.

Peta Tindakan Pemprosesan Perubahan Dinamik

Oleh kerana perubahan dinamik peta tindakan dilakukan apabila butang ditekan, tentukan kaedah yang akan dipanggil apabila butang ditekan. OnClickButton Buat masa ini, kami akan meninggalkannya sebagai .

// 省略

public class InputActionMap : MonoBehaviour
{
  // 省略

  /// <summary>
  /// ボタンをクリックしたときに呼ばれる。
  /// </summary>
  public void OnClickButton()
  {
  }
}

Tetapkan acara klik untuk butang.

Proses penulisan semula peta tindakan adalah seperti berikut:

/// <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" });
}

Oleh kerana kaedah disediakan untuk setiap tindakan, laluan kunci atau butang yang dimulakan untuk ApplyBindingOverride , path overridePath Tulis laluan kekunci atau butang yang ingin anda lalui.

Dengan cara ini, ini hanya menetapkan laluan overwrite, jadi laluan asal kekal seperti sedia ada. Sebagai contoh, dalam tindakan Serangan, tukar kekunci z ke bar ruang. Tambahan pula, jika anda ingin menukar dari ruang ke kekunci x, perihalan akan ditulis ganti untuk kekunci z dan bukannya berdasarkan ruang, seperti berikut.

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

Setelah disimpan, jalankan permainan dan klik butang untuk melihat sama ada kekunci atau butang yang anda berinteraksi dengan perubahan.

InputAction Kali ini, kami mengubah peta tindakan untuk yang mencipta contoh , Terdapat juga InputAction skrip yang dihasilkan oleh tetapan peta tindakan GUI, jadi sila laksanakan dalam skrip yang mudah dilakukan.