Шаблон Гоночная трасса с сохранением данных с помощью Verse — это шаблон творческого режима Создание гоночной трассы, преобразованный в UEFN со следующими нововведениями в проекте:
Сохраняемая локальная таблица лидеров в лобби перед игрой, данные в которой сохраняются с помощью Verse. Эта таблица отображается только в первом раунде.
Система, основанная на сохранении данных с помощью Verse, которая распределяет игроков по машинам на стартовых позициях в зависимости от места, занятого в предыдущем раунде.
Показ стартового состава с отображением статистики каждого игрока с помощью внутриигрового видео и Verse.
Это не всё!
Цель шаблона творческого режима для создания гоночной трассы заключалась в том, чтобы использовать ресурсы гоночной трассы для разработки уникального гоночного режима с добавлением нескольких удобных функций. В этом шаблоне UEFN применён комплексный подход для замены и обновления многих элементов карты, что позволило задействовать широкие возможности UEFN.
В следующих разделах мы рассмотрим эти нововведения более подробно.
Улучшение зоны обучения
Таблица лидеров находится в зоне обучения. Каждый раз, когда игрок входит в игру для участия в своём первом раунде на карте, у него есть 30 секунд, чтобы ознакомиться с таблицей лидеров и исследовать зону обучения.
Эта зона построена таким образом, чтобы быть визуально привлекательной для любителей гонок и в то же время предоставлять достаточно информации о том, как создать такую же карту. Зона обучения была переработана на основе шаблона для творческого режима — она стала более свободной и открытой, а также в неё были добавлены источники света неба с естественным освещением Lumen.
Загрузив шаблон в UEFN, вы можете ознакомиться с настройкой каждой группы устройств и сценариев Verse, чтобы узнать, как был создан шаблон, и затем реализовать их на собственной карте.
Зона обучения — это место, где находится большинство устройств, чтобы вы могли ознакомиться с ними и понять их логику. К ним, помимо прочего, относятся основные устройства удержания, устройства для выдачи наград и устройства «Аналитика». Устройства для выдачи наград начисляют очки опыта только при завершении круга или гонки.
Устройства «Аналитика» вы можете настроить для отслеживания различных данных, которые помогут улучшить проект в будущем. Этот шаблон отслеживает частоту прохождения каждой контрольной точки и частоту сбора серебряных монет во время гонки. Оба показателя информируют о том, насколько легко или сложно достичь определённой контрольной точки или монеты. С учётом этих данных вы сможете изменить положение или количество этих объектов в будущих обновлениях, чтобы сделать гонку более сбалансированной и интересной.
Очистка вкладки «Структура»
После преобразования проекта в UEFN на вкладке Структура отображается длинный неструктурированный список ресурсов.
Хотя все ресурсы сохраняют работоспособность, к названиям транспортных средств, барьеров и других объектов добавлены номера, что затрудняет восприятие структуры проекта. Эти номера добавляются автоматически в процессе преобразования, чтобы названия всех ресурсов и устройств были уникальными.
Для работы с ресурсами в проект добавлена файловая система, позволяющая упорядочить все объекты в зависимости от их местоположения и функциональности. Несмотря на то что подобная организация требует времени, она позволяет перемещать и удалять группы объектов (или даже целые области) гораздо эффективнее, чем в творческом режиме.
Сохраняемая локальная таблица лидеров
Из-за отсутствия сохраняемых данных на оригинальной карте творческого режима раньше нельзя было отслеживать победителей предыдущих раундов и статистику игроков. В обновлённом шаблоне карты UEFN благодаря Verse и сохранению данных с помощью Verse можно хранить данные игроков на протяжении всех игровых сеансов, отслеживать их статистику в течение всего игрового времени и создавать локальные таблицы лидеров. При этом доступ можно получить только к данным игроков, находящихся в текущем сеансе, поэтому в таблице лидеров будет отображаться статистика только тех игроков, которые играют в данный момент.
Мы решили, что наиболее важными сохраняемыми показателями игроков являются «призовые места» и «время круга». Призовым местом будет считаться попадание в тройку лучших, а лучшее время круга будет определять самых быстрых гонщиков. Также мы добавили дополнительный показатель — «очки». Игрокам начисляются очки в зависимости от занятого в гонке места, поэтому игроки, которые часто участвуют в гонках, но не всегда занимают высокие места, все равно смогут заработать много очков. Таким образом, эти показатели позволяют одновременно выявлять самых неудержимых, быстрых и преданных игре гонщиков.
В преобразованном шаблоне используется лобби перед игрой с локальными таблицами лидеров, в которых отображается статистика каждого игрока за всё игровое время. Данные сортируются таким образом, что игроки с наилучшей статистикой очков за всё игровое время будут находиться на первом месте и три лучших игрока будут выделены, чтобы подчеркнуть их мастерство. Эта статистика также отображается в интерфейсе во время показа стартового состава игроков, что позволяет игрокам лучше узнать своих соперников и запомнить, на кого следует обратить особое внимание во время гонки.
Более подробно о том, как создать сохраняемую локальную таблицу лидеров, рассказано в разделе Создание пользовательской внутриигровой таблицы лидеров.
Порядок гонщиков на стартовых позициях
В преобразованном шаблоне вместо случайного порядка гонщиков на старте, использовавшегося в оригинальном проекте, используется порядок, основанный на результатах гонщиков в предыдущем раунде. Это побуждает игроков стараться финишировать быстрее, даже если сейчас они не находятся в группе лидеров.
В первом раунде гонщики располагаются в случайном порядке, а в последующих уже расставляются по позициям, на которых они финишировали в предыдущем раунде. Эту информацию нужно хранить между раундами, при этом она не сохраняется после завершения игры. С её помощью можно определять стартовые позиции игроков путём их сортировки согласно местам, занятым в последнем раунде. Как хранить информацию о раундах и сортировать данные, описано в следующих уроках:
# Orders and returns players by their finish order in the previous round.
# During the first round, players are given random starting placements.
GetPlayerStartOrder<public>(Players:[]player):[]player=
var OrderedPlayers:[]player = Players
if:
IsFirstRound[GetRound[]]
then:
# Randomize player order because it's first round.
set OrderedPlayers = Shuffle(OrderedPlayers)
Перед назначением игрокам транспортных средств и их расстановкой на старте важно убедиться, что игроки действительно активны и собираются участвовать в гонке. Вы можете создать функцию GetAllValidPlayers(), которая будет перебирать всех игроков и возвращать тех из них, которые по-прежнему активны (т. е. пока не покинули игру) и не являются зрителями (т. е. будут принимать участие в гонке).
# Get all players that are able to race.
GetAllValidPlayers(Players:[]player):[]player=
# Valid players are ones that are active and not spectating.
for:
Player : Players
Player.IsActive[]
not Player.IsSpectator[]
do:
PlayerПосле этого в проекте используется устройство starting_game_sequence для настройки лобби с таблицей лидеров в первом раунде и последующего распределения игроков по стартовым позициям и машинам перед началом гонки.
# This file handles the logic for the pregame lobby and the cinematics that play at the beginning of a race.
# It controls the length of the starting lineup based on the number of players, and plays an intro for each
# player by displaying their stats.
using { /Fortnite.com/Characters }
using { /Fortnite.com/Devices }
using { /Fortnite.com/FortPlayerUtilities }
using { /Verse.org/Native }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
Внутриигровое видео стартового состава с показом статистики игроков
В оригинальной версии шаблона творческого режима для создания гоночной трассы использовалось устройство «Триггер импульса», которое управляло вступлением На старт! Внимание! Марш! в гонке. «Триггер импульса» воспроизводил последовательность событий в течение заданного периода времени, активируя триггеры для отображения текста и включения источников света на старте.
В преобразованной версии шаблона устройство «Триггер импульса» заменили на устройство «Последовательность внутриигрового видео» UEFN, которое теперь отвечает за эффектное вступительное видео. Используя Sequencer, вы можете добавлять различные камеры, элементы HUD-интерфейса, а также динамическое отображение участников, которое настраивается в зависимости от количества активных игроков. Подобно тому, как ранее работало устройство «Триггер импульса», «Видеоряд» активирует устройства в ключевые моменты, позволяя вам определять, когда показывать счёт следующего игрока или когда прервать представление.
В частности, видеоряд активирует устройство «Триггер» с именем StartPlayerIntroEvent всякий раз, когда начинается введение игрока, и активирует устройство «Триггер» с именем EndPlayerIntroEvent при завершении представления. Код Verse использует эту информацию, чтобы определить, сколько представлений игроков уже было показано, и останавливает воспроизведение внутриигрового видео, когда это число становится равным числу игроков. Если внутриигровое видео завершается первым, оно также прерывает ожидание показа представлений игроков, поскольку выполняется в выражении race.
В коде Verse для каждого игрока вызывается функция WaitForPlayerIntro(), которая запускает цикл loop для каждого игрока и ожидает, когда устройство «Триггер» под названием StartPlayerIntroEvent активируется необходимое число раз в соответствии со стартовой позицией игрока, чтобы начать отображать статистику игрока в HUD-интерфейсе. Каждый из этих циклов WaitForPlayerIntro() вызывается в функции ArraySync(), которая использует параллельный алгоритм сортировки с последовательным разделением для синхронизации (sync) нескольких асинхронных функций и элементов массива.
# A Verse-authored creative device that can be placed in a level
starting_game_sequence := class(creative_device):
# The cinematic that intros the players and their stats.
@editable
StartingLineupCinematic:cinematic_sequence_device = cinematic_sequence_device{}
# The cinematic that we cut to after the lineup and before the race starts.
@editable
RaceStartCinematic:cinematic_sequence_device = cinematic_sequence_device{}
В этом проекте используется устройство «Всплывающее диалоговое окно» для создания виджетов в Редакторе виджетов и замены информации при помощи Verse. Для этого задаётся текст на кнопках в устройстве «Всплывающее диалоговое окно».
# Updates the Popup UI to display the lifetime stats of the given player during the
# race starting sequence.
UpdatePopupUI<public>(Player:agent, PopupDialogUI:popup_dialog_device):void=
if:
CurrentPlayerStats := GetPlayerStats[Player]
then:
PopupDialogUI.SetButtonText(PlayerText(Player), 0)
PopupDialogUI.SetButtonText(PointsText(CurrentPlayerStats.Points), 1)
PopupDialogUI.SetButtonText(PodiumsText(CurrentPlayerStats.Podiums), 2)
BestLapText:message = if(IsValidBestLapTime[CurrentPlayerStats.BestLapTime]):
Дизайн уровня
В этом обновлении мы создали внедорожную трассу, используя режим формирования ландшафта. Мы сэкономили память за счёт использования меньшего количества ресурсов, а горы, которые теперь окружают трассу, имеют бóльшую глубину. Также мы использовали области воды и водопад, чтобы создать новый тип рельефа и привлечь внимание к следующей части гоночной трассы.
Мы перешли от цикла смены дня и ночи, использовавшегося в первоначальном проекте, к усовершенствованному освещению из четвёртой главы Fortnite. Новый цикл позволяет использовать технологию Lumen, создавая более мягкие тени и реалистичное глобальное освещение.
Знаете ли вы, что в оригинальном шаблоне гоночной трассы было более 120 барьеров? Они использовались для того, чтобы удерживать игроков на трассе и не допускать выезда машин за её пределы. В обновлении барьеры используются только для удержания игроков на стартовых позициях до начала гонки, а не по всей протяжённости трассы. Чтобы побудить игроков не съезжать с трассы, используются контрольные точки, коллекционные предметы и некоторые элементы окружения:
Монеты для ускорения: добавив разгонную площадку под последнюю монету в каждом ряду монет, мы побуждаем игроков оставаться на трассе, чтобы пройти гонку максимально быстро. Монеты появляются снова на каждом круге, поэтому если игрок пропустил их в первый раз, он сможет подобрать их на следующем круге.
Визуальный дизайн, удерживающий игроков на трассе: во многих местах вдоль трассы установлены короткие белые барьеры, чтобы визуально обозначить маршрут для игроков. Сама дорога сделана достаточно широкой, чтобы по ней могли ехать бок о бок несколько машин. Дополнительные декорации и объекты окружения, такие как деревья, фургоны и другие конструкции, размещены таким образом, чтобы игроку было комфортно ехать, не застревая, но при этом он не отклонялся от заданного маршрута.
Срезки и прыжки: изначально мы создали карту в форме восьмёрки, но в ходе тестирования мы обнаружили, что игрокам нравится совершать прыжки, чтобы сокращать путь. В новой версии добавлено несколько срезок и прыжков, чтобы игроки могли выбрать свой способ прохождения трассы.
Наконец, продуманно расставленные контрольные точки гонки тоже помогают заставить игроков следовать маршруту, поскольку каждая из таких точек необходима для прохождения гонки.