Menu
CoddyTech

Ödüller

Coddy'nin Unity Oyunu: Kule Savunması kursunda ders 10 / 18.

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
  1. Enemy içinde bir public static Killed olayı (Action<Enemy>) tanımla. TakeDamage canını 0'a veya altına düşürdüğünde, düşmanı yok etmeden hemen önce olayı düşmanla birlikte tetikle.
  2. Bir öldürme yalnızca bir kez ödül kazandırır: canı zaten 0 veya altındayken bir düşmanda TakeDamage çağrılırsa hiçbir şey yapmaz.
  3. GameManager içinde parayı artıran ve gösteren public void Earn(int amount) metodunu ekle. Enemy.Killed olayına ReachedBase olayının yanında abone ol ve öldürülen düşmanın reward değerini kazandır.

Play'e bas ve kuleler çalışırken paranın artışını izle, ardından Check'e 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