Menu
CoddyTech

Geri Sayım

Coddy'nin Unity Oyunu: Kule Savunması kursunda ders 23 / 25.

Dalgalar arasında oyuncu inşa yapar ve geri sayım ne kadar süre kaldığını gösterir. Hazır olan bir oyuncu, bir düğmeyle sonraki dalgayı erkenden başlatabilir. Mola, null veren bir coroutine içindeki döngüdür; bu nedenle her karede bir kez çalışır: süreyi geri sayar, gösterir ve süre dolduğunda ya da düğme dalganın başlamasını istediğinde sona erer. Düğme yalnızca bir bool ayarlar ve döngü bu değeri okur:

while (left > 0f && !skipRequested)
{
    // Kalan saniyeleri göster, geri say, bir kare bekle
}
skipRequested = false;

Bool, kullanıldıktan sonra tekrar false olur; yoksa ilk moladan sonraki her mola hemen sona ererdi. Mathf.CeilToInt yukarı yuvarlar; bu nedenle kalan 2.3 saniye 3 olarak görünür. yield return StartCoroutine(Countdown()); geri sayımı çalıştırır ve bitmesini bekler.

challenge icon

Görev

Zor

Her dalga için geri sayım yap; bir düğme dalgayı erken başlatır.

  1. WaveSpawner içinde serileştirilmiş countdownText (TMP_Text) ve nextWaveButton (GameObject), private bool callNow; ve public void CallNextWave() { callNow = true; } ekle.
  2. yield return StartCoroutine(Countdown()); ile break ifadesini değiştir: düğmeyi göster ve süre kaldığı ve callNow false olduğu sürece, her karede yukarı yuvarlanmış süreyi Next wave in 8 olarak göster.
  3. Ardından callNow değerini tekrar false yap, metni temizle ve düğmeyi gizle.

“Oyna” düğmesine bas: Sonraki Dalga bekleme süresini atlar. Ardından “Kontrol et” düğmesine bas.

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 = 8f;

    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");
    }
}

Unity Oyunu: Kule Savunması bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground