הילוך איטי
חלק מהיחידה בניית משחקים אמיתיים במסלול ה-Unity של Coddy. שיעור 35 מתוך 60.
ערך Time.timeScale שבין 0 ל-1 יוצר הילוך איטי. בערך 0.25, הערך של Time.deltaTime הוא רבע מזמן הפריים במציאות, ולכן מכונית שמתקדמת באמצעות speed * Time.deltaTime עוברת בכל שנייה במציאות רבע מהמרחק שלה, גופים קשיחים עפים ונופלים ברבע מהמהירות שלהם, ו-WaitForSeconds(1f) נמשך 4 שניות במציאות. מעל 1 המשחק רץ מהר: 2 פירושו מהירות כפולה.
הפיזיקה דורשת שורה נוספת. כל צעד פיזיקה עדיין מקדם את המשחק ב-Time.fixedDeltaTime, כלומר ב-0.02 שניות של זמן משחק, ובערך 0.25 חולפות 0.08 שניות במציאות בין הצעדים האלה: FixedUpdate() פועלת רק 12.5 פעמים בשנייה במציאות, כך שגופים זזים פעם אחת בכל חמישה פריימים והתנועה מקרטעת. הקטן את משך הצעד באותו גורם, והחזר את שני הערכים לאחר מכן, מכיוון ש-Unity לעולם לא מאפסת את fixedDeltaTime בעצמה. הסקריפט הזה מאט את המשחק כל עוד מקש הרווח לחוץ:
float normalStep;
void Awake()
{
normalStep = Time.fixedDeltaTime; // 0.02 בפרויקט חדש
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Time.timeScale = 0.25f;
Time.fixedDeltaTime = normalStep * Time.timeScale;
}
if (Input.GetKeyUp(KeyCode.Space))
{
Time.timeScale = 1f;
Time.fixedDeltaTime = normalStep;
}
}עם הצעד הקטן יותר, הפיזיקה עדיין מתקדמת 50 פעמים בשנייה במציאות, וכל צעד מכסה רבע מזמן המשחק, כך שההילוך האיטי נשאר חלק. משך הצעד נמדד בשניות משחק, ולכן קוד ב-FixedUpdate() שמשתמש ב-Time.deltaTime ממשיך לפעול ללא שינוי.
אתגר
בינונישחקו בתעופת השביט דרך SlowZone בהילוך איטי.
- ב־
SlowZone.cs, כתבוvoid OnTriggerEnter(Collider other): הגדירו אתTime.timeScaleל־slowScaleואתTime.fixedDeltaTimeל־0.02f * slowScale. - כתבו
void OnTriggerExit(Collider other): החזירו אותם ל־1fול־0.02f.
לחצו על "שחק" ועל מקש הרווח: השביט גולש דרך האזור במהירות 0.4. לאחר מכן לחצו על "בדיקה".
נסו בעצמכם
using UnityEngine;
public class SlowZone : MonoBehaviour
{
public float slowScale = 0.4f;
// הילוך איטי כל עוד משהו נמצא בתוך האזור
}
כל השיעורים ביחידה בניית משחקים אמיתיים
10פרויקט: משחק פלטפורמה תלת־ממדי
המסלולפלטפורמות נעותתרגלו בעצמכם: Unity אונליין