Menu
CoddyTech

ספירה לאחור

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

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

while (left > 0f && !skipRequested)
{
    // הצג את השניות שנותרו, בצע ספירה לאחור, המתן לפריים אחד
}
skipRequested = false;

הערך הבוליאני חוזר להיות false לאחר השימוש בו, אחרת כל הפסקה אחרי הראשונה הייתה מסתיימת מיד. Mathf.CeilToInt מעגל כלפי מעלה, כך ש־2.3 שניות שנותרו מוצגות כ־3. yield return StartCoroutine(Countdown()); מפעיל את הספירה לאחור וממתין לסיומה.

challenge icon

אתגר

קשה

בצעו ספירה לאחור לקראת כל גל; כפתור מזניק אותו מוקדם יותר.

  1. ב־WaveSpawner, הוסיפו את countdownText (TMP_Text) ואת nextWaveButton (GameObject) עם מאפיין serialized, את private bool callNow; ואת public void CallNextWave() { callNow = true; }.
  2. החליפו את פקודת העצירה ב־yield return StartCoroutine(Countdown());: הציגו את הכפתור, וכל עוד נותר זמן ו־callNow אינו true, הציגו בכל פריים את Next wave in 8, בעיגול כלפי מעלה.
  3. לאחר מכן החזירו את callNow ל־false, נקו את הטקסט והסתירו את הכפתור.

לחצו על "שחק": הכפתור Next Wave מדלג על ההמתנה. לאחר מכן לחצו על "בדיקה".

נסו בעצמכם

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class WaveSpawner : MonoBehaviour
{
    [SerializeField] private List<Wave> waves = new List<Wave>();
    [SerializeField] private Transform[] waypoints;
    [SerializeField] private float timeBetweenWaves = 8f;

    void Start()
    {
        StartCoroutine(RunWaves());
    }

    IEnumerator RunWaves()
    {
        for (int i = 0; i < waves.Count; i++)
        {
            yield return new WaitForSeconds(timeBetweenWaves);
            Debug.Log("Wave " + (i + 1));
            Wave wave = waves[i];
            for (int n = 0; n < wave.count; n++)
            {
                Enemy enemy = Instantiate(wave.enemy, waypoints[0].position, Quaternion.identity);
                enemy.waypoints = waypoints;
                yield return new WaitForSeconds(wave.spacing);
            }
        }
        Debug.Log("All waves sent");
    }
}

כל השיעורים ביחידה משחק Unity: הגנת מגדלים

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