Menu
CoddyTech

התאימו אותו אישית

שיעור 25 מתוך 25 בקורס משחק Unity: הגנת מגדלים של Coddy.

למשחק דרוש סיום. מפסידים בו כשהחיים מגיעים ל־0, ומנצחים בו לאחר שכל הגלים נשלחו ולא נותרו אויבים. המשגר ממתין עד שהלוח ריק באמצעות WaitUntil, שבודקת למבדה פעם בכל פריים, ואז מפעיל אירוע:

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

כל אחד מהסיומים מציג את EndPanel ועוצר את המשחק באמצעות 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 כשנותרו 0 חיים, 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: הגנת מגדלים

תרגלו בעצמכם: Unity אונליין