Ö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.
Görev
OrtaHer öldürme, düşmanın ödülünü kazandırır.
Enemyiçinepublic static event Action<Enemy> Killed;ekle ve düşman yok edilmeden hemen önceTakeDamageiçinde bu olayı tetikle.- Bir öldürmenin ödülü yalnızca bir kez kazandırması için
TakeDamagemetodunuif (health <= 0) return;ile başlat. GameManageriçinepublic void Earn(int amount)metodunu ekle (miktarı eklesin ve gösterilsin) veEnemy.Killedolayına abone olarakenemy.data.rewardmiktarı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);
}
}
}
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