Материалы имеют множество функций в UEFN благодаря редактируемым параметрам материалов, доступным в Verse. Параметризованные материалы — основа создания высококачественного пользовательского интерфейса (ПИ) с помощью material_block.
Блок material_block использует параметры материала интерфейса или экземпляров материалов для изменения значений параметров и управления ими с помощью кода Verse при создании динамического интерфейса. Например, параметры материала шкалы интерфейса можно подстраивать в Verse, задавая нужное поведение материала, когда игрок получает урон или наносит урон врагу.
Прежде чем написать строку кода, подумайте, как вы будете использовать материалы в интерфейсе. Создайте каркасное представление, чтобы определить, как должен выглядеть интерфейс и каково будет назначение материалов.
Материалы и текстуры интерфейса
Прописывание ячейки material_block в коде начинается с созданием материала интерфейса. Вы можете использовать функции материала и материалы, доступные в шаблоне функции пользовательских интерфейсов, либо создать свой собственный материал с нуля.
См. раздел «Материалы интерфейса», где описан порядок создания собственных материалов интерфейса.
Материалы
Создание нового пользовательского материала позволяет выделить ваш интерфейс на фоне других пользователей, которые лишь изменяют существующие общедоступные материалы интерфейса. Сначала настройте материалы интерфейса. При создании материалов интерфейса придерживайтесь следующего проверенного на практике порядка действий:
Задайте в качестве Назначения материала Пользовательский интерфейс в узле основного материала (ММN).
Измените корневой материал так, чтобы он был простым.
Чем больше параметров, тем больше возможностей при работе с материалом.
Когда материал будет готов, преобразуйте его в экземпляр материала.
Экземпляры материалов используются в качестве типа класса в коде Verse. В Verse свойствам и параметрам материала вы можете задать значения по умолчанию.
При присваивании названий экземплярам материалов руководствуйтесь следующим соглашением об именах Fortnite:
MI_UI_MaterialName
текстуры.
Текстуры придают дизайну интерфейса особую утончённость, которой невозможно достичь с помощью одних лишь материалов. В UEFN есть папка текстур, которые можно использовать в интерфейсе: Папка проекта > Fortnite > Textures. Любые импортируемые текстуры должны подчиняться правилу степеней двойки.
Узлы материала используют параметры материала и предоставляют их в коде Verse. В Verse вы можете использовать параметры материала для задания значений пикселей текстуры (текселей) в пределах материала, чтобы создать нужный тип маски или для других вычислений при редактировании и изменении внешнего вида и поведения текстур.
Чтобы убедиться, что ваши текстуры оптимизированы для использования в интерфейсе, откройте миниатюру и задайте следующие настройки на панели «Сведения»:
задайте в настройках создания MIP-текстур значение «Без MIP-карт»;
установите для группы текстур значение «Интерфейс»;
задайте в настройках сжатия значение «Пользовательский интерфейс 2C (RGBA8)».
Импортированные текстуры, которые не соответствуют правилу степени двойки, можно отредактировать, чтобы подобрать надлежащий масштаб текстуры. Чтобы отредактировать текстуру, следуйте указаниям из раздела «Изменение размера текстур».
1-й пример блока материала
material_block используется в качестве одной из ячеек внутри пользовательского виджета, созданного с помощью кода Verse. Во время игры material_block позволяет управлять параметрами материала с помощью Verse, чтобы изменять внешний вид и поведение материала (экземпляра материала) интерфейса в HUD-интерфейсе. Это похоже на то, как image_block позволяет использовать текстуру в Verse.
Виджет пользовательского материала используется в коде Verse несколькими способами:
Он позволяет использовать параметры материала для определения размера, поведения и внешнего вида материала в интерфейсе.
Передаёт данные Verse в параметры, что позволяет управлять параметрами с помощью динамических данных игрового процесса, доступных только в Verse.
Следующий код демонстрирует, как используется material_block для отображения блока растворяющегося материала в HUD-интерфейсе. Весь блок кода можно найти в разделе Полный код ниже.
В коде Verse важно применять проверенные на практике методы размещения и отображения элементов интерфейса.
Модули для интерфейса и материалов
Следующие модули содержат функции, используемые для управления блоком material_block в качестве виджета интерфейса. С их помощью задаются цвета, размещение материалов и многое другое.
using { /Fortnite.com/Devices }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /UnrealEngine.com/Temporary/UI }Определение назначения виджетов и материалов интерфейса UMG в классе устройств
В классе устройств Verse объявляется переменная виджета стекового поля с именем MyUI. с параметром Orientation, установленным в orientation.Vertical. В результате этого содержимое стекового поля отображается по вертикали.
Затем объявляется параметр UI.MaterialBlock.MI_UI_Dissolve_material с именем DissolveMaterial вместе с параметром Dissolve; помимо этого ему присваивается значение по умолчанию 0,2.
materialblock_test_device := class(creative_device):
var MyUI:stack_box = stack_box{Orientation := orientation.Vertical}
DissolveMaterial:UI.MaterialBlock.MI_UI_Dissolve_material = UI.MaterialBlock.MI_UI_Dissolve_material {Dissolve := 0.2}
Управление интерфейсом и материалами с помощью функции «В начале»
В функции OnBegin создаётся квадрат в HUD-интерфейсе, который растворяется при запуске игры.
Переменная DissolveMaterialBlock имеет тип material_block и ссылается на материал интерфейса, устанавливая в DefaultImage материал интерфейса (DissolveMaterial), а DefaultDesiredSize задаёт размер material_block по умолчанию при его отрисовке в виджете с использованием координат X и Y.
Выражение for используется для отображения интерфейса на экране для каждого игрока в игровом пространстве. GetPlayspace(). Функция GetPlayers() получает массив всех игроков в игре, а затем добавляет виджет, содержащий material_block, в их HUD-интерфейс, с учётом следующих инструкций в выражении do:
Создаёт стековое поле под названием MyStackBox.
Задает его вертикальнуюориентацию.
Вставляет DissolveMaterialBlock в первую ячейку MyStackBox.
Задаёт для MyUI значение MyStackBox, чтобы его можно было добавить в HUD-интерфейс игрока вне этого цикла.
OnBegin<override>()<suspends>:void=
DissolveMaterialBlock := material_block:
DefaultImage := DissolveMaterial
DefaultDesiredSize := vector2{X:=400.0, Y:=400.0}
for:
Player:GetPlayspace().GetPlayers()
PlayerUI := GetPlayerUI[Player]
do:
MyStackBox:stack_box = stack_box:
Полный код
Скопируйте и вставьте весь блок кода ниже, чтобы увидеть блок растворяющегося материала в HUD-интерфейсе.
Чтобы этот блок кода работал, в вашем проекте должен присутствовать растворяющийся материал.
Чтобы узнать, как создать собственное устройство Verse, обратитесь к разделу «Создание собственного устройства Verse».
using { /Fortnite.com/Devices }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /UnrealEngine.com/Temporary/UI }
materialblock_test_device := class(creative_device):
var MyUI:stack_box = stack_box{Orientation := orientation.Vertical}
DissolveMaterial:UI.MaterialBlock.MI_UI_Dissolve_material = UI.MaterialBlock.MI_UI_Dissolve_material {Dissolve := 0.2}
2-й пример блока материала
Этот пример основан на приведённом выше примере и в нём добавляются два дополнительных материала интерфейса — устройство «Триггер» и устройства «Активация при нажатии». Триггеры используются для отображения и изменения материала, отображаемого в HUD-интерфейсе.
Код Verse начинается с тех же модулей, что и блок кода выше, для управления блоком material_block и определения параметров материала интерфейса. Для работы редактируемых свойств этого кода требуется один дополнительный модуль:
using { /Verse.org/Simulation }
Настройка класса устройств Verse
Этот класс устройств Verse имеет больше функций, чем предыдущий класс устройств. Выражение для сообщения под названием Text используется для отображения сообщения «Это текстовый блок». Это выражение вызывается в функции OnBegin с помощью text_block.
# A Verse-authored creative device that can be placed in a level
materialblock_test_device := class(creative_device):
Text<localizes><public> : message = "This is a Text Block."
В класс устройств добавляются три редактируемых устройства «Триггер» и два редактируемых устройства «Активация при нажатии» для управления material_block и стековым полем. Каждый триггер переименовывается в соответствии с выполняемой им функцией, например:
TriggerShow
TriggerChange
TriggerHide
inputTriggerInc (увеличивает значение)
inputTriggerDec (уменьшает значение)
@editable
TriggerShow:trigger_device = trigger_device{}
@editable
TriggerChange:trigger_device = trigger_device{}
@editable
TriggerHide:trigger_device = trigger_device{}
@editable
InputTriggerInc:input_trigger_device = input_trigger_device{}
@editable
InputTriggerDec:input_trigger_device = input_trigger_device{}
Объявляется переменная стекового поля с именем MyUI, которая аналогична переменной MyUI в коде выше.
var MyUI:stack_box = stack_box{Orientation := orientation.Vertical}Три материала интерфейса (радиальный, полосатый и растворяющийся) добавляются в класс устройства, и для их эффектов присваиваются значения по умолчанию.
RadialMaterial:UI.MaterialBlock.MI_UI_MaterialBlock_Radial_material = UI.MaterialBlock.MI_UI_MaterialBlock_Radial_material {Progress := 1.0}
StripeMaterial:UI.MaterialBlock.MI_UI_Stripe_material = UI.MaterialBlock.MI_UI_Stripe_material {Speed := 0.5}
DissolveMaterial:UI.MaterialBlock.MI_UI_Dissolve_material = UI.MaterialBlock.MI_UI_Dissolve_material {Dissolve := 0.2}
Управление интерфейсом, материалами и триггерами с помощью функции «В начале»
Функция OnBegin задаёт элементы управления для различных устройств «Триггер», подписав различные функции на их события TriggeredEvents, и управляет устройствами «Активация при нажатии», подписав функции на их события PressedEvents. Когда значение по умолчанию увеличивается или уменьшается, Verse влияет на материалы интерфейса с помощью material_block следующим образом:
OnShow: отображает материал интерфейса в HUD-интерфейсе игрока.OnChange: изменяет параметр «Выполнение» материала интерфейса, чтобы отобразить изменение материала заполнения.OnHide: скрывает материал интерфейса от игрока.IncreasesValue: увеличивает ход выполнения и скорость растворения материала, а также интенсивность растворения в материале.DecreasesValue: уменьшает выполнение и скорость растворения материала, а также интенсивность растворения в материале.
OnBegin<override>()<suspends>:void=
Print ("Init")
TriggerShow.TriggeredEvent.Subscribe(OnShow)
TriggerChange.TriggeredEvent.Subscribe(OnChange)
TriggerHide.TriggeredEvent.Subscribe(OnHide)
InputTriggerInc.PressedEvent.Subscribe(IncreaseValue)
InputTriggerDec.PressedEvent.Subscribe(DecreaseValue)
Переменная text_block с именем Label используется для добавления text_block в устройство Verse. Блок text_block используется для отрисовки строки текста в HUD-интерфейсе игрока. Блок text_block отображает сообщение, закодированное в переменной текста по умолчанию, и управляет видом и размещением текста с помощью следующих настроек текстового блока:
DefaultTextColorDefaultShadowColorDefaultShadowOffset
var Label:text_block = text_block:
DefaultText := Text,
DefaultTextColor := NamedColors.White,
DefaultShadowColor:= color{R:=0.0, G:=0.0, B:=0.0},
DefaultShadowOffset := option{vector2{X:=5.0, Y:=2.0}}Три материала интерфейса добавляются в выражения и управляются с помощью material_block.
RadialMaterialBlock := material_block:
DefaultImage := RadialMaterial
DefaultDesiredSize := vector2{X:=400.0, Y:=400.0}
StripeMaterialBlock := material_block:
DefaultImage := StripeMaterial
DefaultDesiredSize := vector2{X:=400.0, Y:=400.0}
Выражение for используется для определения момента, когда интерфейс должен отобразиться на экране и какой конкретно.
Интерфейс появляется на экране при нахождении каждого игрока в игровом пространстве с помощью GetPlayspace().GetPlayers(), затем вызывает GetPlayerUI[Player], чтобы вернуть класс player_ui игрока. Это необходимо для добавления виджета в HUD-интерфейс/интерфейс игрока.
for:
Player:GetPlayspace().GetPlayers()
PlayerUI := GetPlayerUI[Player]Затем в выражении do создаётся новый stack_box с именем MyStackBox за счёт использования настроек виджета UMG стекового поля. Как только значения виджета будут присвоены MyStackBox, новой переменной с именем MyUI будут присвоены все значения MyStackBox в среде выполнения.
Это позволит MyUI использовать свойства виджета стекового поля и ссылаться на material_block для следующих действий:
использование свойства
Orientationстекового поля;назначение
stack_box_slotкаждой переменнойmaterial_block,text_blockиLabelв массиве, используявыражение Slots:arrayдля организации объектов массива.
do:
MyStackBox:stack_box = stack_box:
Orientation := orientation.Vertical
Slots := array:
stack_box_slot:
Widget := stack_box:
Orientation := orientation.Horizontal
Slots := array:
stack_box_slot:
Widget := RadialMaterialBlock
Создание функции OnShow
После вызова TriggerShow.TriggeredEvent функция OnShow захватывает всех игроков в игровом пространстве и их интерфейс игрока, а затем добавляет виджет в их интерфейс игрока, используя значение MyUI.
Наконец, в среде выполнения значение прогресса RadialMaterial устанавливается на 1,0, что означает, что шкала здоровья или щита заполнена к началу игры.
OnShow(InAgent: ?agent):void=
Print ("Show")
for:
Player:GetPlayspace().GetPlayers()
PlayerUI := GetPlayerUI[Player]
do:
PlayerUI.AddWidget(MyUI)
set RadialMaterial.Progress = 1.0
Создание функции OnHide
Чтобы скрыть материал интерфейса из HUD-интерфейса при получении урона шкалой здоровья или щита, функция OnHide использует выражение for для захвата игроков в игровом пространстве и интерфейса игрока, а затем обновляет интерфейс игрока с помощью PlayerUI.RemoveWidget (MyUI).
OnHide(InAgent: ?agent):void=
Print ("Hide")
for:
Player:GetPlayspace().GetPlayers()
PlayerUI := GetPlayerUI[Player]
do:
PlayerUI.RemoveWidget(MyUI)
Создание функции OnChange
Материал интерфейса меняет свой внешний вид в зависимости от значений, передаваемых через параметр прогресса . Когда происходит событие TriggerChange.TriggeredEvent, вызывается функция OnChange, которая обновляет параметр «Прогресс» материала интерфейса RadialMaterial на основе IncreaseValue и DecreaseValue.
OnChange(InAgent: ?agent):void=
Print ("Change Material Parameter")
set RadialMaterial.Progress = RadialMaterial.Progress - 0.25Создание функции IncreaseValue
Функция IncreaseValue увеличивает значения параметра «Прогресс» материала на предварительно заданные значения прогресса, скорости и рассеивания:
Прогресс = +1,0
Скорость = +0,1
Растворение = +0,025
Это изменение происходит, когда игроки получают здоровье или щит. Оно будет отображаться на их здоровье и материале щита в HUD-интерфейсе.
Этот код также работает при применении к здоровья и щиту вражеского ИИ, когда новый ИИ появляется в игре.
IncreaseValue(InAgent: agent):void=
Print ("Increase Value of Material Parameter")
set RadialMaterial.Progress += 1.0
set StripeMaterial.Speed += 0.1
set DissolveMaterial.Dissolve += 0.025
Создание функции DecreaseValue
Функция DecreaseValue уменьшает значения параметра «Прогресс» на материале за предварительно заданную величину прогресса, скорости и растворения:
Прогресс = –1,0
Скорость = –0,1
Растворение = –0,025
Это изменение происходит, когда игроки получают урон, наносимый здоровьем или щиту. Оно будет отображаться на их здоровье и материале щита в HUD-интерфейсе.
Этот код также работает по отношению к вражескому ИИ, когда во время игры он получает урон здоровью или щитам.
DecreaseValue(InAgent: agent):void=
Print ("Decrease Value of Material Parameter")
set RadialMaterial.Progress -= 1.0
set StripeMaterial.Speed -= 0.1
set DissolveMaterial.Dissolve -= 0.025
Самостоятельная работа
Если у вас есть радиальный материал, полосатый материал или растворяющийся материал, вы можете скопировать и вставить следующий код в свой проект, чтобы увидеть, как material_block работает с каждым из них в коде Verse.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /UnrealEngine.com/Temporary/UI }
# A Verse-authored creative device that can be placed in a level
materialblock_test_device := class(creative_device):
Text<localizes><public> : message = "This is a Text Block."