Ö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.
Görev
OrtaEnemyiçinde bir public staticKilledolayı (Action<Enemy>) tanımla.TakeDamagecanını 0'a veya altına düşürdüğünde, düşmanı yok etmeden hemen önce olayı düşmanla birlikte tetikle.- 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. GameManageriçinde parayı artıran ve gösterenpublic void Earn(int amount)metodunu ekle.Enemy.KilledolayınaReachedBaseolayının yanında abone ol ve öldürülen düşmanınrewarddeğ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);
}
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.