При помощи тегов игрового процесса вы можете находить акторы, отмеченные тем или иным тегом, прямо во время игры. Теги игрового процесса позволяют работать с несколькими акторами без необходимости задавать свойства и присваивать ссылки в Unreal Editor для Fortnite (UEFN). Теги игрового процесса создаются на языке программирования Verse и присваиваются в UEFN.
Использование тегов игрового процесса открывает интереснейшие игровые возможности, такие как:
- изменение настроек уровня без необходимости добавлять или изменять ссылки на Verse-устройства;
- поиск всех акторов с определённым тегом и управление ими на основе их типа (к примеру, включение освещения или активация/деактивация барьеров);
- динамическое изменение активных акторов по мере продвижения игрока по игре;
- условная активация акторов для преодоления препятствий на основе выбранного игроком уровня сложности.
Что можно отмечать тегами?
На текущий момент теги игрового процесса можно присваивать элементам следующих типов:
В следующих разделах показано, как создавать и работать с тегами игрового процесса в проекте.
Создание тега игрового процесса
Ниже пошагово описан процесс создания нового тега игрового процесса при помощи языка Verse:
- Откройте файл Verse в Visual Studio Code с помощью проводника Verse.
- В начале файла Verse добавьте следующий код, чтобы использовать класс
tag
.using { /Verse.org/Simulation/Tags }
- Создайте новый класс, который будет наследоваться от класса
tag
. Имя вашего класса будет определять имя тега. В этом примере класс имеет имяmytag
, поэтому и сам тег игрового процесса будет называться mytag.# Наследуется от класса tag из модуля Verse.org/Simulation/Tags для создания нового тега игрового процесса. mytag := class(tag){}
- Теперь файл Verse должен выглядеть следующим образом:
using { /Fortnite.com/Devices } using { /Verse.org/Simulation } using { /Verse.org/Simulation/Tags } # Наследуется от класса tag из модуля Verse.org/Simulation/Tags для создания нового тега игрового процесса. mytag := class(tag){}
- Сохраните файл Verse и нажмите Собрать код Verse на панели инструментов UEFN, чтобы скомпилировать код для использования нового тега игрового процесса.
Теги игрового процесса — это иерархические метки. Эти теги могут иметь любое количество иерархических уровней, разделённых символом _
(нижнее подчёркивание) в имени класса.
Когда имя тега игрового процесса отображается в редакторе, символы _
заменяются точками.
Например, тег игрового процесса с тремя уровнями имеет имя класса family_genus_species
и отображается в редакторе как family.genus.species
, где family
будет наиболее общим идентификатором в иерархии, а species
— наиболее конкретным.
Обратите внимание, что наличие тега family.genus.species
не обязательно подразумевает, что также будут существовать теги family.genus
и family
. Для создания уровней иерархии необходимо описать эти теги игрового процесса на языке Verse при помощи имён классов family
и family_genus
.
Присвоение тега игрового процесса
Ниже поэтапно описан процесс присвоения тега игрового процесса. В данном примере используется устройство, однако шаги будут аналогичными и для других типов акторов.
-
В окне «Структура» UEFN выберите устройство, которому вы хотите присвоить тег, чтобы открыть его панель «Сведения». В данном примере в качестве устройства будет выступать Кнопка.
-
На панели «Сведения» нажмите Добавить новый компонент и выберите VerseTagMarkup (разметка тегов Verse) из выпадающего меню.
-
Выберите компонент VerseTagMarkup, чтобы отобразить его настройки на панели «Сведения».
-
В разделе «Теги игрового процесса» отредактируйте свойство «Теги», добавив желаемый тег игрового процесса. В данном примере устройству присваивается тег mytag.
Вы можете добавить несколько тегов для одного актора. Так, один и тот же актор может одновременно относиться сразу к нескольким группам. Актора с несколькими тегами можно найти по любому из них.
К примеру, актор с тегами mytag1 и mytag2 можно найти как по первому тегу (GetCreativeObjectsWithTag(mytag1{})
), так и по второму (GetCreativeObjectsWithTag(mytag2{})
). Более подробную информацию об этой функции можно найти в разделе «Поиск акторов по тегу игрового процесса».
Поиск акторов по тегу игрового процесса
После того как вы присвоите акторам все необходимые теги, вы сможете искать акторов по тегам во время игрового процесса при помощи функции Verse GetCreativeObjectsWithTag()
. В следующем примере вызов функции GetCreativeObjectsWithTag(mytag{})
позволяет сохранить в переменной TaggedDevices
все акторы с тегом mytag:
TaggedActors := GetCreativeObjectsWithTag(mytag{})
Вызов функции GetCreativeObjectsWithTag()
возвращает массив всех объектов, в которых реализован creative_object_interface
. К примеру, если вы присвоили тег mytag сразу двум устройствам на уровне, таким как «Кнопка» и «Настраиваемое освещение», при вызове эта функция вернёт оба устройства.
Вы можете преобразовать результат вызова функции GetCreativeObjectsWithTag()
в один из классов с соответствующей реализацией (т. н. приведение типов), используя синтаксис NewObjectReference := object_type_to_cast_to[ObjectReference]
, где object_type_to_cast_to
— это желаемый тип объекта. К примеру, если вы хотите включить/выключить устройство «Настраиваемое освещение», необходимо преобразовать результат в customizable_light_device
перед тем, как вызывать метод TurnOff()
или TurnOn()
.
Приведение типов — это выражение с неоднозначным значением, потому что приведение типов не будет выполнено, если устройство невозможно преобразовать в указанный тип, к примеру, из-за разных типов. Так, нельзя преобразовать устройство «Кнопка» в класс customizable_light_device
, потому что устройства «Кнопка» и «Настраиваемое освещение» относятся к разным типам устройств.
В цикле for
можно использовать выражения с неоднозначным значением в качестве фильтра, чтобы создавать новые переменные для использования в блоке кода for
. К примеру, вы можете добавить приведение типов для класса customizable_light_device
в выражение итерации в for
. Так как устройство будет приведено к классу customizable_light_device
, вы сможете использовать методы данного класса, например TurnOff()
для выключения света.
TaggedActors := GetCreativeObjectsWithTag(mytag{})
for (TaggedActor : TaggedActors, LightDevice := customizable_light_device[TaggedActor]):
LightDevice.TurnOff()
В следующем примере показано, как при помощи условий определять тип актора и вызывать различные функции в зависимости от типа. В следующем примере мы проверяем, является ли актор с тегом устройством «Настраиваемое освещение» (для которого можно вызвать метод TurnOff()
, чтобы выключить свет) или устройством «Барьер» (для которого можно вызвать метод Disable()
, чтобы отключить объект).
TaggedActors := GetCreativeObjectsWithTag(mytag{})
for (TaggedActor : TaggedActors):
if (LightDevice := customizable_light_device[TaggedActor]):
# Если актор с тегом является устройством «Настраиваемое освещение», выключить его
LightDevice.TurnOff()
else if (BarrierDevice := barrier_device[TaggedActor]):
# Если актор с тегом является устройством «Барьер», отключить его
BarrierDevice.Disable()
При вызове функции GetCreativeObjectsWithTag()
возвращаемый список не упорядочивается по какому-либо принципу, о котором можно знать или на который можно повлиять заранее. Когда вы добавляете или удаляете акторы между вызовами функции GetCreativeObjectsWithTag()
, передавая в неё один и тот же тег, порядок элементов в возвращаемом списке каждый раз может быть разным.
Если в игре обработку акторов необходимо выполнять в строго заданном порядке, следует использовать редактируемый массив вместо тегов игрового процесса по той причине, что функция GetCreativeObjectsWithTag()
возвращает неупорядоченный список акторов.
Поиск позиции по типу при помощи тегов игрового процесса
Ниже приведён пример того, как можно отфильтровать акторы, полученные при помощи функции GetCreativeObjectsWithTag()
, по типу и вывести их позицию.
# Находим всех акторов с тегом all_tag
AllCreativeObjects : []creative_object_interface := GetCreativeObjectsWithTag(all_tag{})
# Выводим позицию всех акторов creative_prop с тегом all_tag
for (Prop : AllCreativeObjects):
if (Prop := creative_prop[Prop]):
Print("Найден объект окружения с тегом all_tag в позиции {Prop.GetTransform().Translation}")
# Выводим позицию всех акторов устройств с тегом all_tag
for (Device:AllCreativeObjects):
if (Device := creative_device_base[Device]):
Print("Найдено устройство творческого режима с тегом all_tag в позиции {Device.GetTransform().Translation}")
# Выводим позицию всех Verse-устройств с тегом all_tag
for (VerseAuthoredDevice : AllCreativeObjects):
if (VerseAuthoredDevice := creative_device[VerseAuthoredDevice]):
Print("Найдено пользовательское устройство с тегом all_tag в позиции {VerseAuthoredDevice.GetTransform().Translation}")
Уроки, в которых используются теги игрового процесса
В следующих уроках показано, как использовать теги игрового процесса в игре.