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) vestartLives(20). - Spawner'ın
wavesdeğeri; düşman, sayı ve aralık bilgilerini içeren sekiz satır vetimeBetweenWaves(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.
Görev
ZorWaveSpawneriçindepublic event Action AllWavesClearedekleyin. Son dalga gönderildikten sonraEnemy.Allboşalana kadar bekleyin, ardından olayı tetikleyin.GameManageriçinde serileştirilmişendPanel(bir GameObject) veendText(bir TMP_Text) alanlarını ekleyin. Canlar hiçbir zaman 0'ın altına düşmez ve 0'a ulaştıklarında oyunGame Overile sona erer. Tüm dalgalar temizlendiğinde can kaldıysa oyunYou Win!ile sona erer. Oyun sona erdiğinde mesajın bulunduğu panel gösterilir veTime.timeScale0 olarak ayarlanır.- 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;
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.