Tekrar Oyna
Coddy'nin Unity'de 3D Yılan Oyunu kursunda ders 12 / 14.
Yılan öldüğünde, Yeniden Oyna düğmesinin bulunduğu bir Oyun Bitti paneli açılır. Panel HUD'dadır ve başlangıçta gizlidir; SetActive(true) onu gösterir. Yılan ne zaman öldüğünü bilir ve ekranların yönetimi GameManager'a aittir; bu yüzden Die(), GameManager üzerindeki genel GameOver() metodunu çağırır.
Yeniden Oyna, sahneyi yeniden yükleyerek oyunu baştan başlatır. Her nesne, sahnede bulunduğu hâliyle geri gelir: yılan ilk hücresinde ve iki parçalıdır, puan 0'dır, panel gizlidir. Bir yarış oyunundaki Yeniden Dene düğmesi de aynı şekilde bağlanır:
void Start()
{
retryButton.onClick.AddListener(Retry);
}
void Retry()
{
SceneManager.LoadScene("Track1");
}Adla yükleme, düğmeyi tek bir sahneye bağlar. SceneManager.GetActiveScene().buildIndex, çalışmakta olan sahnedir; bu nedenle sahnenin yüklenmesi, düğmenin bulunduğu sahneyi yeniden başlatır. Yeni sahnede yeni bir GameManager bulunur ve onun Awake() metodu Instance'ı yeniden ayarlar; böylece yeni yılan yeni GameManager ile iletişim kurar.
Görev
OrtaHUD'da PlayAgainButton içeren gizli bir GameOverPanel bulunur ve sahne her ikisini de GameManager üzerinde ayarlar.
GameManageriçindeusing UnityEngine.UI;,using UnityEngine.SceneManagement;,public GameObject gameOverPanel;vepublic Button playAgainButton;ekle.- Paneli gösteren
public void GameOver()metodunu yaz. - Etkin sahneyi yeniden yükleyen
void PlayAgain()metodunu yaz veStart()içinde düğmenin bu metodu çağırmasını sağla. Snake'inDie()metodundaGameOver()çağır.
Play'e bas, çarp, tekrar oyna, ardından Check'e bas.
Kendin dene
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)];
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.