Capai Markas
Pelajaran 3 dari 18 dalam kursus Game Unity: Tower Defense di Coddy.
Musuh yang berjalan ke waypoint terakhir telah mencapai markas: pemain kehilangan nyawa dan musuh itu pergi. Nyawa dikelola oleh GameManager, yang menampilkannya di layar. Musuh tidak perlu memiliki referensi ke GameManager untuk melaporkannya: sebentar lagi musuh dibuat dalam jumlah banyak dari prefab, dan prefab tidak dapat menunjuk ke object di scene.
Event static menyelesaikan keduanya. Event ini milik class Enemy, bukan milik satu musuh, sehingga GameManager cukup berlangganan sekali dan menerima kabar dari setiap musuh, termasuk musuh yang dibuat kemudian. Setiap musuh memicunya dengan dirinya sendiri sebagai argumen, sehingga pendengar dapat mengetahui jenis musuh yang berhasil melewatinya. Koin dalam game platformer melaporkannya dengan cara yang sama:
public class Coin : MonoBehaviour
{
public static event Action<Coin> Collected;
public int value = 1;
void OnTriggerEnter(Collider other)
{
Collected?.Invoke(this);
Destroy(gameObject);
}
}// ScoreBoard.cs
void OnEnable()
{
Coin.Collected += AddCoin;
}
void OnDisable()
{
Coin.Collected -= AddCoin;
}
void AddCoin(Coin coin)
{
score += coin.value;
}Event static tetap ada selama game berjalan, jadi -= lebih penting dari sebelumnya: ScoreBoard yang dihancurkan tetapi tidak pernah berhenti berlangganan akan tetap dipanggil, dan kodenya akan gagal saat mengakses teksnya yang sudah dihancurkan. OnEnable dan OnDisable selalu berpasangan, jadi setiap += memiliki -=.
Tantangan
MudahBase membutuhkan nyawa, dan musuh yang mencapainya harus mengurangi nyawa tersebut.
- Di
EnemyData, tambahkandamagebertipe int public: jumlah nyawa yang diambil jenis musuh ini dari base. - Di
Enemy, deklarasikan event static publicReachedBaseyang meneruskan musuh (Action<Enemy>). Saat musuh tiba di waypoint terakhir, picu event tersebut dengan mengirimkan musuh itu sendiri, lalu hancurkan musuh, alih-alih berhenti di sana. - Di
GameManager, tambahkan intstartLivesyang diserialisasi (20) dan intlivesprivate yang dimulai dari nilai tersebut. Berlangganan keEnemy.ReachedBasediOnEnabledan berhenti berlangganan diOnDisable. Setiap musuh yang berhasil melewati jalur mengurangi nyawa sebanyak nilaidamagepada asset-nya. - Tampilkan jumlah nyawa dalam TMP_Text
livesTextyang diserialisasi, sebagaiLives: 20, saat mulai dan setelah setiap perubahan.
Game object memiliki GameManager, Inspector menghubungkan LivesText, dan kedua asset mengurangi 1 nyawa. Tekan Jalankan, tunggu sampai kedua musuh mencapai base, lalu tekan Periksa.
Coba sendiri
using UnityEngine;
public class Enemy : MonoBehaviour
{
public EnemyData data;
public Transform[] waypoints;
private int next = 1;
private int health;
void Awake()
{
health = data.maxHealth;
}
void Update()
{
if (next >= waypoints.Length)
{
return;
}
Vector3 target = waypoints[next].position;
transform.position = Vector3.MoveTowards(transform.position, target, data.speed * Time.deltaTime);
if (transform.position == target)
{
next++;
}
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.