Menu
CoddyTech

Повторение: менеджер раундов

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

В этой главе у игры появился один управляющий объект: синглтон, к которому остальные обращаются без поля, и состояния, между которыми он переключается. Менеджер раунда использует и то и другое.

challenge icon

Задание

Легко

Заверши сбор монет; SetState уже написан.

  1. Добавь public static RoundManager Instance; и присвой значение в Awake().
  2. В Update() переключайся по state: в Ready жди нажатия Space; в Playing отсчитывай timeLeft в обратном порядке, а затем переходи к следующему Ready или к Finished после последнего раунда.
  3. public bool TakeCoin(): только в состоянии Playing засчитывай монету, показывай Coins: 2 и возвращай true. Coin.cs уничтожает засчитанную монету, которой касается Player.

Нажми «Играть» и пройди все три раунда. Затем нажми «Проверить».

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

using UnityEngine;
using TMPro;

public enum RoundState { Ready, Playing, Finished }

public class RoundManager : MonoBehaviour
{
    // синглтон: статический Instance, задаваемый в Awake()
    public GameObject readyPanel;
    public GameObject playPanel;
    public GameObject finishedPanel;
    public TMP_Text roundText;
    public TMP_Text coinsText;
    public TMP_Text finalText;
    public int rounds = 3;
    public float roundTime = 4f;
    private RoundState state;
    private int round = 1;
    private int coins;
    private float timeLeft;

    void Start()
    {
        SetState(RoundState.Ready);
    }

    void Update()
    {
        // ветвление по state: Ready ожидает нажатия Space; Playing ведёт обратный отсчёт времени
    }

    void SetState(RoundState next)
    {
        state = next;
        readyPanel.SetActive(next == RoundState.Ready);
        playPanel.SetActive(next == RoundState.Playing);
        finishedPanel.SetActive(next == RoundState.Finished);
        if (next == RoundState.Ready) roundText.text = "Round " + round;
        if (next == RoundState.Playing) timeLeft = roundTime;
        if (next == RoundState.Finished) finalText.text = "Coins: " + coins;
    }

    // TakeCoin(): монета засчитывается только в состоянии Playing
}
quiz iconПроверьте себя

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

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

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