ספירה לאחור
שיעור 23 מתוך 25 בקורס משחק Unity: הגנת מגדלים של Coddy.
בין הגלים השחקן בונה, וספירה לאחור מציגה כמה זמן נותר. שחקן שמוכן יכול לקרוא לגל הבא מוקדם באמצעות כפתור. ההפסקה היא לולאה בקורוטינה שמחזירה null, ולכן היא פועלת פעם אחת בכל פריים: היא סופרת לאחור, מציגה את הזמן, ומסתיימת כשהזמן נגמר או כשהכפתור ביקש להתחיל את הגל. הכפתור רק משנה ערך בוליאני, והלולאה קוראת אותו:
while (left > 0f && !skipRequested)
{
// הצג את השניות שנותרו, בצע ספירה לאחור, המתן לפריים אחד
}
skipRequested = false;הערך הבוליאני חוזר להיות false לאחר השימוש בו, אחרת כל הפסקה אחרי הראשונה הייתה מסתיימת מיד. Mathf.CeilToInt מעגל כלפי מעלה, כך ש־2.3 שניות שנותרו מוצגות כ־3. yield return StartCoroutine(Countdown()); מפעיל את הספירה לאחור וממתין לסיומה.
אתגר
קשהבצעו ספירה לאחור לקראת כל גל; כפתור מזניק אותו מוקדם יותר.
- ב־
WaveSpawner, הוסיפו אתcountdownText(TMP_Text) ואתnextWaveButton(GameObject) עם מאפיין serialized, אתprivate bool callNow;ואתpublic void CallNextWave() { callNow = true; }. - החליפו את פקודת העצירה ב־
yield return StartCoroutine(Countdown());: הציגו את הכפתור, וכל עוד נותר זמן ו־callNowאינו true, הציגו בכל פריים אתNext wave in 8, בעיגול כלפי מעלה. - לאחר מכן החזירו את
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 אונליין