התחלת השלב מחדש
חלק מהיחידה בונים משחקים אמיתיים במסלול ה-Unity של Coddy. שיעור 18 מתוך 56.
הדרך המהירה ביותר לאפס שלב היא לטעון אותו מחדש. SceneManager.GetActiveScene() מחזירה את הסצנה שפתוחה עכשיו, וה-name שלה (או ה-buildIndex שלה) הוא מה ש-LoadScene מקבלת. לחצן Restart הזה בחלונית סיום המשחק קורא ל:
public void Restart()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}Unity הורסת את הסצנה הפתוחה ובונה אותה מחדש מקובץ הסצנה. כל האובייקטים חוזרים למקום שבו הסצנה הציבה אותם, כולל ארגז שהשחקן הפיל, וכל שדה מקבל שוב את הערך שלו ב-Inspector, ו-Awake ו-Start פועלות שוב. אין צורך בקוד שיחזיר כל דבר למקומו אחד-אחד. מכיוון שהלחצן מבקש את הסצנה הפעילה במקום שם כמו "Level3", אותו סקריפט מפעיל מחדש כל שלב שהוא נמצא בו.
שדה static אינו חלק מהסצנה: הוא שייך למחלקה, ולכן טעינה מחדש משאירה אותו כפי שהיה. private static float bestTime; שומר על הזמן הטוב ביותר גם לאחר הפעלות מחדש, ואילו private float time; רגיל מתחיל שוב מ-0 עם הסצנה החדשה. גם GameManager.Instance הוא סטטי: לאחר טעינה מחדש הוא מצביע על GameManager שהושמד, עד שה-Awake של החדש מגדיר אותו.
אתגר
קלשני שלבים, Level1 ו-Level2, בכל אחד מהם אובייקט Level שמחזיק את הסקריפט LevelRestart. החצים מזיזים את ה-Player, וקוביית הזהב ב-Level1 טוענת את Level2 (שניהם מוכנים). השלימו את LevelRestart.cs:
- כשהשחקן נופל מתחת ל-
fallY(-3), הוסיפו 1 ל-fallsוהפעילו מחדש את השלב שבו נמצא השחקן: נפילה ב-Level2 מפעילה מחדש את Level2. fallsסופר כל נפילה במשחק, לכן הוא חייב לשרוד את הטעינה מחדש. Start כבר מציג אותו בתורFalls: 1.
לחצו על Play, רדו מקצה בשני השלבים, ואז לחצו על Check.
נסו בעצמכם
using UnityEngine;
using TMPro;
public class LevelRestart : MonoBehaviour
{
public Transform player;
public TMP_Text fallsText;
public float fallY = -3f;
private int falls;
void Start()
{
fallsText.text = "Falls: " + falls;
}
void Update()
{
// מתחת ל־fallY: ספור את הנפילה והפעל מחדש את השלב שבו השחקן נמצא
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה בונים משחקים אמיתיים
10פרויקט: משחק פלטפורמה תלת־ממדי
המסלולפלטפורמות נעות