Menu
CoddyTech

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

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

Помести счёт в скрипт игрока, жизни — в скрипт здоровья, а проверку окончания игры — в третий скрипт, и каждому скрипту нужны числа из других, поэтому каждое новое правило затрагивает несколько файлов. В играх на 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

Задание

Легко

Охота за драгоценными камнями. Стрелки перемещают Player (его скрипт уже готов). За драгоценные камни начисляются очки, равные их points, бомбы отнимают жизнь, а GameManager управляет всем этим. В Inspector уже связаны поле game каждого драгоценного камня и каждой бомбы с объектом GameManager, а поля GameManager — с HUD и Player.

В GameManager.cs:

  • AddScore(int points) добавляет очки к score и показывает их в scoreText в виде Score: 6.
  • LoseLife() уменьшает lives на 1 (в начале их 3) и показывает их в livesText в виде Lives: 2.
  • Когда значение lives достигает 0, игра заканчивается: покажи gameOverPanel и отключи скрипт Player, чтобы стрелки перестали работать. После этого AddScore ничего не меняет.

В Gem.cs и Bomb.cs: когда Player (с тегом Player) касается драгоценного камня или бомбы, объект сообщает об этом игре (драгоценный камень передаёт свои points, бомба — о потерянной жизни) и удаляет себя.

Нажми Play, собери драгоценные камни и коснись бомб, затем нажми Check.

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

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 жизней игра окончена
    }
}
quiz iconПроверьте себя

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

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