Menyiapkan peta tindakan secara dinamis

Halaman Diperbarui :
Tanggal pembuatan halaman :

Lingkungan verifikasi

Windows
  • jendela 11
Editor Kesatuan
  • 25f1/3/2020
Paket Sistem Input
  • 1.2.0

Prasyarat untuk tip ini

Pengaturan berikut telah dibuat sebelumnya sebagai premis untuk deskripsi tip ini.

Anda juga harus terbiasa dengan tips berikut:

Tentang konfigurasi peta tindakan dinamis

Adalah umum untuk menambah dan mengatur peta tindakan ke proyek terlebih dahulu, Dalam hal ini, penetapan tombol pengontrol ditetapkan selama eksekusi game dan tidak dapat diubah secara bebas oleh pengguna selama game. Ini terutama diharapkan untuk game yang membutuhkan konfigurasi kunci.

Tips ini menjelaskan cara mengubah penetapan kunci peta tindakan dalam skrip secara sewenang-wenang.

Penanganan perubahan peta tindakan dinamis

Kali ini, peta tindakan awal juga diatur oleh skrip, dan perubahan peta tindakan di tengah juga dilakukan dalam skrip. Saya pikir metode ini digunakan saat memuat dan mengatur konfigurasi kunci yang disimpan saat startup game.

Isi sampel adalah untuk mengubah penetapan kunci dari peta tindakan ketika Anda menekan tombol, dan untuk menampilkan konten yang dioperasikan sebagai teks. Penempatan tombol dan teks tampilan diatur seperti yang ditunjukkan pada gambar, tetapi tidak terlalu penting, jadi harap letakkan dengan bebas.

Proses Konfigurasi Awal Peta Tindakan

Buat skrip. Namanya sewenang-wenang, tetapi dalam kasus InputActionMap ini adalah . Kali ini, semua proses akan dijelaskan di sini, tetapi dalam produksi yang sebenarnya, silakan bagi sesuai dengan pembuatan proyek.

Skripnya terlihat seperti ini: Pertama, buat peta tindakan default saat startup.

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 sebanyak mungkin tindakan di kelas yang ingin Anda InputAction terapkan di lapangan. Di sini, kita akan menyiapkan kolom untuk "Move" dan "Attack", yang juga digunakan dalam penjelasan action map sebelumnya. Jika jumlah tindakan meningkat, Anda perlu mendeklarasikan jumlah itu, tetapi jika ada List Dictionary banyak, Anda dapat mengelolanya dengan , , dll. Ini tidak digunakan di sini, tetapi jika Anda memiliki kelas sendiri InputActionMap , Anda dapat mengelolanya di sana.

Instantiasi dan penetapan AddBinding kunci dalam metode yang InputAction disebut Awake saat inisialisasi dilakukan. Anda dapat memikirkan apa yang Anda lakukan sebagai program yang menambahkan pengikatan pada layar pengaturan peta tindakan. AddBinding String yang ditentukan untuk Metode, dll. sama dengan string yang ditampilkan di Jalur pada layar pengaturan peta tindakan. Untuk menampilkan string karakter, tekan tombol "T" di sebelah kanan.

Penanganan peristiwa yang dipanggil saat tombol dioperasikan sama dengan pemrosesan versi skrip peta tindakan normal. Proses callback juga dialihkan apa adanya.

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

Aktifkan, Nonaktifkan adalah InputAction unit, jadi jelaskan tindakan sebanyak yang Anda inginkan. Jika merepotkan, Anda dapat mengelolanya List dengan dll.

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

Setelah EventSystem Anda menyimpan skrip, lampirkan ke dan konfigurasikan objek teks untuk ditampilkan.

Jalankan game dan lihat apakah informasi input muncul. Hasilnya harus sama dengan versi skrip dari proses statis peta tindakan.

Peta Tindakan Pemrosesan Perubahan Dinamis

Karena perubahan dinamis dari peta tindakan dilakukan ketika tombol ditekan, tentukan metode yang akan dipanggil ketika tombol ditekan. OnClickButton Untuk saat ini, kami akan membiarkannya sebagai .

// 省略

public class InputActionMap : MonoBehaviour
{
  // 省略

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

Mengatur peristiwa klik untuk tombol.

Proses penulisan ulang peta tindakan adalah sebagai 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" });
}

Karena metode disediakan untuk ApplyBindingOverride setiap tindakan, jalur kunci atau tombol yang diinisialisasi ke , path overridePath Tulis jalur kunci atau tombol yang ingin Anda ganti.

Omong-omong, ini hanya mengatur jalur timpa, sehingga jalur asli tetap seperti apa adanya. Misalnya, dalam tindakan Serangan, ubah tombol z ke bilah spasi. Selanjutnya, jika Anda ingin mengubah dari spasi ke tombol x, deskripsi akan ditimpa untuk tombol z, bukan berdasarkan spasi, sebagai berikut.

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

Setelah disimpan, jalankan game dan klik tombol untuk melihat apakah tombol atau tombol yang berinteraksi dengan Anda berubah.

InputAction Kali ini, kita mengubah peta tindakan untuk peta tindakan yang membuat instance , Ada juga InputAction skrip yang dihasilkan oleh pengaturan peta tindakan GUI, jadi harap terapkan di salah satu yang mudah dilakukan.