Sonraki Dalga
Coddy'nin Unity Oyunu: Kule Savunması kursunda ders 17 / 18.
Dalgalar arasında oyuncu inşa eder ve geri sayım ne kadar süre kaldığını gösterir. Hazır olan bir oyuncu, bir düğmeyle sonraki dalgayı erken başlatabilir. Mola, null üreten bir coroutine içindeki döngüdür; bu nedenle her karede bir kez çalışır: kalan süreyi geri sayar, gösterir ve süre dolduğunda ya da düğme dalgayı başlatmayı istediğinde sona erer. Düğme yalnızca bir bool ayarlar ve döngü bu bool değerini okur:
while (left > 0f && !skipRequested)
{
// kalan saniyeleri göster, geri say, bir kare bekle
}
skipRequested = false;Bool, kullanıldıktan sonra yeniden false olarak ayarlanır; aksi takdirde ilk moladan sonraki her mola hemen sona ererdi. Mathf.CeilToInt yukarı yuvarlar; bu nedenle kalan süre 2.3 saniyeyken 3 gösterilir ve geri sayım, son saniyenin tamamı boyunca 0 yerine 1 gösterir. Geri sayım kendi başına bir coroutine'dir ve yield return StartCoroutine(Countdown()); onu çalıştırıp dalga döngüsü devam etmeden önce bitmesini bekler.
HUD ayrıca dalga numarasını gösterir. Spawner bu numarayı bilir ve GameManager da gösterir; bu nedenle spawner, dalga numarasını ve toplam dalga sayısını içeren bir C# olayı olan WaveStarted olayını tetikler. Düşmanların statik olaylarından farklı olarak bu olay tek bir spawner'a aittir ve GameManager, spawner alanı üzerinden olaya abone olur.
Görev
ZorWaveSpawneriçinde serileştirilmişcountdownText(bir TMP_Text) venextWaveButton(bir GameObject) alanlarını ve düğmenin dalgayı hemen başlatmak için çağırdığıpublic void CallNextWave()metodunu ekleyin.- Her dalgadan önceki beklemeyi bir geri sayımla değiştirin; bunu
yield return StartCoroutine(Countdown());ile çalıştırın. Geri sayım sürerken düğme görünür ve metinde, yukarı yuvarlanmış kalan saniyeyi gösterenNext wave in 8yazar. Süre dolduğunda veya düğmeye tıklandığında geri sayım sona erer; ardından metin boşaltılır ve düğme gizlenir. - Bir dalga başladığında dalganın numarasıyla (1'den başlayarak) ve toplam dalga sayısıyla tetiklenen
public event Action<int, int> WaveStartedolayını ekleyin. GameManageriçinde serileştirilmişspawner(bir WaveSpawner) vewaveText(bir TMP_Text) alanlarını ekleyin, WaveStarted olayına abone olun veWave 1/8metnini gösterin.
HUD'da WaveText, CountdownText ve NextWaveButton bulunuyor. Play'e basın, oyunu oluşturun ve ilk dalgayı erkenden başlatın; ardından Check'e basın.
Kendin dene
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WaveSpawner : MonoBehaviour
{
[SerializeField] private List<Wave> waves = new List<Wave>();
[SerializeField] private Transform[] waypoints;
[SerializeField] private float timeBetweenWaves = 5f;
void Start()
{
StartCoroutine(RunWaves());
}
IEnumerator RunWaves()
{
for (int i = 0; i < waves.Count; i++)
{
yield return new WaitForSeconds(timeBetweenWaves);
Debug.Log("Wave " + (i + 1));
Wave wave = waves[i];
for (int n = 0; n < wave.count; n++)
{
Enemy enemy = Instantiate(wave.enemy, waypoints[0].position, Quaternion.identity);
enemy.waypoints = waypoints;
yield return new WaitForSeconds(wave.spacing);
}
}
Debug.Log("All waves sent");
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.