זמן ללא שינוי קנה מידה
חלק מהיחידה בניית משחקים אמיתיים במסלול ה-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 אין גרסה המשתמשת בזמן אמיתי: הוא תמיד סופר את זמן המשחק.
אתגר
בינוניהוסף לסדן עצירה קצרה בפגיעה: כל המשחק קופא לרגע כשהוא נוחת.
- בקובץ
Anvil.cs, כתובIEnumerator HitStop():Time.timeScale = 0f;, ואזyield return new WaitForSecondsRealtime(freezeTime);, ואז החזר אותו ל־1f. - כתוב
void OnCollisionEnter(Collision collision)שקורא ל־StartCoroutine(HitStop());.
לחץ על "שחק" והפל סדנים באמצעות מקש הרווח: כל נחיתה מקפיאה את המשחק למשך 0.3 שניות. ואז לחץ על "בדיקה".
נסו בעצמכם
using System.Collections;
using UnityEngine;
public class Anvil : MonoBehaviour
{
public float freezeTime = 0.3f;
// הקפא את המשחק למשך freezeTime שניות בזמן אמת כשהסדן פוגע במשהו
}
כל השיעורים ביחידה בניית משחקים אמיתיים
10פרויקט: משחק פלטפורמה תלת־ממדי
המסלולפלטפורמות נעותתרגלו בעצמכם: Unity אונליין