UnityEvent Alanları
Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 14 / 64.
Bir düğmenin Tıklanınca () olayı bir UnityEvent alanıdır ve kendi betiklerinizde de böyle bir alan olabilir. Genel erişimli 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 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 Tamamlandığında (), bir düğmeninki 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 iletir. Açılır menüsünde int alan bir yöntem Dinamik int altında listelenir ve bu satır, burada kalan saniye sayısı olan Invoke'a verilen değeri alır. Aynı yöntem Statik Parametreler altında kullanıldığında bunun yerine satıra yazılan sayıyı alır; parametre almayan yöntemler de bağlanabilir.
Unity, betiği yüklediğinde bir UnityEvent alanı oluşturur; bu nedenle onTick hiçbir zaman null olmaz ve ?. gerekmez. Ayrıca kod, onTick.AddListener(ShowSeconds) ile dinleyiciler ekleyebilir. Tepkinin nesneden nesneye farklılık gösterdiği ve Inspector'da sizin ya da betiği hiç açmayan bir tasarımcının ayarladığı durumlarda UnityEvent seçin. Kod dinlediğinde C# olayı 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 bir C# olayı Inspector'da hiçbir zaman görünmez.
Görev
KolayFinishLine öğesine, sahnedeki satırların bağlandığı olayları ekle.
using UnityEngine.Events;,public UnityEvent<int> onLap;,public UnityEvent onRaceOver;ve tamamlanan tur sayısı için bir private int ekle.OnTriggerEnteriçinde,otheretiketiPlayerolduğunda turu say ve tamamlanan tur sayısınıonLap.Invokeile ilet.lapssayısına ulaşıldığındaonRaceOver.Invoke()çağır; bundan sonra bitiş çizgisini geçmenin bir etkisi olmasın.
“Oyna” düğmesine bas ve üç tur sür. Ardından “Kontrol et” düğmesine 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ı
}
}
Unity'de Oyun Mimarisi bölümündeki tüm dersler
1Kalıtım Değil, Bileşenler
Küçük BileşenlerTemel Düşman Script'iSoyut BileşenlerBirlikte Çalışan BileşenlerTekrar: Modüler TaretTekrar: Çift Namlulu Top4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larTekrar: Ganimet TablosuTekrar: Ganimeti At2Unity'de Arayüzler
IDamageableArayüzler ve TryGetComponentGetComponentsÖzet: Etkileşim TuşuÖzet: Erişim Mesafesindeki En Yakın5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriOrtak AyarlarRüzgârı KaydetVeri Olarak DalgalarTekrar: Eşya VeritabanıTekrar: Dükkândan Satın Al8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearestKendi başına pratik yap: Unity playground