При помощи тегов игрового процесса вы можете находить акторы, отмеченные тем или иным тегом, когда игра уже запущена. Теги игрового процесса позволяют работать с несколькими акторами без необходимости задавать свойства и присваивать ссылки в Unreal Editor для Fortnite (UEFN). Теги игрового процесса создаются на языке программирования Verse и присваиваются в UEFN.
Использование тегов игрового процесса открывает интереснейшие игровые возможности, такие как:
Изменение настроек уровня без необходимости добавлять или изменять ссылки на Verse-устройство.
Поиск всех акторов с определённым тегом и управление ими на основе их типа (к примеру, включение освещения или активация/деактивация барьеров).
Динамическое изменение активных акторов по мере продвижения игрока по игре.
Активация акторов по определённому условию для преодоления препятствий на основе выбранного игроком уровня сложности.
Что можно отмечать тегами?
На текущий момент теги игрового процесса можно присваивать элементам следующих типов:
В следующих разделах показано, как создавать и работать с тегами игрового процесса в проекте.
Создание тега игрового процесса
Ниже пошагово описан процесс создания нового тега игрового процесса при помощи языка Verse:
Откройте файл Verse в Visual Studio Code с помощью проводника Verse.
В начале файла Verse добавьте следующий код, чтобы использовать
ссылкина класс тегов.Verseusing { /Verse.org/Simulation/Tags }Создайте новый класс, который будет наследоваться от класса
тега. Имя вашего класса будет определять имя тега. В этом примере класс называетсяmytag, поэтому и сам тег игрового процесса будет называться mytag.Verse# Derive from the `tag` class in the Verse.org/Simulation/Tags module to create a new gameplay tag. mytag := class(tag){}Теперь файл Verse должен выглядеть следующим образом:
Verseusing { /Fortnite.com/Devices } using { /Verse.org/Simulation } using { /Verse.org/Simulation/Tags } # Derive from the `tag` class in the Verse.org/Simulation/Tags module to create a new gameplay tag. mytag := class(tag){}Сохраните файл Verse и нажмите Создать сценарии Verse на панели инструментов UEFN, чтобы скомпилировать код и получить возможность использовать новый тег игрового процесса.
Теги игрового процесса — это иерархические метки. Эти теги могут иметь любое количество иерархических уровней, разделённых символом _ (нижнее подчёркивание) в названии класса.
Когда название тега игрового процесса отображается в редакторе, символы _ заменяются на точками.
Например, тег игрового процесса с тремя уровнями имеет название класса family_genus_species и отображается в редакторе как family.genus.species, где «семейство» является наиболее общим идентификатором в иерархии, а «вид» — наиболее специфичным.
Обратите внимание, что наличие тега family.genus.species не обязательно подразумевает, что также будут существовать теги family.genus и family. Для создания уровней иерархии необходимо описать эти теги игрового процесса на языке Verse при помощи имен классов family и family_genus.
Присвоение тега игрового процесса
Ниже поэтапно описан процесс присвоения тега игрового процесса. В данном примере используется устройство, однако шаги будут аналогичными и для других типов акторов.
На панели Структура UEFN выберите устройство, которому вы хотите присвоить тег, чтобы открыть его панель Сведения. В данном примере в качестве устройства будет выступать Кнопка.
На панели «Сведения» нажмите Добавить новый компонент и выберите Разметка тегов Verse из выпадающего меню.
Выберите компонент VerseTagMarkup, чтобы отобразить его настройки на панели «Сведения».
В разделе Теги игрового процесса отредактируйте свойство Теги и добавьте свой тег игрового процесса. В данном примере устройству присваивается тег mytag.
Вы можете добавить несколько тегов для одного актора: благодаря этому один и тот же актор может одновременно относиться сразу к нескольким группам. Актор с несколькими тегами можно найти по любому из его тегов.
К примеру, актор с тегами mytag1 и mytag2 можно найти как по первому тегу (GetCreativeObjectsWithTag(mytag1{})), так и по второму (GetCreativeObjectsWithTag(mytag2{})).
Поиск акторов по тегу игрового процесса
После того как вы присвоите акторам все необходимые теги, вы сможете выполнять поиск акторов по тегам во время игрового процесса при помощи функции Verse GetCreativeObjectsWithTag(). В следующем примере вызов функции GetCreativeObjectsWithTag(mytag{}) позволяет сохранить в переменной TaggedDevices все акторы с тегом mytag:
TaggedActors := GetCreativeObjectsWithTag(mytag{})Вызов функции GetCreativeObjectsWithTag() возвращает массив всех объектов с реализацией creative_object_interface. Например, если вы присвоили тег mytag сразу двум устройствам на уровне, таким как <strong>Кнопка</strong> и Настраиваемое освещение, при вызове эта функция вернёт оба устройства.
Вы можете преобразовать результат 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]):
# If the tagged actor is a Customizable Light device, turn it off
LightDevice.TurnOff()
else if (BarrierDevice := barrier_device[TaggedActor]):
# If the tagged actor is a Barrier device, turn it off
BarrierDevice.Disable()При вызове GetCreativeObjectsWithTag() возвращаемый список не упорядочивается по какому-либо принципу, о котором можно знать или на который можно повлиять заранее. В случаях, когда вы добавляете или удаляете акторы между вызовами GetCreativeObjectsWithTag(), передавая в неё один и тот же тег, порядок элементов в возвращаемом списке каждый раз может быть разным.
Если в игре обработку акторов необходимо выполнять именно в заданном порядке, следует использовать редактируемый массив вместо тегов игрового процесса, потому что GetCreativeObjectsWithTag() возвращает неупорядоченный список акторов.
Поиск позиции по типу при помощи тегов игрового процесса
Ниже приведён пример того, как можно отфильтровать акторы, полученные при помощи функции GetCreativeObjectsWithTag(), по типу и вывести их позицию.
# find all actors with the all_tag
AllCreativeObjects : []creative_object_interface := GetCreativeObjectsWithTag(all_tag{})
# Print the position of all creative_prop actors with the all_tag
for (Prop : AllCreativeObjects):
if (Prop := creative_prop[Prop]):
Print("Prop found with all_tag at position: {Prop.GetTransform().Translation}")
# Print the position of all device actors with the all_tag
for (Device:AllCreativeObjects):
Уроки, в которых используются теги игрового процесса
В следующих уроках показано, как использовать теги игрового процесса в игре.
Головоломка из лампочек с тегами
Используйте устройство на Verse, чтобы создать головоломку, в которой игроку требуется найти правильную комбинацию включённых лампочек для получения предмета.