Üsse Ulaş
Coddy'nin Unity Oyunu: Kule Savunması kursunda ders 3 / 18.
Son kontrol noktasına yürüyen bir düşman üsse ulaşmıştır: oyuncu can kaybeder ve düşman gider. Canlar, onları ekranda gösteren GameManager'a aittir. Düşmanın bunu bildirmek için GameManager'a başvurması gerekmemelidir: yakında düşmanlar bir prefab'dan onlarca kopya hâlinde oluşturulacak ve bir prefab sahnedeki bir nesneye işaret edemez.
Statik bir olay her iki sorunu da çözer. Tek bir düşmana değil, Enemy sınıfına aittir; bu nedenle GameManager bir kez abone olur ve sonradan oluşturulanlar da dâhil her düşmandan haberdar olur. Her düşman olayı kendisini argüman olarak göndererek tetikler; böylece dinleyici hangi türün geçtiğini okuyabilir. Bir platform oyunundaki jeton da aynı şekilde bildirimde bulunur:
public class Coin : MonoBehaviour
{
public static event Action<Coin> Collected;
public int value = 1;
void OnTriggerEnter(Collider other)
{
Collected?.Invoke(this);
Destroy(gameObject);
}
}// ScoreBoard.cs
void OnEnable()
{
Coin.Collected += AddCoin;
}
void OnDisable()
{
Coin.Collected -= AddCoin;
}
void AddCoin(Coin coin)
{
score += coin.value;
}Statik bir olay oyun sürdüğü müddetçe varlığını korur; bu yüzden -= her zamankinden daha önemlidir: yok edilmiş ama abonelikten hiç çıkmamış bir ScoreBoard yine de çağrılır ve kodu yok edilmiş metnine erişmeye çalışırken hata verir. OnEnable ve OnDisable eşleşerek çalışır; bu yüzden her += için bir -= gerekir.
Görev
KolayÜssün can puanına ihtiyacı var ve üsse ulaşan bir düşman bu puanları azaltmalı.
EnemyDataiçinde, bu türün üsten kaç can puanı götüreceğini belirten bir public intdamageekle.Enemyiçinde, düşmanı (Action<Enemy>) parametre olarak alan bir public static eventReachedBasetanımla. Düşman son kontrol noktasına ulaştığında, orada durmak yerine olayı kendisini kullanarak tetikle ve düşmanı yok et.GameManageriçinde, serileştirilmiş bir intstartLives(20) ve başlangıç değeri bu olan bir private intlivesekle.OnEnableiçindeEnemy.ReachedBaseolayına abone ol veOnDisableiçinde aboneliği kaldır. Üssü geçen her düşman, asset’indekidamagekadar can puanını azaltır.- Can puanlarını, serileştirilmiş bir TMP_Text
livesTextiçindeLives: 20biçiminde, başlangıçta ve her değişiklikten sonra göster.
Game nesnesinde GameManager bulunuyor, Inspector’da LivesText bağlantısı yapılmış ve her iki asset de 1 can puanı götürüyor. Play’e bas, her iki düşmanın üsse ulaşmasını bekle, ardından Check’e bas.
Kendin dene
using UnityEngine;
public class Enemy : MonoBehaviour
{
public EnemyData data;
public Transform[] waypoints;
private int next = 1;
private int health;
void Awake()
{
health = data.maxHealth;
}
void Update()
{
if (next >= waypoints.Length)
{
return;
}
Vector3 target = waypoints[next].position;
transform.position = Vector3.MoveTowards(transform.position, target, data.speed * Time.deltaTime);
if (transform.position == target)
{
next++;
}
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.