Menu
CoddyTech

Ü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.

challenge icon

Görev

Kolay

Üssün can puanına ihtiyacı var ve üsse ulaşan bir düşman bu puanları azaltmalı.

  1. EnemyData içinde, bu türün üsten kaç can puanı götüreceğini belirten bir public int damage ekle.
  2. Enemy içinde, düşmanı (Action<Enemy>) parametre olarak alan bir public static event ReachedBase tanımla. Düşman son kontrol noktasına ulaştığında, orada durmak yerine olayı kendisini kullanarak tetikle ve düşmanı yok et.
  3. GameManager içinde, serileştirilmiş bir int startLives (20) ve başlangıç değeri bu olan bir private int lives ekle. OnEnable içinde Enemy.ReachedBase olayına abone ol ve OnDisable içinde aboneliği kaldır. Üssü geçen her düşman, asset’indeki damage kadar can puanını azaltır.
  4. Can puanlarını, serileştirilmiş bir TMP_Text livesText içinde Lives: 20 biç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++;
        }
    }
}
quiz iconKendini test et

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

Unity Oyunu: Kule Savunması bölümündeki tüm dersler