Menu
CoddyTech

זמן ללא שינוי קנה מידה

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

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

void Update()
{
    wheel.Rotate(0f, 0f, -180f * Time.unscaledDeltaTime);   // חצי סיבוב בשנייה, בין אם המשחק מושהה ובין אם לא
}

גם לקורוטינות יש את אותו זוג. WaitForSeconds סופר את זמן המשחק, ולכן כשהערך הוא Time.timeScale = 0 הוא לעולם לא מסתיים; WaitForSecondsRealtime סופר שניות אמיתיות. הקורוטינה הזאת, שמתחילה כשהתפריט נפתח, מהבהבת בכותרת התפריט מדי חצי שנייה:

IEnumerator Blink()
{
    while (true)
    {
        title.SetActive(!title.activeSelf);
        yield return new WaitForSecondsRealtime(0.5f);
    }
}

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

challenge icon

אתגר

בינוני

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

  1. בקובץ Anvil.cs, כתוב IEnumerator HitStop(): Time.timeScale = 0f;, ואז yield return new WaitForSecondsRealtime(freezeTime);, ואז החזר אותו ל־1f.
  2. כתוב void OnCollisionEnter(Collision collision) שקורא ל־StartCoroutine(HitStop());.

לחץ על "שחק" והפל סדנים באמצעות מקש הרווח: כל נחיתה מקפיאה את המשחק למשך 0.3 שניות. ואז לחץ על "בדיקה".

נסו בעצמכם

using System.Collections;
using UnityEngine;

public class Anvil : MonoBehaviour
{
    public float freezeTime = 0.3f;

    // הקפא את המשחק למשך freezeTime שניות בזמן אמת כשהסדן פוגע במשהו
}

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

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