שחק שוב
שיעור 12 מתוך 14 בקורס משחק Unity: נחש בתלת־ממד של Coddy.
כשהנחש מת, מופיע חלון Game Over עם כפתור Play Again. החלון נמצא ב-HUD ומוסתר בתחילת המשחק, ו-SetActive(true) מציג אותו. הנחש יודע מתי הוא מת, ו-GameManager מנהל את המסכים, לכן Die() קוראת ל-GameOver() ציבורית ב-GameManager.
Play Again מתחיל מחדש באמצעות טעינה מחדש של הסצנה. כל האובייקטים חוזרים כפי שהם בסצנה: הנחש בתא הראשון שלו עם שני מקטעים, הניקוד הוא 0, והחלון מוסתר. כפתור Retry במשחק מרוצים מחובר באותה דרך:
void Start()
{
retryButton.onClick.AddListener(Retry);
}
void Retry()
{
SceneManager.LoadScene("Track1");
}טעינה לפי שם מקשרת את הכפתור לסצנה אחת. SceneManager.GetActiveScene().buildIndex היא הסצנה שפועלת, ולכן טעינה שלה מפעילה מחדש את הסצנה שבה נמצא הכפתור. בסצנה החדשה יש GameManager חדש, שה-Awake() שלו מגדיר שוב את Instance, כך שהנחש החדש מתקשר עם ה-GameManager החדש.
אתגר
בינוניל-HUD יש GameOverPanel מוסתר עם PlayAgainButton, והסצנה מגדירה את שניהם ב-GameManager.
- ב-
GameManager, הוסףusing UnityEngine.UI;,using UnityEngine.SceneManagement;,public GameObject gameOverPanel;ו-public Button playAgainButton;. - כתוב
public void GameOver(), שמציג את הלוח. - כתוב
void PlayAgain(), שטוען שוב את הסצנה הפעילה, וב-Start()הגדר שהכפתור יקרא לו. - ב-
Die()שלSnake, קרא ל-GameOver().
לחץ על Play, התרסק, שחק שוב, ואז לחץ על Check.
נסו בעצמכם
using System.Collections.Generic;
using UnityEngine;
using TMPro;
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
public Snake snake;
public GameObject foodPrefab;
public TMP_Text scoreText;
private Transform food;
private int score;
void Awake()
{
Instance = this;
}
void Start()
{
scoreText.text = "Score: 0";
food = Instantiate(foodPrefab).transform;
MoveFood();
}
public bool IsFood(Vector3 cell)
{
return cell == food.position;
}
public void Eat()
{
score++;
scoreText.text = "Score: " + score;
MoveFood();
}
void MoveFood()
{
List<Vector3> free = new List<Vector3>();
for (int x = -snake.edge; x <= snake.edge; x++)
{
for (int z = -snake.edge; z <= snake.edge; z++)
{
Vector3 cell = new Vector3(x, 0f, z);
if (!snake.Occupies(cell))
{
free.Add(cell);
}
}
}
food.position = free[Random.Range(0, free.Count)];
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.