Menu
CoddyTech

UnityEvent Alanları

Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 12 / 50.

Bir Button'ın On Click () öğesi bir UnityEvent alanıdır; kendi betiklerinizde de böyle bir alan bulunabilir. Genel bir UnityEvent alanı Inspector'da aynı türde bir liste olarak görünür ve betik, bu alana neyin bağlandığını bilmeden Invoke() ile olayı tetikler. Bu geri sayım saniyede bir kez ilerler:

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();
        }
    }
}

Inspector'da On Finished (), bir düğmedeki gibi satırlar içerir: bir satır roketi fırlatır, diğeri kapıyı açar. Başka bir seviye, farklı satırlarla aynı Countdown'ı yeniden kullanır ve kimse yeni bir betik yazmaz. UnityEvent<int> bir değer aktarır. Açılır menüsünde int alan bir yöntem Dynamic int altında listelenir ve bu satır, burada kalan saniye sayısı olmak üzere, Invoke'a verilen değeri alır. Static Parameters altında aynı yöntem yerine satıra yazılan bir sayıyı alır; parametresiz yöntemleri de bağlayabilirsiniz.

Unity, betiği yüklerken bir UnityEvent alanı oluşturur; bu nedenle onTick hiçbir zaman null olmaz ve ?. gerektirmez. Ayrıca kod, onTick.AddListener(ShowSeconds) ile dinleyiciler ekleyebilir. Tepkime nesneden nesneye değişiyorsa ve Inspector'da sizin ya da betiği hiç açmayan bir tasarımcının ayarlaması gerekiyorsa UnityEvent seçin. Kod dinliyorsa C# event seçin: derleyici yöntem adlarını denetler, böylece bir yeniden adlandırma sessizce bir <Missing> satırı bırakmak yerine derlemenin başarısız olmasına neden olur; ayrıca C# event Inspector'da hiçbir zaman görünmez.

challenge icon

Görev

Kolay

Adanın çevresinde üç turluk bir yarış. Oklar arabayı sürer (Car.cs) ve sahne, bir tasarımcının Inspector'da bağlayacağı şekilde ayarlanmıştır: FinishLine'ın On Lap (Int32) listesi, LapText üzerindeki LapBoard.ShowLaps (Dynamic int) metodunu ve Crowd üzerindeki Crowd.Cheer metodunu çağırır; On Race Over () listesi ise LapBoard.ShowFinished ve Car.Stop metodlarını çağırır. Bu betikler hazır, ancak FinishLine'da olaylar olana kadar satırlara bağlanacak hiçbir şey yok.

FinishLine.cs dosyasını yaz:

  • İki UnityEvent alanı: int ileten onLap ve hiçbir şey iletmeyen onRaceOver.
  • Araba (Player etiketiyle etiketlenmiş) çizgiye her girdiğinde bir tur tamamlanır: onLap olayını tamamlanan tur sayısıyla çağır (önce 1, sonra 2, sonra 3). Çizgiyi geçen başka hiçbir şey sayılmaz.
  • Tamamlanan tur sayısı laps değerine (3) ulaştığında onRaceOver olayını çağır. Bundan sonra çizgiyi geçmek hiçbir etki yaratmaz.

Play'e bas, adanın çevresinde üç tur sür, ardından Check'e bas.

Kendin dene

using UnityEngine;

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

    void OnTriggerEnter(Collider other)
    {
        // araba çizgiyi geçti: bir tur daha tamamlandı
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Unity'de Oyun Mimarisi bölümündeki tüm dersler