השהיה באמצעות timeScale
חלק מהיחידה בונים משחקים אמיתיים במסלול ה-Unity של Coddy. שיעור 33 מתוך 56.
Time.timeScale קובע באיזו מהירות הזמן במשחק חולף: 1 היא מהירות רגילה ו-0 עוצר אותו. בערך 0, הערך של Time.deltaTime הוא 0, ולכן כל תנועה שנכתבה בתור speed * Time.deltaTime נעצרת. FixedUpdate() כבר לא נקראת, ולכן גופי Rigidbody נשארים תלויים באוויר, ו-WaitForSeconds ו-Invoke ממתינים, מכיוון שהם סופרים את זמן המשחק. הסקריפט הזה מפעיל ומכבה את ההשהיה באמצעות כפתור שרשימת On Click שלו קוראת ל-TogglePause, ומציג חלונית בזמן ההשהיה:
public class PauseToggle : MonoBehaviour
{
public GameObject pausePanel;
bool paused;
public void TogglePause()
{
paused = !paused;
Time.timeScale = paused ? 0f : 1f;
pausePanel.SetActive(paused);
}
}לא הכול נעצר. Update() ו-LateUpdate() עדיין נקראות בכל פריים, כאשר Time.deltaTime הוא 0, ה-yield return null של קורוטינה עדיין חוזר בפריים הבא, והממשק עדיין מקבל לחיצות, וכך הכפתור יכול לסיים את ההשהיה. גם מקשים עדיין נקלטים: צפרדע שקופצת בלחיצה על Space ב-Update() תקלט את הלחיצה בזמן ההשהיה ותקפוץ בצעד הפיזיקה הראשון אחריה. הסקריפט שלה מתעלם ממקשים בזמן שהזמן עומד מלכת:
void Update()
{
if (Time.timeScale == 0f) return; // מושהה: התעלם מהמקשים
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * jump, ForceMode.Impulse);
}
}Time.timeScale חל על המשחק כולו, ולא על סצנה מסוימת: טענו סצנה אחרת כשהערך שלו הוא 0, והסצנה החדשה תתחיל בהשהיה. כפתור בתפריט שמפעיל מחדש שלב או יוצא ממנו מחזיר אותו ל-1 תחילה.
אתגר
בינונימכונת הכדורים במגרש הטניס מסתובבת באמצעות החצים שמאלה וימינה ומגישה כדור בלחיצה על Space (BallMachine.cs). הוסף למגרש תפריט השהיה ב־PauseMenu.cs. בסצנה, כפתור Pause מחובר ל־Pause(), וכפתור Resume, שנמצא בתוך PausePanel המוסתר, מחובר ל־Resume(); בחלון Inspector, הצב את הלוח בתוך panel.
Pause()עוצרת את זמן המשחק ומציגה את הלוח.Resume()מחזירה את זמן המשחק למהירות הרגילה ומסתירה את הלוח.- ב־
BallMachine.cs, לחיצה על Space לא צריכה להגיש כדור כשהמשחק מושהה. אין צורך לשנות את הסיבוב: הוא נכתב באמצעותTime.deltaTime.
לחץ על Play, הגש כדור והשהה את המשחק כשהכדור באוויר, ואז לחץ על Check.
נסו בעצמכם
using UnityEngine;
public class PauseMenu : MonoBehaviour
{
public GameObject panel;
public void Pause()
{
// עצור את זמן המשחק והצג את הפאנל
}
public void Resume()
{
// זמן המשחק חוזר לקצב רגיל, והפאנל מוסתר
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה בונים משחקים אמיתיים
10פרויקט: משחק פלטפורמה תלת־ממדי
המסלולפלטפורמות נעות