Menu
CoddyTech

أضف لمستك الخاصة

الدرس 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 لهذا اللاعب للقراءة فقط: غيّرها حيث تم تعريفها واضغط «العب». يتفوق دفاع متنوع عند منعطفات المسار، مع ترقيته كلما توفرت الأموال، على اللعبة الافتراضية.

challenge icon

التحدي

صعب

أنه اللعبة، ثم اضبطها في شيفرتك.

  1. WaveSpawner: أضف public event Action AllWavesCleared;، ويُطلق الحدث بعد الموجة الأخيرة عندما يصبح Enemy.All.Count == 0 (WaitUntil).
  2. GameManager: أبقِ عدد الأرواح 0 أو أكثر. تعرض End(message) كلاً من endPanel وendText المُسلسلين، وتضبط Time.timeScale = 0: اعرض Game Over عند نفاد الأرواح، وYou Win! عند اجتياز جميع الموجات.
  3. 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;
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس لعبة Unity: الدفاع عن الأبراج

تدرّب بنفسك: Playground لـ Unity