С помощью Шаблона взрывчатого устройства на языке Verse вы сможете разработать игру, в которой две команды должны активировать и обезвреживать бомбы.
В этом уроке используются устройство Verse и базовые устройства, такие как «Указатель на карте», для реализации игровой механики, например для отображения маячков в зависимости от условий.
В данном шаблоне продемонстрированы следующие концепции Verse:
-
Перечисляемые элементы
-
Одновременное выполнение
-
Выражение race («конкурентное выполнение»)
-
Ожидание
-
Обзор
Далее в оптимальном порядке перечислены шаги, необходимые для воссоздания этого острова.
-
Создайте новый проект и измените настройки острова, чтобы настроить игру.
-
Настройте устройства.
-
Добавьте сценарий Verse.
Создание нового проекта и настройка игры
-
Откройте UEFN и создайте новый пустой проект.
-
Выберите устройство IslandSettings на вкладке Структура и найдите Пользовательские настройки — Правила игры.
-
Измените пользовательские настройки, как показано ниже.
Параметр | Значение | Пояснение |
---|---|---|
Команды | Индекс команды 2 | Игроки будут разделены на команды по два участника. |
Всего раундов | 5 | В игре будет пять раундов. |
Режим зрителя для других команд | False | Игроки не смогут наблюдать за другими командами. |
Бесконечные ресурсы | False | У игроков не будет бесконечных ресурсов во время игры. |
Постройки могут разрушать окружение | False | Размещение конструкций, построенных игроками, не может уничтожить окружение, на которое они накладываются. |
Урон окружению | Откл. | Игроки не смогут наносить урон элементам окружения во время игры. |
Разрушение киркой | Нет | Кирка не может наносить урон окружению или постройкам. |
Возрождение вручную | False | Игроки не могут использовать меню Возрождение во время игры. |
Использовать счёт команды | True | Показатели каждой команды в игре определяются путём суммирования очков игроков. |
Настройка устройств
В этом уроке используются следующие устройства:
Взрывчатое устройство

Используйте Взрывчатое устройство для активации взрыва при срабатывании таймера. Скопируйте и разместите группу из четырёх взрывчатых устройств на противоположных сторонах карты.
Задайте для этого устройства следующие Пользовательские настройки:
Параметр | Значение | Пояснение |
---|---|---|
Возможность нанести урон | False | Игроки не могут нанести урон этому устройству. |
Испытание на время

Устройство Испытание на время выступает в качестве детонатора на каждом участке. Разместите его на обеих группах взрывчатых устройств.
Задайте для этого устройства следующие Пользовательские настройки:
Параметр | Значение | Пояснение |
---|---|---|
Время | 30 | Определяет время отсчёта таймера цели. |
Начальный счёт | 2 | Задаёт количество очков, начисляемое за успешный запуск незапущенного таймера. |
Очки за остановку | 5 | Задаёт количество очков, начисляемое за успешную остановку работающего таймера. |
Очки за завершение | 3 | Количество очков, начисляемое, когда таймер завершает отсчёт. |
Стиль текстовой метки таймера | Оранжевый жирный | Позволяет выбрать стиль таймера обратного отсчёта и пользовательского текста. |
Команда, способная запустить таймер | Индекс команды 1 | Определяет, какая команда может запустить незапущенный таймер. |
Текст при взаимодействии для запуска | Активация бомбы | Пользовательский текст, отображаемый в качестве подсказки для игрока, который может запустить незапущенный таймер. |
Время на запуск | 5 | Определяет длительность взаимодействия, необходимого для запуска незапущенного таймера. |
Команда, способная остановить таймер | Индекс команды 2 | Определяет, какая команда может остановить работающий таймер. |
Текст при взаимодействии (завершение) | Обезвреживание бомбы | Пользовательский текст, отображаемый в качестве подсказки для игрока, который может остановить работающий таймер. |
Время на остановку | 5,0 | Определяет длительность взаимодействия, необходимого для остановки работающего таймера. |
Расстояние слышимости звука таймера | Вся карта | Определяет, где будет слышен звук отсчёта: рядом с источником звука или повсеместно на карте. |
Устройство «Указатель на карте»

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

Используйте устройство Завершение игры для завершения раунда при успешном обезвреживании бомбы или по истечении 30 секунд, когда она взорвётся по команде сценария Verse.
Задайте для этого устройства следующие Пользовательские настройки:
Параметр | Значение | Пояснение |
---|---|---|
Победившая команда | Активирующая команда | Команда, которая активирует устройство, побеждает в игре. |
Что завершить | Завершить раунд | Это устройство завершает раунд. |
Устройство «Точка появления игрока»

Сгруппируйте устройства Точка появления игрока команд на противоположных сторонах карты. У каждой команды будут собственные точки появления. Команда 1 будет активировать бомбу, а команда 2 — обезвреживать. Команды будут меняться в каждом раунде.
Задайте для этого устройства следующие Пользовательские настройки:
Параметр | Значение | Пояснение |
---|---|---|
Команда игрока | Индекс команды 1 — 2 | Одному набору точек появления будет задано значение «Индекс команды 1», а другому — «Индекс команды 2». |
Добавление сценариев Verse
Добавьте следующие сценарии Verse, приведя сначала ссылки на устройства с функцией @editable.
Вы можете скопировать представленный код. Комментарии внутри сценария приведены для пояснений.
# Переменная типа enum для определения состояния бомбы
bomb_state<public>:= enum {AllUnarmed, BombAArmed, BombBArmed}
Код выше задаёт набор элементов перечисления для отслеживания состояния бомбы.
search_and_destroy := class(creative_device):
Logger:log = log{Channel:=log_search_and_destroy}
@editable
TimedObjectiveA: timed_objective_device = timed_objective_device{}
@editable
TimedObjectiveB: timed_objective_device = timed_objective_device{}
@editable
ExplosiveBarrelsA: []explosive_device = array{}
@editable
ExplosiveBarrelsB: []explosive_device = array{}
@editable
EndGameDevice: end_game_device = end_game_device{}
@editable
BombAMapIndicators: []map_indicator_device = array{}
@editable
BombBMapIndicators: []map_indicator_device = array{}
@editable
BombABeaconArm: beacon_device = beacon_device{}
@editable
BombABeaconDisarm: beacon_device = beacon_device{}
@editable
BombBBeaconArm: beacon_device = beacon_device{}
@editable
BombBBeaconDisarm: beacon_device = beacon_device{}
var BombState:bomb_state = bomb_state.AllUnarmed
Вы можете использовать @editable, чтобы ссылаться на устройства.
# Выполняется при запуске устройства в работающей игре
OnBegin<override>()<suspends>:void=
# Выражение race («гонка») используется для конкурентного (одновременного) выполнения блока из двух или более асинхронных выражений. Выражение, которое выполнится быстрее, «выиграет гонку».
# https://www.fortnite.com/en-US/creative/docs/uefn/race-in-verse
race:
block:
# Дождёмся активации бомбы A
ArmingPlayer:= TimedObjectiveA.StartedEvent.Await()
Print("Бомба A активирована",?Duration:=5.0)
# Используется для определения маячков, которые необходимо включить, и бочек, которые должны быть взорваны
set BombState = bomb_state.BombAArmed
# Отключим другое устройство «Испытание на время»
TimedObjectiveB.Disable(ArmingPlayer)
# Отключим указатели на карте для бомбы B
for (MapIndicator : BombBMapIndicators):
MapIndicator.Disable()
Первая часть кода отражает конкурентное выполнение с использованием выражения race, чтобы определить, какая из бомб (A или B) была активирована первой.
block:
# Дождёмся активации бомбы B
ArmingPlayer:= TimedObjectiveB.StartedEvent.Await()
Print("Бомба B активирована",?Duration:=5.0)
# Используется для определения маячков, которые необходимо включить, и бочек, которые должны быть взорваны
set BombState = bomb_state.BombBArmed
# Отключим другое устройство «Испытание на время»
TimedObjectiveA.Disable(ArmingPlayer)
# Отключим указатели на карте для бомбы A
for (MapIndicator : BombAMapIndicators):
MapIndicator.Disable()
# Включим соответствующие устройства «Маячок» после активации бомбы
UpdateBeacons()
# Дождёмся завершения или остановки TimedObjective
race:
block:
BombDetonated(TimedObjectiveA.CompletedEvent.Await())
block:
BombDetonated(TimedObjectiveB.CompletedEvent.Await())
block:
DisarmingPlayer:= TimedObjectiveA.StoppedEvent.Await()
Print("Бомба обезврежена", ?Duration:=5.0)
EndGameDevice.Activate(DisarmingPlayer)
block:
DisarmingPlayer:= TimedObjectiveB.StoppedEvent.Await()
Print("Бомба обезврежена", ?Duration:=5.0)
EndGameDevice.Activate(DisarmingPlayer)
В коде выше представлена одновременная обработка, при которой сценарий ждёт, когда «Испытание на время» завершится или остановится.
# Отключаем маячки обезвреженных бомб и включаем маячок на активированной бомбе
UpdateBeacons():void=
BombABeaconArm.Disable()
BombBBeaconArm.Disable()
if:
BombState = bomb_state.BombAArmed
then:
BombABeaconDisarm.Enable()
else:
BombBBeaconDisarm.Enable()
Код выше обновляет состояние маячков в зависимости от активированных бомб.
BombDetonated(Agent:agent):void=
Print("Бомба взорвалась", ?Duration:=5.0)
# Определяем, какая группа бочек должна взорваться
if:
BombState = bomb_state.BombAArmed
then:
ExplodeBarrels(ExplosiveBarrelsA, Agent)
else:
ExplodeBarrels(ExplosiveBarrelsB, Agent)
EndGameDevice.Activate(Agent)
Метод выше вызывается после завершения работы устройства «Испытание на время». Он определяет, какие бочки должны взорваться, и завершает игру.
ExplodeBarrels(Barrels:[]explosive_device, Agent:agent):void=
for (Barrel : Barrels):
Barrel.Explode(Agent)
Цикл for выше отвечает за взрыв каждой бочки именно на том участке, где заложена бомба.
Устройство Verse

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

На панели Сведения устройства задайте настройки как на картинке выше (выберите каждое устройство).
Задайте для этого устройства следующие Пользовательские настройки:
Параметр | Значение | Пояснение |
---|---|---|
TimeObjectiveA | Испытание на время BombSiteA | Привязывает устройство «Испытание на время» к участку со взрывчаткой. |
TimeObjectiveB | Испытание на время BombSiteB | Привязывает устройство «Испытание на время» к участку со взрывчаткой. |
ExplosiveBarrelsA | 0 — BarrelBombSiteA_1 | Привязывает взрывчатое устройство. |
ExplosiveBarrelsA | 1 — BarrelBombSiteA_2 | Привязывает взрывчатое устройство. |
ExplosiveBarrelsA | 2 — BarrelBombSiteA_3 | Привязывает взрывчатое устройство. |
ExplosiveBarrelsA | 3 — BarrelBombSiteA_4 | Привязывает взрывчатое устройство. |
ExplosiveBarrelsB | 0 — BarrelBombSiteB_1 | Привязывает взрывчатое устройство. |
ExplosiveBarrelsB | 1 — BarrelBombSiteB_2 | Привязывает взрывчатое устройство. |
ExplosiveBarrelsB | 2 — BarrelBombSiteB_3 | Привязывает взрывчатое устройство. |
ExplosiveBarrelsB | 3 — BarrelBombSiteB_4 | Привязывает взрывчатое устройство. |
EndGameDevice | Устройство «Завершение игры» 2 | Привязывает устройство «Завершение игры». |
BombAMapIndicators | 0 — Map_Team1_BombsiteA | Привязывает устройство «Указатель на карте» к участку со взрывчаткой. |
BombAMapIndicators | 1 — Map_Team2_BombsiteA | Привязывает устройство «Указатель на карте» к участку со взрывчаткой. |
BombBMapIndicators | 0 — Map_Team1_BombsiteB | Привязывает устройство «Указатель на карте» к участку со взрывчаткой. |
BombBMapIndicators | 1 — Map_Team2_BombsiteB | Привязывает устройство «Указатель на карте» к участку со взрывчаткой. |
BombABeaconArm | BeaconArmBombSiteA | Активирует взрывчатку на участке A. |
BombABeaconArm | BeaconArmBombSiteA | Обезвреживает взрывчатку на участке A. |
BombBBeaconArm | BeaconArmBombSiteB | Активирует взрывчатку на участке B. |
BombBBeaconArm | BeaconArmBombSiteB | Обезвреживает взрывчатку на участке B. |
Нажмите Запустить сеанс, чтобы протестировать готовый уровень.