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.
Görev
ZorOyunu bitir, ardından kodunda ince ayar yap.
WaveSpawner:public event Action AllWavesCleared;ekle; son dalgadan sonraEnemy.All.Count == 0olduğunda (WaitUntil) bu olayı tetikle.GameManager: canı 0 veya daha fazla tut.End(message), serileştirilmişendPanelveendTextöğelerini gösterir veTime.timeScale = 0değerini ayarlar: 0 can kaldığındaGame Over, tüm dalgalar temizlendiğindeYou Win!.public void PlayAgain():Time.timeScale = 1değ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;
}
}
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