Bersihkan Arena
Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 55 dari 64.
Peristiwa bertanda static dimiliki oleh class, bukan oleh satu object. Hanya ada satu Enemy.Died untuk semua enemy yang pernah ada, jadi spawner dapat berlangganan dengan Enemy.Died += OnEnemyDied; sebelum ada enemy, dan setiap enemy memicunya dengan dirinya sendiri sebagai argumen. Gagasan yang sama dalam C# biasa:
public class Coin
{
public static event Action<Coin> Picked;
public void Pick()
{
Picked?.Invoke(this);
}
}
public class Purse
{
private int coins;
public Purse()
{
Coin.Picked += OnPicked; // belum perlu Coin
}
void OnPicked(Coin coin)
{
coins++;
}
}Peristiwa instance diakses melalui object, seperti hero.Died; peristiwa static melalui nama class, seperti Coin.Picked. Peristiwa static bertahan lebih lama daripada semua object, jadi berhentilah berlangganan di OnDisable, atau spawner yang sudah dihancurkan akan tetap ada di daftarnya.
Tantangan
SedangBuat setiap wave menunggu hingga arena kosong.
- Di
Enemy, tambahkanpublic static event Action<Enemy> Died;dan panggilDied?.Invoke(this);tepat sebelumDestroy(gameObject);. - Di
WaveSpawner, hitungalive: tambahkan 1 setiap kali melakukan spawn, kurangi 1 dalam method yang dihubungkan keEnemy.DiedolehOnEnabledan dilepas olehOnDisable. - Setelah wave selesai melakukan spawn, tunggu selama
alive > 0.
Tekan tombol “Main” dan kalahkan wave 1: wave 2 muncul 2 detik kemudian. Lalu tekan tombol “Periksa”.
Coba sendiri
using System.Collections;
using UnityEngine;
public class WaveSpawner : MonoBehaviour
{
[SerializeField] private WaveSet waveSet;
[SerializeField] private Transform[] spawnPoints;
public int Wave { get; private set; }
void Start()
{
StartCoroutine(RunWaves());
}
IEnumerator RunWaves()
{
while (true)
{
foreach (Wave wave in waveSet.waves)
{
Wave++;
Debug.Log("Wave " + Wave);
for (int i = 0; i < wave.count; i++)
{
Transform point = spawnPoints[i % spawnPoints.Length];
Instantiate(wave.enemy, point.position, Quaternion.identity);
yield return new WaitForSeconds(wave.spacing);
}
yield return new WaitForSeconds(waveSet.restBetweenWaves);
}
}
}
}
Semua pelajaran di Arsitektur Game di Unity
1Komponen, Bukan Hierarki
Komponen KecilSkrip Dasar MusuhKomponen AbstrakKomponen yang Bekerja BersamaRangkuman: Turret ModularRangkuman: Meriam Kembar4Data yang Diserialisasi
Class yang Dapat DiserialisasiList di InspectorEnum di InspectorRangkuman: Tabel LootRangkuman: Acak Loot7Mesin Status
Status sebagai ClassStatus SiagaMesin StatusTransisiOtak MusuhKsatria MenyerangRangkuman: Status Pintu10Proyek: Bertahan Hidup di Arena
Sang PahlawanJenis Musuh2Antarmuka di Unity
IDamageableAntarmuka dan TryGetComponentGetComponentsRingkasan: Tombol InteractRingkasan: Terdekat dalam Jangkauan5ScriptableObjects
Aset DataStatistik SenjataPengaturan BersamaSelamatkan AnginGelombang sebagai DataRekap: database ItemBeli dari Toko8Kode yang Dapat Digunakan Kembali
Extension methodSingleton GenerikHelper GenerikUlasan: FindNearestLatihan sendiri: Playground Unity