Menu
CoddyTech

Kendine Göre Özelleştir

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

Oyunun bir sona ihtiyacı var. Canlar 0'a ulaştığında kaybedilir, tüm dalgalar gönderildiğinde ve tahtada hiç düşman kalmadığında kazanılır. Spawner son dalganın çıktığını bilir ve Enemy.All kaç düşman kaldığını bilir; bu yüzden spawner boş bir tahta için bekler ve ardından GameManager'ın dinlediği bir olay tetikler. Bir coroutine, WaitUntil ile bir koşulu bekler; bu koşul her karede bir lambda'yı denetler. Her anahtar açık olduğunda çıkışı açılan bir bulmaca odası:

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

Her iki sona ulaşıldığında bir mesajla EndPanel gösterilir ve oyun Time.timeScale = 0 ile durdurulur. Canlar hiçbir zaman 0'ın altına düşmez: 1 can kalmışken 2 hasar alan bir Tank, tam olarak 0 değerini denetleyen bir kontrolü atlayıp doğrudan geçer; bu nedenle Mathf.Max canları 0 veya daha fazla tutar.

Tekrar Oyna sahneyi yeniden yükler. Time.timeScale sahnenin bir parçası değildir ve yükleme boyunca değerini korur; bu nedenle 0'da durdurulmuş bir oyun yeniden donmuş halde başlar: yüklemeden önce değeri tekrar 1'e ayarla.

Ardından oyunu kendine göre düzenle. Oyunun dengesini belirleyen her şey Inspector'dadır:

  • Oyundaki GameManager: startMoney (150) ve startLives (20).
  • Spawner'ın waves değeri; düşman, sayı ve aralık bilgilerini içeren sekiz satır ve timeBetweenWaves (8).
  • EnemyData varlıkları: hız, sağlık, ödül ve her türün eksilttiği can sayısı. Boss'un 450 sağlığı vardır ve 10 can eksiltir.
  • TowerData varlıkları: maliyet, hasar, menzil, ateş hızı, yükseltme değerleri, Cannon'ın alan hasarı ve Frost kulesinin yavaşlatma etkisi.

Varsayılan değerler, yolun virajlarına farklı türlerde savunmalar yerleştirip para geldikçe bunları yükselterek aşılabilir; tek türden birkaç kule yeterli olmaz. Her seferinde bir değeri değiştir ve etkisini görmek için oyna.

challenge icon

Görev

Zor
  1. WaveSpawner içinde public event Action AllWavesCleared ekleyin. Son dalga gönderildikten sonra Enemy.All boşalana kadar bekleyin, ardından olayı tetikleyin.
  2. GameManager içinde serileştirilmiş endPanel (bir GameObject) ve endText (bir TMP_Text) alanlarını ekleyin. Canlar hiçbir zaman 0'ın altına düşmez ve 0'a ulaştıklarında oyun Game Over ile sona erer. Tüm dalgalar temizlendiğinde can kaldıysa oyun You Win! ile sona erer. Oyun sona erdiğinde mesajın bulunduğu panel gösterilir ve Time.timeScale 0 olarak ayarlanır.
  3. Panelin düğmesinin çağıracağı public void PlayAgain() metodunu yazın: zamanı normale döndürün ve etkin sahneyi yeniden yükleyin.

Play'e basın ve Check'e tıklamadan önce sekiz dalganın tamamında üssü savunun. Ardından Inspector'da oyunu ayarlayın ve kendi istediğiniz şekilde oynayın.

Kendin dene

using UnityEngine;
using TMPro;

public class GameManager : MonoBehaviour
{
    [SerializeField] private int startMoney = 100;
    [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