Menu
CoddyTech

Field UnityEvent

Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 12 dari 50.

On Click () pada sebuah Button adalah field UnityEvent, dan skripmu sendiri juga bisa memiliki field seperti itu. Field UnityEvent publik muncul di Inspector sebagai daftar dengan jenis yang sama, dan skrip memicunya dengan Invoke() tanpa mengetahui apa yang terhubung ke field tersebut. Hitung mundur ini berdetak 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 pada Button: satu baris meluncurkan roket, baris lain membuka gerbang. Level lain menggunakan kembali Countdown yang sama dengan baris berbeda, dan tidak ada yang perlu menulis skrip baru. UnityEvent<int> meneruskan sebuah nilai. Di menu dropdown-nya, method yang menerima int tercantum di bawah Dynamic int, dan baris itu menerima nilai yang diberikan ke Invoke, dalam contoh ini sisa detiknya. Method yang sama di bawah Static Parameters akan menerima angka yang diketik ke dalam baris, dan method 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 reaksinya berbeda-beda untuk setiap object dan diatur di Inspector, olehmu atau oleh desainer yang tidak pernah membuka skrip. Pilih event C# saat kode menjadi pendengarnya: compiler memeriksa nama method, sehingga perubahan nama akan membuat build gagal alih-alih meninggalkan baris <Missing> tanpa pemberitahuan, dan event C# tidak pernah muncul di Inspector.

challenge icon

Tantangan

Mudah

Balapan tiga putaran mengelilingi pulau. Panah mengendalikan mobil (Car.cs), dan scene dihubungkan seperti yang akan dilakukan seorang desainer di Inspector: daftar On Lap (Int32) milik FinishLine memanggil LapBoard.ShowLaps (Dynamic int) pada LapText dan Crowd.Cheer pada Crowd, sedangkan daftar On Race Over () miliknya memanggil LapBoard.ShowFinished dan Car.Stop. Skrip-skrip itu sudah siap, tetapi baris-barisnya belum bisa dihubungkan ke apa pun sampai FinishLine memiliki event.

Tulis FinishLine.cs:

  • Dua field UnityEvent: onLap, yang mengirimkan int, dan onRaceOver, yang tidak mengirimkan apa pun.
  • Setiap kali mobil (dengan tag Player) memasuki garis, satu putaran selesai: panggil onLap dengan jumlah putaran yang sudah selesai (1, lalu 2, lalu 3). Tidak ada hal lain yang melintasi garis dihitung.
  • Saat jumlah putaran yang selesai mencapai laps (3), panggil onRaceOver. Setelah itu, melintasi garis tidak akan melakukan apa pun.

Tekan Play, kendarai mobil menyelesaikan tiga putaran mengelilingi pulau, lalu tekan Check.

Coba sendiri

using UnityEngine;

public class FinishLine : MonoBehaviour
{
    public int laps = 3;

    void OnTriggerEnter(Collider other)
    {
        // mobil melewati garis finis: satu putaran lagi selesai
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Arsitektur Game di Unity