Field UnityEvent
Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 14 dari 64.
On Click () pada tombol adalah field UnityEvent, dan skripmu sendiri juga bisa memiliki field seperti itu. Field UnityEvent publik muncul di Inspector sebagai jenis daftar yang sama, dan skrip memicunya dengan Invoke() tanpa mengetahui apa yang dihubungkan ke sana. Hitung mundur ini berjalan sekali setiap detik:
using UnityEngine;
using UnityEngine.Events;
public class Countdown : MonoBehaviour
{
public int seconds = 3;
public UnityEvent<int> onTick;
public UnityEvent onFinished;
void Start()
{
InvokeRepeating("Tick", 1f, 1f);
}
void Tick()
{
seconds--;
onTick.Invoke(seconds);
if (seconds == 0)
{
CancelInvoke("Tick");
onFinished.Invoke();
}
}
}Di Inspector, On Finished () menerima baris seperti tombol: satu baris meluncurkan roket, baris lain membuka gerbang. Level lain menggunakan kembali Countdown yang sama dengan baris lain, dan tidak ada yang perlu menulis skrip baru. UnityEvent<int> meneruskan nilai. Di menu tarik-turunnya, metode yang menerima int tercantum di bawah Dynamic int, dan baris itu menerima nilai yang diberikan ke Invoke, dalam kasus ini jumlah detik yang tersisa. Metode yang sama di bawah Static Parameters justru menerima angka yang diketik ke dalam baris, dan metode tanpa parameter juga bisa dihubungkan.
Unity membuat field UnityEvent saat memuat skrip, jadi onTick tidak pernah null dan tidak memerlukan ?., dan kode bisa menambahkan listener dengan onTick.AddListener(ShowSeconds). Pilih UnityEvent saat responsnya berbeda-beda untuk setiap objek dan diatur di Inspector, olehmu atau oleh desainer yang tidak pernah membuka skrip. Pilih event C# saat kode yang mendengarkan: compiler memeriksa nama metode, jadi perubahan nama akan membuat build gagal alih-alih membiarkan baris <Missing> tanpa disadari, dan event C# tidak pernah muncul di Inspector.
Tantangan
MudahBerikan FinishLine event yang terhubung ke baris-baris di scene.
- Tambahkan
using UnityEngine.Events;,public UnityEvent<int> onLap;,public UnityEvent onRaceOver;, dan sebuah int private untuk jumlah putaran yang sudah selesai. - Di
OnTriggerEnter, saatothermemiliki tagPlayer, hitung putarannya dan panggilonLap.Invokedengan jumlah putaran yang sudah selesai. - Saat jumlahnya mencapai
laps, panggilonRaceOver.Invoke(); setelah itu, menyentuh garis finis lagi tidak melakukan apa pun.
Tekan tombol “Main” dan kendarai mobil selama tiga putaran. Lalu tekan tombol “Periksa”.
Coba sendiri
using UnityEngine;
public class FinishLine : MonoBehaviour
{
public int laps = 3;
void OnTriggerEnter(Collider other)
{
// Mobil melewati garis finis: satu putaran lagi selesai
}
}
Semua pelajaran di Arsitektur Game di Unity
1Komponen, Bukan Hierarki
Komponen KecilSkrip Dasar MusuhKomponen AbstrakKomponen yang Bekerja BersamaRangkuman: Turret ModularRangkuman: Meriam Kembar4Data yang Diserialisasi
Class yang Dapat DiserialisasiList di InspectorEnum di InspectorRangkuman: Tabel LootRangkuman: Acak Loot2Antarmuka di Unity
IDamageableAntarmuka dan TryGetComponentGetComponentsRingkasan: Tombol InteractRingkasan: Terdekat dalam Jangkauan5ScriptableObjects
Aset DataStatistik SenjataPengaturan BersamaSelamatkan AnginGelombang sebagai DataRekap: database ItemBeli dari Toko8Kode yang Dapat Digunakan Kembali
Extension methodSingleton GenerikHelper GenerikUlasan: FindNearestLatihan sendiri: Playground Unity