С шаблоном игры типа «паркур» на Verse вы научитесь создавать игровой режим, в котором игроки будут стратегически перемещаться между препятствиями и платформами, собирая батарейки.
В этом игровом режиме игрокам для прохождения уровня нужно собрать четыре батарейки. Время игры увеличится, если они найдут секретную батарейку. По истечении времени игрок возвращается в начало игры.
В этом шаблоне используются некоторые базовые функции языка Verse, к примеру:
-
циклы for;
-
подписки;
-
массивы;
-
API устройства.
В этом шаблоне не будут использоваться такие сложные концепции, как одновременное выполнение.
Обзор
Далее в оптимальном порядке перечислены шаги, необходимые для воссоздания этого острова.
-
Создайте новый проект и измените настройки острова, чтобы настроить игру.
-
Создайте арену.
-
Настройте устройства.
-
Добавьте сценарий Verse.
Создание нового проекта и настройка игры
-
Откройте UEFN и создайте новый пустой проект.
-
Выберите устройство Настройки острова в окне Структура и найдите Пользовательские настройки — Правила игры.
-
Измените пользовательские настройки, как показано ниже.
Параметр Значение Пояснение Условие победы в игре Счёт Побеждает тот, кто наберёт больше очков. Разрушение киркой Нет Кирка не может наносить урон окружению. Начинать с кирки False Игроки не могут начать игру с киркой. Автоподбор предметов Да Игроки будут автоматически подбирать предметы, до которых они дотронутся. Разрешить лазание/спринт/скольжение/удар плечом True Игроки смогут совершать элементы паркура для перемещения через объекты окружения. Условие победы в раунде Счёт Побеждают игроки с наибольшим счётом. Первая колонка таблицы со счётом Счёт В первой колонке таблицы со счётом будет отображаться счёт игрока.
Создание арены
На этой карте используется Набор объектов Кибер-сити, который можно найти в разделе Fortnite > Наборы > Объекты окружения.
Воссоздайте эту карту с платформами и препятствиями, по которым игроки будут перемещаться, используя элементы паркура.
Настройка устройств
В этом уроке используются следующие устройства:
-
1 таймер
Устройство «Точка появления игрока»

Используйте устройство Точка появления игрока для заброса игроков на карту. Разместите точку появления каждого игрока в начале карты: Fortnite > Устройства > Точка появления игрока.
Задайте для этого устройства следующие Пользовательские настройки:
Параметр | Значение | Пояснение |
---|---|---|
Отображение в игре | False | Устройство будет оставаться невидимым во время игры. |
Устройство выдачи предметов

В UEFN при перетаскивании расходуемого предмета с Панели ресурсов он будет автоматически размещён в Генераторе предметов. Перетащите Батарейку (Fortnite > Предметы > Батарейка) на карту.
Задайте для этого устройства следующие Пользовательские настройки:
Параметр | Значение | Пояснение | |
---|---|---|---|
Время до появления | 0,1 | Это определяет количество времени до появления предмета. | |
Повторное создание предмета по таймеру | False | Батарейка не появится ещё раз после того, как игрок подберёт её. | |
Отображение базы в игре | False | Устройство будет оставаться невидимым во время игры. | |
Дополнительные боеприпасы | False | Устройство не даёт дополнительные боеприпасы для выданного оружия. | |
Автоподбор на ходу | True | Игроки могут автоматически подобрать этот предмет. | |
Масштаб предмета | 2,0 | Определяет размер батарейки. |
Скопируйте и вставьте это устройство ещё четыре раза и разместите копии на карте.
Устройство завершения игры

Разместите устройство Завершение игры, чтобы закончить игру в момент его активации.
Задайте для этого устройства следующие Пользовательские настройки:
Параметр | Значение | Пояснение |
---|---|---|
Пользовательское сообщение на экране победы | Введите текст | Введите текст, который будет отображаться для победившего игрока. |
Устройство «Зона поражения»

Устройство Зона поражения представляет собой область, которая наносит урон попадающим в неё игрокам. Разместите это устройство под картой и настройте Ширину, Длину и Высоту зоны так, чтобы она охватывала всю нижнюю часть арены и мгновенно устраняла упавших игроков.
Задайте для этого устройства следующие Пользовательские настройки:
Параметр | Значение | Пояснение |
---|---|---|
Урон | 500 | Это устройство наносит серьёзный урон для мгновенного устранения упавших игроков. |
Устройство «Таймер»

Разместите это устройство рядом с устройством «Завершение игры». Таймер будет вести обратный отсчёт до момента, когда игрок будет устранён и ему придётся начать игру заново.
Задайте для этого устройства следующие Пользовательские настройки:
Параметр | Значение | Пояснение |
---|---|---|
Длительность | 30 | Таймер сработает через 30 секунд. |
Запустить в начале игры | True | Как только начнётся игра, включится таймер. |
На кого распространяется | Игрок | Когда таймер включён, он действует на определённого игрока. |
Успех по окончании отсчёта | False | Когда таймер заканчивает отсчёт, успех не засчитывается. |
Отображение во время игры | Скрыто | Устройство не будет отображаться во время игры. |
Текст при запуске таймера | Введите текст | Введите текст, который будет отображаться во время отсчёта на таймере. |
Устройство для вывода сообщений в интерфейсе

Используйте устройство для вывода сообщений в интерфейсе для вывода игровых сообщений, предназначенных для игроков.
Задайте для этого устройства следующие Пользовательские настройки:
Параметр | Значение | Пояснение |
---|---|---|
Время отображения | 2,0 | Сообщение будет отображаться в течение двух секунд. |
Отображать в начале раунда | False | Это сообщение будет отображаться не в начале раунда, а в момент подбора батарейки. |
Добавление сценариев Verse
Добавьте следующие сценарии Verse, приведя сначала ссылки на устройства с функцией @editable.
Вы можете скопировать представленный код. Комментарии внутри сценария приведены для пояснений.
using { /Fortnite.com/Devices }
using { /Fortnite.com/Characters }
using { /Verse.org/Simulation}
using { /UnrealEngine.com/Temporary/Diagnostics }
log_parkour := class(log_channel){}
# Это Verse-устройство творческого режима, которое можно разместить на уровне
# Это пример сценария игры типа «паркур», в которой нужно собрать 4 батарейки до окончания отсчёта таймера
#
# Первые шаги:
# https://dev.epicgames.com/documentation/ru-ru/uefn/learn-programming-with-verse-in-unreal-editor-for-fortnite
parkour_race_script := class(creative_device):
Logger : log = log{Channel:=log_parkour}
# Ссылка на генератор игрока
@editable
PlayerSpawnDevice : player_spawner_device = player_spawner_device{}
# Устройство завершения игры в случае победы
@editable
EndGameVictoryDevice : end_game_device = end_game_device{}
# Таймер для этого игрового режима
@editable
TimerDevice : timer_device = timer_device{}
# Сообщение в HUD, когда игрок подбирает батарейку
@editable
HUDMessageBattery : hud_message_device = hud_message_device{}
# Массив имеющихся генераторов предметов.
@editable
BatteryItemSpawners : []item_spawner_device = array{}
@editable
SecretBatteryItemSpawner : item_spawner_device = item_spawner_device{}
# Настраиваемое дополнительное время, когда игрок подбирает секретную батарейку
@editable
SecretBatteryTimeReward : float = 10.0
# Объявление количества собранных батареек (целочисленное значение)
var BatteriesCollected : int = 0
В сценарии выше показано, как использовать функцию @editable, чтобы сделать доступными в UEFN устройства творческого режима, массивы и числа с плавающей запятой. Чтобы в дальнейшем устройства можно было вызывать в сценарии, сначала их необходимо определить в Verse.
# Отображаемые сообщения при подборе батареек
BatteryCollectedMessage<localizes>(Amount:int) : message = "Подобрано вами батареек: {Amount}"
BatteriesCollectedMessage<localizes>(Amount:int) : message = "Подобрано вами батареек: {Amount}"
# Сообщения при подборе секретной батарейки и сообщение о выполнении задания
AllBatteriesCollectedMessage<localizes> : message = "Вы собрали все батарейки!"
SecretBatteryCollectedMessage<localizes> : message = "Вы подобрали секретную батарейку и вам добавлено время!"
В сценарии выше показано, как определить функцию, которая возвращает параметризированное сообщение на основе количества собранных батареек. В ней также определены отображаемые сообщения при подборе всех батареек и секретной батарейки.
# Выполняется при запуске сценария устройства device_script в работающей игре
OnBegin<override>()<suspends>:void=
# Вы можете вывести данные в журнал следующим образом, чтобы определить, как работает сценарий
Logger.Print("Сценарий игры типа «паркур» запущен!")
# Подписка на событие AgentSpawnedEvent.
# В момент появления игрока будет вызываться функция "HandleAgentSpawned".
PlayerSpawnDevice.SpawnedEvent.Subscribe(HandleAgentSpawned)
# То же самое для таймера. Нужно подписаться на событие завершения отсчёта
TimerDevice.FailureEvent.Subscribe(HandleTimerExpired)
# Проходим по массиву устройств batteryItemSpawners и подписываемся на событие ItemPickupEvent для каждого генератора предметов.
# При этом нам не нужно сохранять обработчик, как мы делали в случае с AgentSpawnedSubscription и TimerExpiredSubscription
# Тем не менее, без обработчика не получится отменить подписку, поэтому она будет срабатывать каждый раз при подборе предмета игроком.
for (BatterySpawner : BatteryItemSpawners):
BatterySpawner.ItemPickedUpEvent.Subscribe(HandleBatteryPickedUp)
<# Ещё один способ выполнения описанного выше цикла for, в котором используется целое число для перебора элементов массива
for (i:int := 0..BatteryItemSpawners.Length - 1):
if (Battery := BatteryItemSpawners[i]):
Battery.ItemPickedUpEvent.Subscribe(HandlebatteryPickedUp) #>
SecretBatteryItemSpawner.ItemPickedUpEvent.Subscribe(HandleSecretBatteryPickedUp)
Функция OnBegin определяет, что должно произойти в начале игры, а цикл for связан с событием подбора батареек.
# Функция, которая вызывается, когда в точке появления игрока появляется агент
HandleAgentSpawned(Agent:agent):void=
Logger.Print("Агент появился!")
# Перезапуск устройства «Таймер», чтобы при возрождении игроки получали полное время
TimerDevice.Reset(Agent)
TimerDevice.Start(Agent)
Выше представлен код для перезапуска таймера при появлении игрока.
# Функция, которая вызывается при подборе батарейки из генератора предметов
HandleBatteryPickedUp(Agent:agent):void=
# Увеличивает количество собранных батареек
set BatteriesCollected = BatteriesCollected + 1
# Далее количество собранных батареек выводится в журнал. Это полезно для отладки
Logger.Print("Количество собранных батареек: {BatteriesCollected}")
# Так можно проверить, достаточно ли собрано батареек для завершения игры
if:
BatteriesCollected >= BatteryItemSpawners.Length
then:
# Так можно проверить, собрали ли вы 4 (или больше) батарейки. Если да, то будет вызвана функция EndGame
spawn { EndGame(Agent) }
else:
# Этот код будет выполняться, если количество батареек меньше 4. Появится сообщение в HUD, которое подстегнёт игрока
# Сообщение в HUD-интерфейсе включает слово «батарейка», если подобрана всего одна батарейка. Это слово изменится на «батареек», если будет собрано больше батареек.
if:
BatteriesCollected = 1
then:
HUDMessageBattery.SetText(BatteryCollectedMessage(BatteriesCollected))
HUDMessageBattery.Show(Agent)
else:
HUDMessageBattery.SetText(BatteriesCollectedMessage(BatteriesCollected))
HUDMessageBattery.Show(Agent)
# Затем переходим к следующему генератору предметов в сформированном массиве
# Это можно сделать путём изменения индекса элемента массива. Данные оцениваются в операторе if, чтобы гарантировать правильность ссылки на NextBatterySpawner
if:
NextBatterySpawner := BatteryItemSpawners[BatteriesCollected]
then:
# При переходе к следующему генератору предметов нужно вызвать функцию SpawnItem, которая активирует следующую батарейку
NextBatterySpawner.SpawnItem()
Представленный выше код обрабатывает подбираемую батарейку. Если будут собраны все батарейки, будет вызван метод EndGame. Если нет, игроки увидят сообщения в HUD-интерфейсе и появится очередная батарейка.
HandleSecretBatteryPickedUp(Agent:agent):void=
Logger.Print("Подобрана секретная батарейка")
# Получим оставшееся время, чтобы к нему можно было добавить дополнительное время
var TimeRemaining:float = TimerDevice.GetActiveDuration( Agent )
var TimeToAdd:float = (TimeRemaining + SecretBatteryTimeReward)
# Добавим дополнительное время к времени отсчёта таймера, но так, чтобы не превысить изначально установленное время
TimerDevice.SetActiveDuration(Min(TimeToAdd, TimerDevice.GetMaxDuration()), Agent )
HUDMessageBattery.SetText(SecretBatteryCollectedMessage)
HUDMessageBattery.Show(Agent)
Представленный выше код позволяет увеличить время устройства «Таймер» при подборе секретной батарейки. При этом код составлен так, чтобы это не приводило к превышению изначального времени таймера, составляющего 30 секунд. Этот код также выводит сообщение на экран.
# Функция, которая вызывается по истечении времени отсчёта таймера
HandleTimerExpired(MaybeAgent:?agent):void=
Logger.Print("Время отсчёта таймера истекло")
if (Agent := MaybeAgent?):
Agent
# Устранение игрока
if:
FortCharacter:fort_character = Agent.GetFortCharacter[]
then:
FortCharacter.Damage(500.0)
Приведённый выше код устраняет игрока, когда заданное время истекает. После этого игрок возрождается и таймер перезапускается с помощью метода HandleAgentSpawned.
# Асинхронная функция, которая отвечает за обработку завершения игры
EndGame(Agent:agent)<suspends>:void=
HUDMessageBattery.SetText(AllBatteriesCollectedMessage)
HUDMessageBattery.Show(Agent)
# Ждёт три секунды до завершения игры
Sleep(3.0)
EndGameVictoryDevice.Activate(Agent)
# Выполняется при остановке сценария устройства device_script или при завершении игры
OnEnd<override>():void=
Logger.Print("Устройство Verse остановлено!")
Приведённый выше код завершает игру. Sleep(3.0) — это пример использования асинхронного метода.
Настройка устройства Verse

Скомпилируйте сценарий Verse, а затем найдите устройство на Панели ресурсов. Перетащите это устройство в непросматриваемую зону карты, чтобы задать его настройки.

На панели Сведения устройства задайте настройки как на картинке выше (выберите каждое устройство).
Задайте для этого устройства следующие Пользовательские настройки:
Параметр | Значение | Пояснение |
---|---|---|
PlayerSpawnDevice | Точка появления игрока | Выберите эту настройку из выпадающего меню, чтобы указать устройства. |
EndGameVictoryDevic | Устройство определения победы для завершения игры | Выберите эту настройку из выпадающего меню, чтобы указать устройства. |
TimerDevice | Таймер | Выберите эту настройку из выпадающего меню, чтобы указать устройства. |
HUDMessageBattery | Батарейка устройства для вывода сообщений в интерфейсе | Выберите эту настройку из выпадающего меню, чтобы указать устройства. |
PlayerSpawnDevice | Точка появления игрока | Выберите эту настройку из выпадающего меню, чтобы указать устройства. |
BatteryItemSpawners — 0 | Генератор батареек 1 | Выберите эту настройку из выпадающего меню, чтобы указать устройства. |
BatteryItemSpawners — 1 | Генератор батареек 2 | Выберите эту настройку из выпадающего меню, чтобы указать устройства. |
BatteryItemSpawners — 2 | Генератор батареек 3 | Выберите эту настройку из выпадающего меню, чтобы указать устройства. |
BatteryItemSpawners — 3 | Генератор батареек 4 | Выберите эту настройку из выпадающего меню, чтобы указать устройства. |
BatteryItemSpawners | Генератор батареек — секретная батарейка | Выберите эту настройку из выпадающего меню, чтобы указать устройства. |
SecretBatteryTimeReward | 10,0 | Дополнительное время за подбор секретной батарейки. |
Нажмите Запустить сеанс, чтобы протестировать готовый уровень.