Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Unity_в_действии_Джозеф_Хокинг_Рус.pdf
Скачиваний:
83
Добавлен:
21.06.2022
Размер:
26.33 Mб
Скачать

11.3. Обработка хода игры      295

Рис. 11.9. Кнопки сохранения и загрузки в нижней правой части экрана

Назовите их (указав имена в настройках присоединенных текстовых объектов) Save Game и Load Game, в окне Anchor Presets выберите вариант bottom-right и поместите их в точки с координатами –100, 65 и –100, 30 соответственно.

Эти кнопки нужно связать с функциями в сценарии UIController, поэтому воспользуйтесь методами из следующего листинга.

Листинг 11.30. Методы загрузки и сохранения в сценарии UIController

...

public void SaveGame() { Managers.Data.SaveGameState();

}

public void LoadGame() { Managers.Data.LoadGameState();

}

...

Свяжите эти функции с подписчиками на событие OnClick кнопок (добавьте слушание в настройки события OnClick, перетащите объект UIController и выберите функции в меню). Теперь запустите игру, соберите несколько элементов инвентаря, воспользуйтесь пакетом здоровья, чтобы увеличить эту характеристику, и сохраните игру. Заново запустите игру и проверьте свой инвентарь, чтобы удостовериться, что он отсутствует. Щелкните на кнопке Load; у вас появятся уровень здоровья и инвентарь, имеющиеся на момент сохранения игры!

11.3.2. Победа в игре при прохождении всех уровней

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

public const string GAME_COMPLETE = "GAME_COMPLETE";

Теперь отредактируйте сценарий MissionManager, заставив его рассылать сообщение о прохождении последнего уровня (см. следующий листинг).

296      Глава 11. Объединение фрагментов в готовую игру

Листинг 11.31. Рассылка сообщения о завершении игры сценарием MissionManager

...

public void GoToNext() {

...

}else {

Debug.Log("Last level"); Messenger.Broadcast(GameEvent.GAME_COMPLETE);

}

}

На это сообщение должен реагировать сценарий UIController (см. следующий листинг).

Листинг 11.32. Добавление подписчика события в сценарий UIController

...

Messenger.AddListener(GameEvent.GAME_COMPLETE, OnGameComplete);

...

Messenger.RemoveListener(GameEvent.GAME_COMPLETE, OnGameComplete);

...

private void OnGameComplete() {

levelEnding.gameObject.SetActive(true);

levelEnding.text = "You Finished the Game!";

}

...

Пройдите уровень до конца (для этого персонаж должен коснуться целевого объекта) и посмотрите, что получится. Первым делом должно появиться сообщение Level Complete, которое через пару секунд сменяется сообщением о завершении игры.

Добавление уровней

Теперь можно добавить произвольное количество дополнительных уровней, а диспетчер MissionManager будет следить за последним уровнем. Это последнее, что нам осталось сделать в этой главе, ведь нам требовалось продемонстрировать, как выглядит прохождение многоуровневой игры.

Дважды продублируйте сцену Level1 (цифры в именах файлов при этом автоматически увеличатся до Level2 и Level3). Новые уровни следует добавить в список Build Settings, чтобы они могли загружаться в процессе игры. Отредактируйте каждую сцену, чтобы уровни отличались друг от друга; вы можете произвольно менять элементы сцен, сохраняя, однако, следующие объекты: объект player с тегом Player, объект floor, находящийся в слое Ground, целевой объект для выхода с уровня, объекты Controller,

HUD Canvas и EventSystem.

СОВЕТ  Карты освещенности при загрузке нового уровня система освещения по умолчанию генерирует заново. Но этот механизм работает только в процессе редактирования уровня; при загрузке уровней в игре карты освещенности не генерируются. Как вы делали в главе 9, можно сбросить флажок Continuous Baking в окне настроек (вызываемом командой Window Lighting) и щелкнуть на кнопке Build для фиксации карты освещенности (напоминаю, что вы не должны трогать появляющуюся при этом папку Scene).