Menu
CoddyTech

Игра окончена

Урок 12 из 16 курса Игра в Unity: арканоид на Coddy.

Последняя потерянная жизнь завершает игру. Мяч вылетает из игры, панель Game Over закрывает экран, а её кнопка Play Again начинает новую игру. Теперь в сцене есть панель, скрытая внутри холста HUD, а список On Click кнопки в Inspector уже вызывает GameManager.PlayAgain. В списке On Click предлагаются только методы public, поэтому метод, который ты выбираешь для кнопки, должен быть public.

Самый простой способ начать новую игру — загрузить сцену заново. Каждый объект создаётся заново из сцены: новый GameManager со счётом 0 и 3 жизнями, новая стена, мяч снова на платформе. Текущая сцена — это SceneManager.GetActiveScene(), а её buildIndex — это её номер в сборке:

SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);

Скрытие мяча с помощью SetActive(false) останавливает его Update(), поэтому Space больше не может запустить его, и удаляет его из физики. Проверка выполняется после lives--, поэтому игра заканчивается, когда число жизней достигает 0: при третьем потерянном мяче, если изначально было 3 жизни.

challenge icon

Задание

Средне
  1. Добавь using UnityEngine.SceneManagement; и public GameObject gameOverPanel в GameManager. Сцена содержит ссылку на скрытую панель GameOverPanel.
  2. В BallLost, когда закончится последняя жизнь, покажи панель и скрой потерянный мяч с помощью SetActive(false), вместо того чтобы возвращать его на платформу.
  3. Напиши public void PlayAgain(), которая заново загружает текущую сцену. Кнопка Play Again на панели уже вызывает этот метод.

Нажми Play, потеряй все три мяча, нажми Play Again, затем нажми Check.

Попробуйте сами

using UnityEngine;
using TMPro;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    public Brick brickPrefab;
    public Transform wall;
    public string[] levels;
    public float spacingX = 1.75f;
    public float spacingY = 0.75f;
    public float topY = 6f;

    public Ball ball;
    public int lives = 3;
    public TMP_Text scoreText;
    public TMP_Text livesText;

    int score;
    int level;
    int bricksLeft;

    void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        BuildLevel(0);
        ShowHud();
    }

    void BuildLevel(int index)
    {
        level = index;
        string[] rows = levels[index].Split('/');
        for (int row = 0; row < rows.Length; row++)
        {
            string line = rows[row];
            float left = -(line.Length - 1) * spacingX / 2f;
            for (int col = 0; col < line.Length; col++)
            {
                char c = line[col];
                if (c == '.') continue;
                Vector3 pos = new Vector3(left + col * spacingX, topY - row * spacingY, 0f);
                Brick brick = Instantiate(brickPrefab, pos, Quaternion.identity, wall);
                brick.SetHits(c - '0');
                bricksLeft++;
            }
        }
    }

    public void BrickBroken(Brick brick)
    {
        score += brick.points;
        bricksLeft--;
        ShowHud();
        if (bricksLeft == 0)
        {
            ball.ResetToPaddle();
            BuildLevel((level + 1) % levels.Length);
        }
    }

    public void BallLost(Ball lost)
    {
        lives--;
        ShowHud();
        lost.ResetToPaddle();
    }

    void ShowHud()
    {
        scoreText.text = "Score: " + score;
        livesText.text = "Lives: " + lives;
    }
}
quiz iconПроверьте себя

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

Все уроки раздела Игра в Unity: арканоид