Menu
CoddyTech

Играть снова

Урок 12 из 14 курса Игра на Unity: 3D-змейка на 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.

challenge icon

Задание

Средне

В HUD есть скрытая панель GameOverPanel с кнопкой PlayAgainButton, и сцена задаёт обе на GameManager.

  1. В GameManager добавь using UnityEngine.UI;, using UnityEngine.SceneManagement;, public GameObject gameOverPanel; и public Button playAgainButton;.
  2. Напиши public void GameOver(), которая показывает панель.
  3. Напиши void PlayAgain(), которая заново загружает активную сцену, а в Start() настрой кнопку так, чтобы она вызывала этот метод.
  4. В методе 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)];
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Игра на Unity: 3D-змейка