Menu
CoddyTech

השהיה באמצעות timeScale

חלק מהיחידה בניית משחקים אמיתיים במסלול ה-Unity של Coddy. שיעור 34 מתוך 60.

‏Time.timeScale קובע באיזו מהירות זמן המשחק עובר: 1 היא מהירות רגילה ו־0 עוצר אותו. בערך 0, ‏Time.deltaTime הוא 0, ולכן כל תנועה שנכתבת בתור speed * Time.deltaTime נעצרת. ‏FixedUpdate() כבר לא נקראת, ולכן גופים קשיחים נשארים תלויים באוויר, וגם 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.

challenge icon

אתגר

בינוני

הוסף לתחום הטניס תפריט השהיה. הסצנה מחברת את הלחצנים Pause ו-Resume.

  1. ב-PauseMenu.cs, הפונקציה Pause() מגדירה את Time.timeScale = 0f; וקוראת ל-panel.SetActive(true);.
  2. הפונקציה Resume() מגדירה את Time.timeScale = 1f; וקוראת ל-panel.SetActive(false);.
  3. ב-BallMachine.cs, הוסף את if (Time.timeScale == 0f) return; מעל בדיקת Space בתוך Update().

לחץ על "שחק", הגש כדור והשהה: הוא ייתקע באוויר. לאחר מכן לחץ על "בדיקה".

נסו בעצמכם

using UnityEngine;

public class PauseMenu : MonoBehaviour
{
    public GameObject panel;

    public void Pause()
    {
        // עצור את זמן המשחק והצג את החלונית
    }

    public void Resume()
    {
        // זמן המשחק שוב מתקדם במהירות רגילה, והחלונית מוסתרת
    }
}

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

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