Menu
CoddyTech

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.

challenge icon

Görev

Zor
  1. WaveSpawner içinde serileştirilmiş countdownText (bir TMP_Text) ve nextWaveButton (bir GameObject) alanlarını ve düğmenin dalgayı hemen başlatmak için çağırdığı public void CallNextWave() metodunu ekleyin.
  2. 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österen Next wave in 8 yazar. 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.
  3. 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> WaveStarted olayını ekleyin.
  4. GameManager içinde serileştirilmiş spawner (bir WaveSpawner) ve waveText (bir TMP_Text) alanlarını ekleyin, WaveStarted olayına abone olun ve Wave 1/8 metnini 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");
    }
}
quiz iconKendini test et

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