טיימר ספירה לאחור
חלק מהיחידה בניית משחקים אמיתיים במסלול ה-Unity של Coddy. שיעור 4 מתוך 60.
ספירה לאחור שומרת את הזמן שנותר בתוך float ומחסרת ממנו את Time.deltaTime בכל פריים. הפריים האחרון כמעט אף פעם לא מגיע בדיוק ל־0, ולכן Mathf.Max עוצרת אותו שם, והסיום חייב להתרחש פעם אחת בלבד. הפתיל הזה נותן לשחקן 5 שניות לנטרל פצצה:
public TMP_Text fuseText;
public float fuse = 5f;
private bool exploded;
void Update()
{
if (exploded)
{
return;
}
fuse = Mathf.Max(fuse - Time.deltaTime, 0f);
fuseText.text = "Fuse: " + Mathf.CeilToInt(fuse);
if (fuse == 0f)
{
exploded = true;
fuseText.text = "BOOM";
fuseText.color = Color.red;
}
}Mathf.CeilToInt מעגל כלפי מעלה, וכך ספירה לאחור אמורה להציג: 5 במשך כל השנייה הראשונה (4.99 מתעגל כלפי מעלה ל־5), 1 במהלך השנייה האחרונה, ו־0 רק כשנגמר הזמן. (int)fuse היה מוריד את 4.99 ל־4 ומציג 0 במשך כל השנייה האחרונה בזמן שהפצצה עדיין מתקתקת; Mathf.RoundToInt היה מציג 0 במשך חצי השנייה האחרונה. ספירה לאחור ארוכה יותר, שמוצגת בדקות ובשניות, פועלת לפי אותו כלל: קודם מעגלים את הזמן כלפי מעלה לשניות שלמות, ואז מעצבים אותן.
הפקודה המוקדמת return משאירה את BOOM על המסך: בלעדיה, הפריים הבא היה כותב Fuse: 0 מעליו. גם לטקסט יש צבע, ו־fuseText.color = Color.red הופך אותו לאדום.
אתגר
קלגרמו למדחן לספור לאחור את הזמן ששולם.
- ב־
Update(), החסירו אתTime.deltaTimeמ־timeLeft, בלי לרדת מתחת ל־0, והציגו אתMathf.CeilToInt(timeLeft)בדקות ובשניות:1:15. - מקש הרווח מוסיף 30 שניות, עד
maxTime(2:00). - כשהזמן מגיע ל־0, הציגו
EXPIREDבצבעColor.red. התחילו אתUpdate()עםif (timeLeft == 0f) return;כדי שהמצב יישאר כך.
לחצו על "שחק" והכניסו לו מטבעות: הוא נעצר ב־2:00. לאחר מכן לחצו על "בדיקה".
נסו בעצמכם
using UnityEngine;
using TMPro;
public class ParkingMeter : MonoBehaviour
{
public TMP_Text meterText;
public float timeLeft = 60f;
public float maxTime = 120f;
void Update()
{
// הפחת את timeLeft והצג אותו בדקות ובשניות; Space מוסיף 30 שניות
}
}
כל השיעורים ביחידה בניית משחקים אמיתיים
10פרויקט: משחק פלטפורמה תלת־ממדי
המסלולפלטפורמות נעותתרגלו בעצמכם: Unity אונליין