При отладке игры можно выводить на экран определённые данные для тестирования, скрыв потом эту информацию от игрока. Конечно, можно записывать отладочную информацию в журнал, однако некоторые игровые данные можно представить более наглядно с помощью API отладочного рисования.
С помощью этого API можно рисовать базовые формы и настраивать их местоположение, размер, цвет и время отображения на экране. К примеру, можно визуализировать предел видимости неигрового персонажа или расстояние, на котором можно услышать звук, от точки его возникновения. С помощью кубоидной отладочной формы можно нарисовать кубоид с размерами и местоположением, соответствующими любой области, даже если эта область не отображается в игре. Это помогает настроить расположение областей с определёнными эффектами.
Отладочную форму в виде стрелки, проведённой от лица неигрового персонажа до предела его поля зрения, можно использовать для выбора оптимального расположения охранников.
Включите отладочное рисование в Verse
Для начала убедитесь, что вы видите формы, которые изображаете.
Выберите Настройки острова на панели «Структура» UEFN.
В строке поиска на панели «Сведения» введите debug. Это позволит оставить только результаты из категории «Пользовательские настройки — Отладка».
Нажмите Отладка, а затем Отладочное рисование в Verse для активации функций отладки и отладочного рисования в Verse.
Отладочное рисование в Verse будет активно только во время игрового сеанса в UEFN. Оно будет включено только для конкретного пользователя, т. е. видеть отладочные формы будет только тот пользователь, который активировал отладку и отладочное рисование в Verse. Отладочные формы не отображаются в окне просмотра UEFN или на опубликованном острове, даже если они включены в настройках острова.
Нарисуйте свою первую отладочную форму
Чтобы нарисовать свою первую отладочную форму с помощью API отладочного рисования, выполните следующие действия:
Добавьте следующее выражение импорта в файл Verse.
Verseusing { /UnrealEngine.com/Temporary/Diagnostics }Создайте канал, объявив подкласс, который наследует от типа
debug_draw_channel. Каналы служат для группирования связанных форм. Они не обязательны, но всё же рекомендуется их использовать. В API отладочного рисования есть функции, которые можно использовать для отображения, скрытия и удаления сразу нескольких форм; однако отображение и скрытие работают только на уровне канала.Versemy_debug_draw := class(debug_draw_channel) {}Объявите новую константу типа
debug_draw. Это будет объект, используемый для вызова методов отрисовки фигур. В данном примере используется параметр Channel (созданный на предыдущем шаге), но это не обязательно.VerseDebugDraw:debug_draw = debug_draw{Channel := my_debug_draw}Вызовите метод
DrawSphere. В этом примере используются два параметра.
Center:= vector3{Z:= 150.0}: это обязательный параметр типа vector3, который определяет местоположение центра сферы. В данном примере вы будете использовать конструктор типаvector3для создания литерального значения. Это выражение задаёт местоположение центра сферы0.0, 0.0, 150.0.?DrawDurationPolicy:= debug_draw_duration_policy.Persistent: это параметр типа option, но при его значении по умолчанию сфера исчезнет через несколько секунд, поэтому задайте для него политику Persistent. Это означает, что сфера будет отображаться на острове, пока не будет скрыта или удалена другим кодом.VerseDebugDraw.DrawSphere(Center := vector3{Z:=150.0}, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)
После сборки кода Verse и запуска сеанса вы увидите сферу в месте, заданном с помощью параметра Center.
Формы
С помощью API отладочного рисования вы можете нарисовать несколько форм, которые будут отображаться в текущем сеансе UEFN в простом каркасном представлении. Используемая форма зависит от ситуации. В следующих разделах описаны методы отрисовки каждой формы и параметры, уникальные для каждого метода. Затем описаны общие параметры всех методов. Каждый пример кода в этом разделе предполагает, что вы добавили код из раздела «Нарисуйте свою первую отладочную форму» в файл Verse.
Кубоид
Используйте метод DrawBox(), чтобы нарисовать кубоид.
DebugDraw.DrawBox(vector3{Z:=150.0}, rotation{}, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)| Уникальный параметр | Что делает |
|---|---|
Center:vector3 | Задаёт центр кубоида |
Rotation:rotation | Задаёт поворот кубоида |
?Extent:vector3 | Задаёт длину, ширину и высоту кубоида |
Капсула
Используйте метод DrawCapsule(), чтобы нарисовать капсулу. Капсула состоит из цилиндра с полусферой на каждом конце.
DebugDraw.DrawCapsule(vector3{Z:=200.0}, rotation{}, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)| Уникальный параметр | Что делает |
|---|---|
Center:vector3 | Задаёт центр капсулы |
Rotation:rotation | Задает поворот капсулы |
?Height:float | Задает длину капсулы |
?Radius:float | Задаёт радиус капсулы в её самой широкой точке |
Сфера
Используйте метод DrawSphere(), чтобы нарисовать сферу.
DebugDraw.DrawSphere(vector3{Z:=150.0}, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)| Уникальный параметр | Что делает |
|---|---|
Center:vector3 | Задаёт центр сферы |
?Radius:float | Задаёт радиус сферы в её самой широкой части |
?NumSegments:int | Задает количество линий, составляющих сферу |
Конус
Используйте метод DrawCone(), чтобы нарисовать конус.
DebugDraw.DrawCone(vector3{Z:=150.0}, vector3{Z:=-1.0}, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)| Уникальный параметр | Что делает |
|---|---|
Origin:vector3 | Задаёт местоположение вершины конуса |
Direction:vector3 | Задаёт направление от вершины к основанию конуса |
?Height:float | Задаёт длину конуса |
?NumSides:int | Задаёт количество сторон |
?AngleWidthRadians:float | Задаёт ширину конуса в направлении X |
?AngleHeightRadians:float | Задаёт ширину конуса в направлении Y |
Чтобы основание конуса было идеально круглым, AngleWidthRadians и AngleHeightRadians должны совпадать.
Цилиндр
Используйте метод DrawCylinder(), чтобы нарисовать цилиндр.
DebugDraw.DrawCylinder(vector3{Z:=100.0}, vector3{Z:=200.0}, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)| Уникальный параметр | Что делает |
|---|---|
Start:vector3 | Задает местоположение одного конца цилиндра |
End:vector3 | Задаёт местоположение другого конца цилиндра |
?NumSegments:int | Задаёт количество линий, соединяющих один конец цилиндра с другим |
?Radius:float | Задаёт радиус двух окружностей, образующих каждый конец цилиндра |
Линия
Используйте метод DrawLine(), чтобы нарисовать линию.
DebugDraw.DrawLine(vector3{Z:=100.0}, vector3{Z:=200.0}, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)| Уникальный параметр | Что делает |
|---|---|
Start:vector3 | Задает местоположение одного конца линии |
End:vector3 | Задаёт местоположение другого конца линии |
Стрелка
Используйте метод DrawArrow(), чтобы нарисовать стрелку.
DebugDraw.DrawArrow(vector3{Z:=100.0}, vector3{Z:=200.0}, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)| Уникальный параметр | Что делает |
|---|---|
Start:vector3 | Задаёт местоположение начала стрелки |
End:vector3 | Задаёт местоположение острия стрелки |
?ArrowSize:float | Задаёт длину двух линий, образующих острие стрелки |
Точка
Используйте метод DrawPoint(), чтобы нарисовать точку.
DebugDraw.DrawPoint(vector3{Z:=200.0}, ?Thickness:= 10.0, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)| Уникальный параметр | Что делает |
|---|---|
Position:vector3 | Задаёт местоположение точки |
Значение по умолчанию параметра Thickness в методе DrawPoint слишком мало, чтобы точка была видна. Задайте для параметра Thickness большее значение, как в примере выше, чтобы точка стала видимой.
Общие параметры
Эти параметры совпадают для всех методов отрисовки форм. Это дополнительные параметры, и их необязательно указывать в качестве аргументов при вызове метода. Если вы решите их указать, не забудьте включить название параметра, перед которым ставится знак ?. Для получения подробной информации об именованных аргументах и аргументах option см. раздел Вызов функций в функциях.
Цвет
Цвет форм задаётся с помощью параметра Color. Значения должны иметь тип color. Список допустимых цветов приведён в модуле NamedColors. Не забудьте вставить выражение импорта для модуля Colors в начале файла Verse. Ниже приведён пример задания другого цвета точки.
DebugDraw.DrawPoint(Position := vector3{Z:= 200.0}, ?Thickness := 20.0, ?Color := NamedColors.MediumSeaGreen)DrawDurationPolicy
DrawDurationPolicy определяет, как долго отладочная фигура остается на экране. Ниже описаны три возможных политики.
SingleFrame: форма будет отображаться на экране в течение одного кадра. Эта политика может пригодиться при необходимости частой перерисовки формы.FiniteDuration: эта политика используется с параметромDurationдля отображения фигуры в течение заданного времени в секундах.Persistent: при использовании политики Persistent фигура будет оставаться на экране до тех пор, пока не будет скрыта или удалена другим кодом.
Duration
Параметр Duration используется с политикой FiniteDuration для отображения фигуры в течение заданного времени в секундах. Ниже приведён пример кода, который отрисовывает сферу, отображающуюся в течение 30 секунд.
DebugDraw.DrawSphere(vector3{}, ?DrawDurationPolicy := debug_draw_duration_policy.FiniteDuration, ?Duration := 30.0)Thickness
Параметр Thickness задаёт толщину линий, составляющих каждую отладочную фигуру. В случае с DrawPoint(), этот параметр задаёт толщину отдельной точки.
Channel
Вы можете использовать каналы для группировки связанных форм, чтобы затем скрыть, отобразить или удалить все формы в канале одновременно.
Чтобы создать канал, укажите параметр Channel при объявлении экземпляра debug_draw.
DebugDraw:debug_draw = debug_draw{Channel := debug_draw_defaults}Теперь любая форма, отрисованная с помощью экземпляра DebugDraw, может быть скрыта, отображена или удалена посредством одного метода. К примеру, если вы нарисуете точку, сферу и стрелку с помощью экземпляра DebugDraw, вы сможете скрыть их на какое-то время, а потом снова отобразить или удалить, когда они больше не будут нужны.
# Point
DebugDraw.DrawPoint(vector3{Z := 200.0}, ?Thickness:= 50.0, ?DrawDurationPolicy:= debug_draw_duration_policy.Persistent)
# Sphere
DebugDraw.DrawSphere(vector3{Z := 200.0}, ?DrawDurationPolicy:= debug_draw_duration_policy.Persistent)
# Arrow
DebugDraw.DrawArrow(vector3{Z := 200.0}, vector3{Z := 400.0}, ?DrawDurationPolicy:= debug_draw_duration_policy.Persistent)
Sleep(5.0)
Значения параметров по умолчанию
| Параметр | Значение |
|---|---|
?Color:color |
|
?DrawDurationPolicy:debug_draw_duration_policy |
|
?Duration:float |
|
?Thickness:float |
|
?Radius:float |
|
Примеры
Визуализация зоны действия устройства «Аудиопроигрыватель»
В устройстве «Аудиопроигрыватель» есть параметр для визуализации затухания. Однако эта визуализация отображается только в режиме редактирования. Выполните следующие действия, чтобы узнать, как воссоздать визуальные эффекты затухания во время игрового сеанса.
Перетащите устройство «Аудиопроигрыватель» на уровень. Проверьте, чтобы на панели <strong>Сведения</strong> был установлен флажок Включить визуальные эффекты затухания. Благодаря этой настройке вы точно сможете правильно воссоздать визуальные эффекты с помощью отладочных форм.
Создайте новый экземпляр
debug_draw, назвав егоDebugDrawAudio, в файле Verse. Закрепите за ним каналdebug_draw_audio.VerseDebugDrawAudio:debug_draw = debug_draw{Channel := debug_draw_audio}Добавьте две константы
@editableтипаfloat. Назовите ихDebugAttenuationMinDistanceиDebugAttenuationFalloffDistance. Это будут два радиуса сфер, изображаемых для визуализации затухания звука устройства «Аудиопроигрыватель».Verse@editable DebugAttenuationMinDistance:float = 100.0 @editable DebugAttenuationFalloffDistance:float = 100.0Добавьте ещё одну константу
@editable, которая будет представлять устройство «Аудиопроигрыватель». Назовите еёAudioPlayerDevice.Verse@editable AudioPlayerDevice:audio_player_device = audio_player_device{}Объявите функцию
DrawAudioDeviceRange()и задайте для неё два параметра типаfloat:AttenuationMinDistanceиAttenuationFalloffDistance.VerseDrawAudioDeviceRange(AttenuationMinDistance:float, AttenuationFalloffDistance:float):void =В новой функции получите объект Transform (преобразование) устройства «Аудиопроигрыватель».
VerseAudioPlayerDeviceTransform:= AudioPlayerDevice.GetTransform()С помощью функции
DrawSphereиз API отладочного рисования изобразите две сферы для представления минимального расстояния затухания и расстояния постепенного затухания. При втором вызовеDrawSphereнужно задать в качестве значения переменнойRadiusсуммуAttenuationMinDistanceиAttenuationFalloffDistance, поскольку затухание звука начинается только за пределами радиуса, равного минимальному расстоянию затухания звука.VerseDebugDrawAudio.DrawSphere( AudioPlayerDeviceTransform.Translation, ?Radius:= AttenuationMinDistance, ?DrawDurationPolicy:= debug_draw_duration_policy.Persistent) DebugDrawAudio.DrawSphere( AudioPlayerDeviceTransform.Translation, ?Radius:= AttenuationMinDistance + AttenuationFalloffDistance, ?DrawDurationPolicy:= debug_draw_duration_policy.Persistent)В функции
OnBegin()файла Verse вызовите функциюDrawAudioDeviceRange().VerseOnBegin<override>()<suspends>:void= DrawAudioDeviceRange(DebugAttenuationMinDistance, DebugAttenuationFalloffDistance)Соберите код Verse. Убедитесь, что для DebugAttenuationMinDistance и DebugAttenuationFalloffDistance на панели «Сведения» Verse-устройства заданы правильные значения. Эти значения должны быть равны значениям параметров Минимальное расстояние затухания и Расстояние постепенного затухания устройства «Аудиопроигрыватель», умноженным на 100.
В устройстве «Аудиопроигрыватель» минимальное расстояние затухания и расстояние постепенного затухания задаются в метрах. Поскольку в API отладочного рисования используются сантиметры, значения необходимо конвертировать.
Полный сценарий
Verseusing { /Fortnite.com/Devices } using { /Fortnite.com/Characters } using { /Fortnite.com/Playspaces } using { /UnrealEngine.com/Temporary/Diagnostics } using { /UnrealEngine.com/Temporary/SpatialMath } debug_audio_device := class(creative_device): @editable AudioPlayerDevice:audio_player_device = audio_player_device{}