Menu
CoddyTech

Один скрипт управляет игрой

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

Поместите счёт в скрипт игрока, жизни — в скрипт здоровья, а проверку окончания игры — в третий скрипт. Тогда каждому скрипту нужны данные остальных, и каждое новое правило затрагивает несколько файлов. В играх на Unity эти данные обычно хранит один скрипт — GameManager, размещённый на отдельном пустом GameObject. Он отвечает за счёт, жизни и правило окончания игры. Другие скрипты только сообщают о произошедшем, вызывая его открытые методы. В этой серии пенальти ворота сообщают о каждом голе:

public class GameManager : MonoBehaviour
{
    private int goals;
    private int shotsLeft = 5;

    public void ShotTaken(bool scored)
    {
        if (shotsLeft == 0) return;
        shotsLeft--;
        if (scored) goals++;
        Debug.Log("Goals: " + goals + ", shots left: " + shotsLeft);
        if (shotsLeft == 0) Debug.Log("Full time: " + goals + " goals");
    }
}
// Net.cs, на триггере ворот
public GameManager game;

void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Ball")) game.ShotTaken(true);
}

Ворота не знают, сколько ударов осталось и когда заканчивается игра. Они сообщают о голе, а менеджер решает, что это означает; скрипт вратаря сообщает об отражённом ударе с помощью game.ShotTaken(false). Чтобы изменить серию пенальти на 3 удара, достаточно поменять одно число в одном скрипте. Проверка в начале ShotTaken не даст засчитать мяч, который закатился в ворота после окончания игры.

Заполните поле game в Inspector, перетащив на него объект GameManager: Unity найдёт скрипт GameManager на этом объекте. Менеджер также отвечает за HUD: если он хранит текст счёта и панель окончания игры, экран меняется в том же методе, где меняются числа, и никакой другой скрипт не взаимодействует с интерфейсом.

challenge icon

Задание

Легко

Пусть GameManager ведет учет очков и жизней.

  1. AddScore(int points): если gameOver не установлено, добавь значение к score и отобрази Score: 6 в scoreText.
  2. LoseLife(): уменьши lives на 1 и отобрази Lives: 2; при значении 0 установи gameOver, покажи gameOverPanel, установи player.enabled = false.
  3. В Gem и Bomb, когда выполняется other.CompareTag("Player"), вызови game.AddScore(points) или game.LoseLife(), затем Destroy(gameObject).

Нажми «Играть» и столкнись с тремя бомбами. Затем нажми «Проверить».

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

using UnityEngine;
using TMPro;

public class GameManager : MonoBehaviour
{
    public TMP_Text scoreText;
    public TMP_Text livesText;
    public GameObject gameOverPanel;
    public Player player;
    private int score;
    private int lives = 3;
    private bool gameOver;

    public void AddScore(int points)
    {
        // добавь очки и покажи новый счёт, если игра ещё не окончена
    }

    public void LoseLife()
    {
        // убавь одну жизнь и покажи оставшееся число жизней; при 0 жизней игра заканчивается
    }
}

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

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