Menu
CoddyTech

Kendine Göre Uyarla

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

Oyunun bir bitiş koşuluna ihtiyacı var. Can sayısı 0'a ulaştığında oyun kaybedilir; tüm dalgalar gönderildiğinde ve geride hiç düşman kalmadığında ise kazanılır. Dalgaları oluşturan sistem, her karede bir lambda ifadesini kontrol eden WaitUntil ile tahtanın boş olmasını bekler ve ardından bir olay tetikler:

yield return new WaitUntil(() => switchesOn == switches.Length);

Her iki bitişte de EndPanel gösterilir ve oyun Time.timeScale = 0 ile durdurulur. Geriye 1 can kalmışken 2 hasar alan bir Tank, tam olarak 0 olup olmadığını kontrol eden bir koşulu atlayabilir; bu nedenle Mathf.Max can sayısını 0 veya daha fazla tutar. Time.timeScale sahne yüklendiğinde değerini korur, bu yüzden “Tekrar Oyna” önce bu değeri 1'e ayarlar.

Sonra oyunu kendine göre düzenle. Bu oyuncunun Inspector'ı salt okunur olduğundan, burada startMoney (150), startLives (20) ve timeBetweenWaves (8) kodundaki değerleri kullanır: tanımlandıkları yerde değiştir ve “Oyna”ya bas. Yolun virajlarına yerleştirilen ve para geldikçe yükseltilen karma bir savunma, varsayılan oyundan daha iyi sonuç verir.

challenge icon

Görev

Zor

Oyunu bitir, ardından kodunda ince ayar yap.

  1. WaveSpawner: public event Action AllWavesCleared; ekle; son dalgadan sonra Enemy.All.Count == 0 olduğunda (WaitUntil) bu olayı tetikle.
  2. GameManager: canı 0 veya daha fazla tut. End(message), serileştirilmiş endPanel ve endText öğelerini gösterir ve Time.timeScale = 0 değerini ayarlar: 0 can kaldığında Game Over, tüm dalgalar temizlendiğinde You Win!.
  3. public void PlayAgain(): Time.timeScale = 1 değerini ayarla, ardından sahneyi yeniden yükle.

“Oyna” düğmesine bas ve sekiz dalganın tamamında üssü savun. Ardından “Kontrol et” düğmesine bas.

Kendin dene

using UnityEngine;
using TMPro;

public class GameManager : MonoBehaviour
{
    [SerializeField] private int startMoney = 150;
    [SerializeField] private int startLives = 20;
    [SerializeField] private WaveSpawner spawner;
    [SerializeField] private TMP_Text moneyText;
    [SerializeField] private TMP_Text livesText;
    [SerializeField] private TMP_Text waveText;

    private int money;
    private int lives;

    void OnEnable()
    {
        Enemy.ReachedBase += OnReachedBase;
        Enemy.Killed += OnKilled;
        spawner.WaveStarted += ShowWave;
    }

    void OnDisable()
    {
        Enemy.ReachedBase -= OnReachedBase;
        Enemy.Killed -= OnKilled;
        spawner.WaveStarted -= ShowWave;
    }

    void Start()
    {
        money = startMoney;
        lives = startLives;
        ShowMoney();
        ShowLives();
    }

    public bool TrySpend(int amount)
    {
        if (amount > money)
        {
            return false;
        }

        money -= amount;
        ShowMoney();
        return true;
    }

    public void Earn(int amount)
    {
        money += amount;
        ShowMoney();
    }

    void OnKilled(Enemy enemy)
    {
        Earn(enemy.data.reward);
    }

    void OnReachedBase(Enemy enemy)
    {
        lives -= enemy.data.damage;
        ShowLives();
    }

    void ShowMoney()
    {
        moneyText.text = "Money: " + money;
    }

    void ShowLives()
    {
        livesText.text = "Lives: " + lives;
    }

    void ShowWave(int wave, int total)
    {
        waveText.text = "Wave " + wave + "/" + total;
    }
}
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

Kendi başına pratik yap: Unity playground