Hadiah
Pelajaran 10 dari 18 dalam kursus Game Unity: Tower Defense di Coddy.
Setiap musuh yang dikalahkan tower memberikan reward. Enemy melaporkan musuh yang dikalahkan dengan cara yang sama seperti saat melaporkan musuh mencapai markas, melalui event statis, Killed, lalu GameManager mendengarkan event tersebut dan menambahkan uang.
Musuh hanya boleh memberikan hadiah satu kali. Destroy tidak langsung menghapus object: penghapusan terjadi di akhir frame, dan sampai saat itu object masih ada di dalam game. Dua tembakan bisa mengenai musuh pada frame yang sama, dan tembakan kedua menemukan musuh dengan health 0 yang masih ada. Jika TakeDamage melaporkan musuh yang dikalahkan setiap kali health bernilai 0 atau kurang, tembakan kedua akan memberikan hadiah lagi. Game balon dengan anak panah memiliki perangkap yang sama, dan bool bisa mencegahnya:
public void Pop()
{
if (popped)
{
return;
}
popped = true;
Popped?.Invoke(this);
Destroy(gameObject);
}Enemy tidak memerlukan bool tambahan, karena health-nya sudah menunjukkan apakah musuh itu mati: TakeDamage yang menemukan health bernilai 0 atau kurang tidak perlu melakukan apa pun lagi.
Tantangan
Sedang- Di
Enemy, deklarasikan event statis publikKilled(Action<Enemy>). Picu event itu dengan enemy saat TakeDamage membuat health-nya menjadi 0 atau kurang, tepat sebelum menghancurkannya. - Satu kill hanya memberi bayaran sekali: saat TakeDamage dipanggil pada enemy yang health-nya sudah 0 atau kurang, fungsi itu tidak melakukan apa pun.
- Di
GameManager, tambahkanpublic void Earn(int amount), yang menambahkan uang dan menampilkannya. Berlangganan keEnemy.Killeddi samping ReachedBase, lalu dapatkanrewarddari enemy yang terbunuh.
Tekan Play dan lihat uang bertambah saat tower bekerja, lalu tekan Check.
Coba sendiri
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);
}
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.