Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Berikan FinishLine event yang terhubung ke baris-baris di scene.

  1. Tambahkan using UnityEngine.Events;, public UnityEvent<int> onLap;, public UnityEvent onRaceOver;, dan sebuah int private untuk jumlah putaran yang sudah selesai.
  2. Di OnTriggerEnter, saat other memiliki tag Player, hitung putarannya dan panggil onLap.Invoke dengan jumlah putaran yang sudah selesai.
  3. Saat jumlahnya mencapai laps, panggil onRaceOver.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

Latihan sendiri: Playground Unity