أضف لمستك الخاصة
الدرس 25 من 25 في دورة لعبة Unity: الدفاع عن الأبراج على Coddy.
تحتاج اللعبة إلى نهايتها. تُخسر اللعبة عندما تصل الأرواح إلى 0، وتُربح عندما تُرسل كل الموجات ولا يبقى أي عدو. ينتظر مولّد الأعداء حتى تصبح الساحة فارغة باستخدام WaitUntil، الذي يتحقق من دالة لامدا مرة واحدة في كل إطار، ثم يطلق حدثًا:
yield return new WaitUntil(() => switchesOn == switches.Length);تعرض كلتا النهايتين لوحة النهاية وتوقفان اللعبة باستخدام Time.timeScale = 0. إذا تلقّى الدبابة ضررًا مقداره 2 عندما يتبقى لها حياة واحدة، فسيتجاوز ذلك فحصًا يبحث عن القيمة 0 بالضبط، لذا تحافظ Mathf.Max على الأرواح عند 0 أو أكثر. تحتفظ Time.timeScale بقيمتها عند تحميل مشهد، لذا يعيد «العب مرة أخرى» ضبطها إلى 1 أولًا.
بعد ذلك، اجعل اللعبة خاصة بك. هنا تأخذ startMoney (150) وstartLives (20) وtimeBetweenWaves (8) القيم الموجودة في شيفرتك، لأن نافذة Inspector لهذا اللاعب للقراءة فقط: غيّرها حيث تم تعريفها واضغط «العب». يتفوق دفاع متنوع عند منعطفات المسار، مع ترقيته كلما توفرت الأموال، على اللعبة الافتراضية.
التحدي
صعبأنه اللعبة، ثم اضبطها في شيفرتك.
WaveSpawner: أضفpublic event Action AllWavesCleared;، ويُطلق الحدث بعد الموجة الأخيرة عندما يصبحEnemy.All.Count == 0(WaitUntil).GameManager: أبقِ عدد الأرواح 0 أو أكثر. تعرضEnd(message)كلاً منendPanelوendTextالمُسلسلين، وتضبطTime.timeScale = 0: اعرضGame Overعند نفاد الأرواح، وYou Win!عند اجتياز جميع الموجات.public void PlayAgain(): اضبطTime.timeScale = 1، ثم أعد تحميل المشهد.
اضغط «العب» ودافع عن القاعدة طوال الموجات الثماني. ثم اضغط «تحقق».
جرّب بنفسك
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;
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس لعبة Unity: الدفاع عن الأبراج
تدرّب بنفسك: Playground لـ Unity