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.
Görev
KolayAdanı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
onLapve hiçbir şey iletmeyenonRaceOver. - Araba (
Playeretiketiyle etiketlenmiş) çizgiye her girdiğinde bir tur tamamlanır:onLapolayı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ı
lapsdeğerine (3) ulaştığındaonRaceOverolayı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ı
}
}
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
1Hiyerarşiler Değil, Bileşenler
Küçük BileşenlerTemel Bir Düşman BetiğiSoyut BileşenlerBirlikte Çalışan BileşenlerÖzet: Modüler Taret4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larÖzet: Ganimet Tablosu7Durum Makineleri
Sınıflar Olarak DurumlarBir Durum MakinesiGeçişlerDüşmanların Yapay ZekâsıTekrar: Kapı Durumları10Proje: Arena Hayatta Kalma
KahramanDüşman Türleri5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriPaylaşılan AyarlarVeri Olarak DalgalarTekrar: Eşya Veritabanı8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearest3Olaylar
Unity'de C# OlaylarıOnEnable'da Abone OlmaUnityEvent AlanlarıOlaylar Arayüzü YönlendirirTekrar: Başarım Açılır Penceresi