Menyiapkan peta tindakan secara dinamis
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.