Menu
CoddyTech

Конец ночи

Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 60 из 60.

Последнее испытание завершает целую игру: менеджер состояний, пауза, останавливающая время, две концовки и перезапуск, который возвращает масштаб времени к исходному.

challenge icon

Задание

Сложно

Добавь паузу, два варианта завершения и перезапуск.

  1. pauseButton переключает только состояния Playing и Paused: в состоянии Paused устанавливает Time.timeScale в 0 и показывает pausePanel, а в состоянии Playing отменяет оба действия.
  2. При 0 секундах ночь считается Won. В состояниях Won или Lost: шкала времени равна 0, отображается endPanel с текстом You survived the night! или The bats got you в endText.
  3. restartButton устанавливает шкалу времени в 1 и перезагружает сцену.

Нажми «Играть», поставь игру на паузу, проиграй, сыграй ещё раз. Затем нажми «Проверить».

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

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using TMPro;

public class GameManager : MonoBehaviour
{
    public enum State { Playing, Paused, Won, Lost }

    public static GameManager Instance;

    public float nightLength = 15f;
    public float spawnEvery = 2f;
    public GameObject batPrefab;
    public Transform[] spawnPoints;
    public TMP_Text dawnText;
    public Button pauseButton;
    public GameObject pausePanel;
    public GameObject endPanel;
    public TMP_Text endText;
    public Button restartButton;

    public State state;

    private float timeLeft;
    private float spawnTimer;

    void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        state = State.Playing;
        timeLeft = nightLength;
        ShowDawn();
    }

    void Update()
    {
        if (state != State.Playing) return;

        timeLeft -= Time.deltaTime;
        spawnTimer += Time.deltaTime;
        if (spawnTimer >= spawnEvery)
        {
            spawnTimer -= spawnEvery;
            Transform point = spawnPoints[Random.Range(0, spawnPoints.Length)];
            Instantiate(batPrefab, point.position, Quaternion.identity);
        }
        ShowDawn();
    }

    public void Lose()
    {
        if (state != State.Playing) return;
        state = State.Lost;
    }

    void ShowDawn()
    {
        dawnText.text = "Dawn in " + Mathf.CeilToInt(timeLeft);
    }
}
quiz iconПроверьте себя

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

Все уроки раздела Создание настоящих игр

Потренируйтесь самостоятельно: Песочница Unity