Menu
CoddyTech

Ödüller

Coddy'nin Unity Oyunu: Kule Savunması kursunda ders 13 / 25.

Bir kulenin alt ettiği her düşman, reward kadar ödül kazandırır. Enemy, öldürülme olayını üsse ulaşma olayını bildirdiği gibi bildirir: statik bir olay olan Killed ile; GameManager da bu olayı dinleyip parayı ekler.

Bir öldürme yalnızca bir kez ödül kazandırmalıdır. Destroy bir nesneyi hemen kaldırmaz: nesne kare sonuna kadar kalır ve o zamana dek hâlâ oyundadır. Aynı karede iki atış isabet edebilir ve ikinci atış, hâlâ orada olan, canı 0'a düşmüş bir düşmanla karşılaşır. TakeDamage, can 0 veya altındayken her seferinde öldürme bildirirse ikinci atış da yeniden ödül kazandırır. Dart kullanılan bir balon oyununda da aynı tuzak vardır; bunu bir bool önler:

public void Pop()
{
    if (popped)
    {
        return;
    }

    popped = true;
    Popped?.Invoke(this);
    Destroy(gameObject);
}

Düşmanın ek bir bool'a ihtiyacı yoktur; çünkü canı zaten ölü olup olmadığını gösterir: canı 0 veya altında olan bir düşmanla karşılaşan TakeDamage'in yapacağı başka bir şey yoktur.

challenge icon

Görev

Orta

Her öldürme, düşmanın ödülünü kazandırır.

  1. Enemy içine public static event Action<Enemy> Killed; ekle ve düşman yok edilmeden hemen önce TakeDamage içinde bu olayı tetikle.
  2. Bir öldürmenin ödülü yalnızca bir kez kazandırması için TakeDamage metodunu if (health <= 0) return; ile başlat.
  3. GameManager içine public void Earn(int amount) metodunu ekle (miktarı eklesin ve gösterilsin) ve Enemy.Killed olayına abone olarak enemy.data.reward miktarını kazandır.

“Oyna” düğmesine bas: kuleler çalıştıkça para artar. Ardından “Kontrol et” düğmesine bas.

Kendin dene

using System;
using System.Collections.Generic;
using UnityEngine;

public class Enemy : MonoBehaviour, IDamageable
{
    public static readonly List<Enemy> All = new List<Enemy>();
    public static event Action<Enemy> ReachedBase;

    public EnemyData data;
    public Transform[] waypoints;

    private int next = 1;
    private int health;

    void Awake()
    {
        health = data.maxHealth;
    }

    void OnEnable()
    {
        All.Add(this);
    }

    void OnDisable()
    {
        All.Remove(this);
    }

    void Update()
    {
        Vector3 target = waypoints[next].position;
        transform.position = Vector3.MoveTowards(transform.position, target, data.speed * Time.deltaTime);
        if (transform.position == target)
        {
            next++;
            if (next == waypoints.Length)
            {
                ReachedBase?.Invoke(this);
                Destroy(gameObject);
            }
        }
    }

    public void TakeDamage(int amount)
    {
        health -= amount;
        if (health <= 0)
        {
            Destroy(gameObject);
        }
    }
}
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

Kendi başına pratik yap: Unity playground