Как сделать телепорт в unreal engine 4

Добавил пользователь Дмитрий К.
Обновлено: 05.10.2024

Создание ландшафта в World Creator 2, экспорт в Unreal Engine 4 и работа с материалами из Quixel Bridge - Megascans.

Первая часть -

В этой части мы поговорим о том как:

- cоздать ландшафт в World Creator 2 в 4К.

- поэксперементировать с фильтрами и получить нужную форму

- оптимизировать Viewport в World Creator для комфортной работы на слабых видео-картах

- создать несколько слоев текстур

- добавить текстуру песка ориентируясь на уровень океана

- импортировать созданный ландшафт в Unreal Engine 4 используя два способа

- импортировать Megascans материалы с помощью Quixel Bridge

- создать специальную функцию, которая позволить рисовать этими материалами по ландшафту

- бороться с тайлингом и создать специальные параметры для этого

- экспортировать Split ландшафт из World Creator 2

- использовать World Compositor и Levels Tool в Unreal Engine 4

- импортировать ландшафт по слоям

- работать с большими ландшафтами

- какое должно быть разрешение Displacement карты из World Creator

- текстурировать, чтобы на closeup все было хорошо.

- cоздать группу параметров в Unreal Engine 4

- оптимизировать рабочий процесс и ускорить компиляцию шейдеров

- избежать проблем с рисованием текстур с разными слоями.

Больше уроков:

Содержание видео:

0:00 - Тема урока.

→ Создание ландшафта в Wolrd Creator 2.

1:35 - Генерация базовой формы.

2:54 - Эксперименты с фильтрами

7:45 - Настройка фильтров и оптимизация viewport c помощью multi-frame генератор.

13:54 - Использование Height Select для настройки влияния фильтров по высоте.

16:13 - Добавление текстур

20:16 - Создание песка ориентируясь на уровень моря

24:57 - Настройка экспорта в Unreal Engine 4.

→ Импорт в Unreal Engine 4 (первый способ)

25:46 - Создание проекта.

26:40 - Импорт ландшафта.

27:41 - Говорим о принципе работы с ландшафтами из World Creator 2

28:43 - Cоздание папки материалов и функций.

29:23 - Работа с Quixel Bridge и импорт материалов для всех слоев ландшафта

33:55 - Создание Master Material, Material Instance и Material Function для рисование по ландшафту

35:12 - Настройка функции для работы с Megascans

37:41 - Добавление ее в Master Material

38:15 - Создание Layer Blend.

39:38 - Добавление параметра для импорта разных текстур в Materail Function

52:34 - Cоздание группы для параметров

54:30 - Назначение Landscape Instance на геометрию ландшафта.

55:39 - Загрузка Weight-Blended Layer(normal) для каждого слоя

→ Оптимизация рабочего процесса. Ускорение компиляции шейдеров.

56:49 - Временное упрощение функции

58:54 - Создание временного ландшафта для ускорения работы

→ Настройка материалов

1:03:23 - Загрузка Megascans текстур в Material Instance

1:06:12 - Исправление ошибок с текстурами в функции

1:07:56 - Layer Info и рисование материалами.

1:08:31 - Решение проблем с рисованием. Метод с Sample Source - Shared Wrap.

1:10:08 - Добавление параметров для борьбы с тайлингом

1:35:19 - Исправление ошибки Texture Streaming Pool Over *** Budget.

1:36:31 - Настройки Displacement

→ Импорт в Unreal Engine 4 (второй способ)

1:42:04 - Настройка экспорта в World Creator 2 для разделения ландшафта на несколько тайлов.

1:43:15 - Работа с World Composition

1:43:38 - Import Tiled Landscape

1:45:01 - Загрузка уровня с помощью слоев в Persistent Level

1:45:27 - Проверка тайлов ландшафта в World Compositor

1:45:54 - Рисование разными материалами Megascans по импортированному ландшафту

1:48:48 - Организация нод, создание комментариев и отдельных параметров тайлинга для каждого слоя.

2:07:37 - Демонстрация материалов и нод, которые получились в итоге.

2:13:07 - Forrender Renderfarm

2:13:14 - Промокод для использования пожизненной скидки в 15% на нашей рендерферме.

2:13:20 -Концовка и превью других уроков.

С Уважением, Андрей Кривуля Charly.

Добрый день, отличная программа, для горной местности, как она себя ведет на примере нашей восточно европейской равнине и стоит ли для нашей местности использовать ее? (Построение реальных карта не рамдомных)

Это понятно, в этой программе крутые инструменты для создания разнообразных эрозий. но рак они применимы в нашей местности, чем более горный рельеф тем сильнее они проявлены

Александр, если вы занимаетесь созданием исключительно реально существующих ландшафтов, то я не вижу особого смысла в данной программе, лучше использовать карты высот, world creator же скорее инструмент дизайнера для реализации какой-либо несуществующей местности.

В этой статье расскажу про опыт переноса игры, созданной с использованием Marmalade SDK, на Unreal Engine 4.

Меня зовут Андрей. Я — независимый разработчик.

Сейчас занимаюсь созданием ассетов для Unreal Engine 4 и разработкой собственных игровых проектов на UE4.

В геймдев пришел в 2005 году, начав в компании Haggard games. Там проработал около 8 лет над серией игр Смерть Шпионам (Death to Spies) и Alekhine’s Gun. В круг моих задач входил менеджмент арт команды и левел-дизайн. Почти все уровни, с точки зрения арта, наполнения и сеттинга в этих играх были созданы мной вместе с командой замечательных 3d художников.

Потом успел поработать PMом в одной из местных компании и поучаствовать в некоторых сторонних проектах в качестве разработчика.

После, полностью ушёл в независимую разработку, выпустил два проекта для iOS/Android и один из них — на PlayStation 4.

На данный момент новый проект находится на early pre-production стадии и о нём пока рано что-либо рассказывать.

Это стилизованная лоупольная головоломка в Sci-fi сеттинге.

В игре 50 уровней. В основном — комбинаторные головоломки.

Игрок управляет космическим дроном, которым взаимодействует с космонавтами. Цель каждого уровня — эвакуировать всех с космической платформы.

Космонавты обладают различными свойствами: некоторых можно цеплять и перетаскивать, другие могут толкать соседнего космонавта. Есть хрупкий космонавт, которого нельзя сбрасывать с высоты больше своего роста и т.д.

Отдельно хотелось бы отметить: в игре содержится почти час специально написанной композитором Helge Borgarts музыки в стиле space ambient. Если вам нравится музыка в таком стиле, уверен — треки из игры вам зайдут.

Изначально игра была написана с использованием Marmalade SDK под платформы iOS и Android. Это не игровой движок, а скорее кросс-платформенное API. Т.е. В нём нет специфических сущностей вроде Actor, Camera, уровень и т.д. Из языков в нём были C++ и Lua, из платформ — iOS, Android, PC и Tizen.

Было три фактора, которые спровоцировали наш отказ от мобильных версий.

  • Вскоре после релиза игры компания Marmalade закрылась, а моя лицензия — истекла.
  • Слабая монетизация проекта. Хотя отзывы у проекта были положительные и оценка выше 4.5 баллов, отдача совсем не вселяла оптимизм, а чемоданов денег на трафик у нас не было.
  • Мы испробовали разные способы управления, копались в настройках - но достичь нужной отзывчивости управления на тачпаде не удалось.

По итогу убрал все мобильные версии и прекратил их поддержку. Но бросать проект не хотелось: всё же большинство отзывов были положительными. Поэтому решил перенести игру с канувшего в лету Marmalade SDK на Unreal Engine 4.

Что у меня было:

  • Самописный редактор уровней, который на выходе выдавал XML файл, описывающий структуру уровня со всеми необходимыми данными.
  • Отсутствие возможности скомпилировать рабочий билд

Формально работы по переносу игры можно разбить на три этапа:

Save\Load система, управление, Pawns, Камера, Система частиц, загрузка ассетов, материалы, конвертор уровней из XML в UE4, реимпорт всех 3д моделей и ассетов в UE4 и т.д.

Пришлось приводить исходный С++ код к типам UE4 (FVector, FTransfrom, UOBJECT и т.д.) и и убирать все хвосты, оставшиеся от Marmalade SDK.

Добавление BlueprintCallable для того, чтобы Blueprint мог вызывать и использовать С++ код. Например, для расчёта рейтинга игрока. Сам метод расчёта написан на С++, к нему обращается Blueprint и получает результат расчёта.

Создание структуры уровней в виде sublevels и полностью новой логики камеры.

Меньше всего изменений было у 3д моделей. В основном — фиксы по мелочи.

После выполнения предварительных работы с кодом и ассетами приступил к переносу уровней.

В версии на Marmalade SDK уровень представлял собой два XML файла. Первый описывал игровую структуру уровня и объекты - трансформ, свойства, тип и т.д.

Второй XML файл описывал декоративные элементы - расположение мигающих ламп, вентиляторов, антенн. Декоративные элементы не оказывают влияние на геймплей, но придают визуальной живости уровням.

Был создан базовый актёр - BP_AstroBase, содержащий необходимую структуру данных из версии на Marmalade и от него унаследованы все 4 класса космонавтов и другие динамические объекты - кнопки, конвееры, телепортаторы, лифты.

Мне не потребовалось придумывать структуру заново и переделывать всю игровую логику. Разве что убрал все несущественные, в основном косметические, переменные и данные, которые были необходимы для работы Marmalade версии.

Потом создал актёра для декора. Он содержит все типы декора на уровнях, отрисовывает необходимую в данный момент модель и осуществляет с ней действия.

Конвертер читал два XML файла, парсил их и спавнил актёров в Unreal Engine 4. Всё что мне оставалось - это добавить StaticMesh c геометрией уровня.

После финализации конвертера перенос всех 50 уровней занял 1.5-2 часа.

В игре есть 3 вида Pawns:

  • MainMenu Pawn. Используется в главном меню и обрабатывает нажатия на кнопки Start Game, Options, Help и т.д. Полностью на Blueprint.
  • Levels Pawn. Обрабатывает скорллинг между планетами и выбор уровней. Полностью на Blueprint.
  • PlayerPawn. Базовый класс написан на С++ и в нём содержится вся геймплейная логика игры, перенесённая из версии на Marmalade SDK. От базового класса унаследован Blueprint, который обрабатывает все input event, restart и подобное.

GameInstance - содержит весь системный функционал игры: загрузку/выгрузку уровней, сохранение и загрузку состояния игры, подсчёт рейтинга, переменные игры, которые необходимо передавать между уровнями, например общий игровой таймер. Написан на С++ и имеет Blueprint наследника.

Уровни сделаны по схеме sub levels, т.е. это level streaming. Такой подход имеет два существенных плюса:

  • Не нужно делать отдельный поток для беспрерывного проигрывания музыки.
  • Экономия размера билда. Все общие элементы, используемые в большинстве уровней, находятся в persistent (постоянном уровне) и не требуют их дупликацию в каждый уровень. К таким элементам относится: MusicPlayer, задник с текстурой, космические корабли, которые летают на заднем фоне, PostProcess Volume, эффект звёзд.

Цикл работы логики игры на UE4 можно описать так:

  • Ожидание события от игрока в Pawn (выбор уровня, нажатие опции и т.д.)
  • Выгрузка текущего уровня (всегда загружен какой-либо уровень)
  • Сохранение текущих данных (номер уровня, таймер и т.д.)
  • Загрузка нового уровня
  • Передача контроля Pawn’у

В версии на Marmalade SDK все расчёты логики, update, render и т.д. выполнялись внутри MainLoop, т.е. с однозначно заданной последовательностью.

В UE4, каждый актёр выполняет Tick() асинхронно. Основная логика находится в PlayerPawn, из-за чего возникала ситуация, когда часть актёров могла выполнить свой Tick до того как он выполнится у PlayerPawn, а другая часть уже после. Чтобы решить эту небольшую задачу удобно использовать метод AddTickPrerequisiteActor(). Так мы напрямую указываем последовательность тиков в разных актёрах.

Задав всем актёрам (кроме PlayerPawn) такое условие, мы помещаем PlayerPawn наверх списка и он всегда будет тикать первым.

Скажу честно — я тестировал с AddTickPrerequisiteActor и без него и существенной разницы не заметил. Поэтому в финальной версии это решение отсутствует.

В игре есть телепорты и созданный специально для них эффект телепортирования. В версии на Marmalade SDK он был реализован с помощью самописной системы частиц и представлял собой пролетающие из start в target по траектории близкой к параболе частицы. Одновременно может выполняться сколько угодно телепортирований.

В UE4 наиболее быстрым решением оказалось использование InstancedStaticMeshComponent. Во-первых, логика расчёта траектории у меня уже была. Во-вторых, ISMC отрисовывается за 2-4 (зависит от материала) draw calls.

Потребовалось лишь адаптировать логику для апдейта трансформов ISMC. В UE4 так же существует HierarchicalInstancedStaticMeshesComponent, который поддерживает LODs, но в моём случае поддержка lods не требовалась.

Для PlayStation 4 мне хотелось выпустить более качественную версию.

К существенным улучшениям можно отнести:

  • Добавление скелетной анимации для космонавтов
  • Два новых саундтрека
  • Динамический Ambient Occlusion
  • Эффект при эвакуации космонавта
  • Дополнительные 8 языков локализации
  • Deferred UE4 renderer

У меня ушло ровно 30 дней по 12-14 часов в сутки от текстовых исходников до полностью рабочей игры на UE4.

Скажу честно, после такого кранча я пару дней просто отсыпался и не реагировал на внешние сигналы.

Каких-либо сложностей и существенных проблем в процессе переноса не возникало, и я не могу что-то выделить особенное. Пожалуй, лишь разнообразие и масса мелких задач, которые необходимо было сделать и не забыть.

Пару слов о создании стори трейлера я решил добавить в эту статью потому, что он создавался под UE4 версию. Версия на Marmalade SDK имела только геймплейный трейлер.

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

Созданием трейлера занимался другой человек, за что ему большая благодарность. Несмотря на то, что он не обладал большим опытом в UE4, ему удалось быстро разобраться во всех необходимых инструментах и собрать трейлер в Unreal Engine 4 с помощью sequencer и других инструментов.

Первоначально был только story board, нарисованный мной от руки - фактически, ключевые кадры трейлера. Далее мы обсудили сценарий, что нужно было получить на выходе и какой продолжительности.

Через пару недель был готов драфтовый синематик без эффектов, текстур, звука, света и прочих красивостей. Он содержал в себе финальные тайминги, ракурсы и анимацию.

После пары мелких правок он отправился к композитору, который под видеоряд написал саундтрек. Одновременно с этим синематик был перенесён в UE4 и стартовала работа по финализации - свет, эффекты, материалы и т.д.

Еще через 12 дней я получил финальный проект в UE4.

Еще через пару дней приехал саундтрек от композитора и я собрал финальную версию трейлера.

На все работы от создания сториборда до финального трейлера ушло 23 дня.

С момента релиза на PlayStation 4 прошло уже более 3 месяцев и я могу взглянуть на игру несколько отвлеченным взглядом и сделать определённые выводы:

Даже путём изменения story board. Примерно на 15-20% он урезается без потери идеи и motion design.

Обучающие уровни это первые 10 уровней. Они не содержат головоломок, лишь демонстрируют игровые возможности. Это очень очень устаревший подход. В идеале, надо было переделать на подсказки для уровней, где появляется какая-либо новая механика.

Несмотря на то, что космонавты анимированные и уже не воспринимаются мумиями в космосе, нужно было добавить глаза для передачи эмоций — для большей асоциации с живыми героями.

После прохождения уровня появляется надпись Level Complete. К сожалению, это происходит тривиальным образом - просто появляется надпись и всё. Ощущение достижения у играющего не возникает. Нужно было добавить анимацию и major звуковой эффект, чтобы подчеркнуть важность достижения.

Первые уровни крайне простые и плейтестеры говорили, что играть скучно. Интересно играть становится только примерно после 22-23 уровня. Можно было переставить уровни местами, дав вызов уже на 13 или 14 уровне в виде достаточно сложной головоломки. К сожалению, это потребовало бы много дополнительной работы.

Это был интересный во всех отношениях опыт и мне хотелось бы поблагодарить всех людей, которые так или иначе принимали участие в создании игры!

Отдельная большая благодарность компании Sony Interactive Entertainment за возможность выпустить игру на PlayStation 4, дав возможность любителям головоломок поиграть в неё.

Специальное спасибо Яну Корвину за редактуру текста статьи!

Благодарю за уделённое статье время, всем хороших игр!

Для связи со мной, можете написать мне в Facebook

Спс, интересная статья.

А до переноса этой игры, сколько времени занимались UE4? Какой опыт?

Я если бы в такой кранч впрягся, бОльшая часть времени ушла бы на изучение особенностей движка (у меня лишь полгода опыт работы с UE4, и как-то конца-края не видно освоению хотя бы основ)

UE4 активно занимаюсь более 2х лет. В целом у меня был опыт с разными технологиями - Marmalade, Cry Engine, custom driven решения в виде движка для Смерть Шпионам и т.д., поэтому адаптация к UE достаточно быстро прошла )

В Cry Engine далеко продвинулись? До UE4 как раз его изучал, но считаю, что для инди он не годится.

Не очень далеко, интересовала организация уровней, подход к их созданию и т.д.

Изучаю UE4, насколько я знаю, в движке очень много классов приспособленных под свои задачи, например, для меню UMG, UI классы, для игровой логики GameMode насколько помню и понимаю. У вас везде используется Pawn, класс который в UE4 создан для реализации механики персонажей, NPC на уровне. Это связано с тем, что игра создана не с нуля на UE4, а путем портирования? Или мобильные игры на UE4 так создаются? Просто я заметил изучение UE4 на моем примере, да и в общем чаще всего проходит с уклонам на большие открытые миры, когда в редакторе создаешь landscape, раставляешь StaticMesh и потом начинаешь писать логику, игровые механики и т.д.

GameMode используется в мультиплеерных играх. Т.к. у меня single player мне он не понадобился. Pawn используется для удобства, т.к. имеет всю необходимую коммуникацию, которая мне требовалась для реализации, к тому же это и есть представление игрока на уровне и тут не имеет никакого значения, как он визуально представлен.

Т.к. вся game play логика это достаточно массированный объем кода, не было смысла это разносить по классам, в противном случае это означало по сути создание игры с нуля. Такой задачи я перед собой не ставил.

Спасибо за ответ! Просто я подумал может не правильно изучаю UE4. Что интересно в этом движке можно создать практически идентичную игру разными способами. Поэтому конечно каждый выбирает свой оптимальный путь!

Андрей, а с вами можно пообщаться ВКонтакте? Можете мне там написать (мой ВК в профиле есть в "Информации")?


Рейтинг:

Учебное пособие по рендерингу и телепортации портала (ссылка для скачивания в описании) - Unreal Engine 4

Я сделал простую анимацию удара в Blender и экспортировал ее в Unreal Engine 4. В игре персонаж появлялся от третьего лица, но я сделал его похожим на вид от первого лица, настроив камеру.

Теперь, когда я поворачиваю камеру в игре, я могу смотреть по сторонам на разные части тела персонажа. (Например, если я поверну направо, я вижу плечо моего персонажа, а если я смотрю вперед, я вижу только запястья.) Каждый раз, когда я поворачиваю камеру и запускаю анимацию удара, это выглядит странно, потому что модель персонажа не соответствует не совмещен с камерой.

Как заставить тело вращаться вместе с камерой, чтобы моя анимация выглядела правильно?


авг 25, 2016 | 6 комментариев

Заметки о ньюансах разработки в UnrealEngine4

Эта запись — блокнот для записи небольших заметок о некоторых неочевидных особенностях, всплывающих при разработке игр на Unreal Engine 4.
Все эти особенности приходится гуглить, а потом о них быстро забываешь, поэтому будет полезно хранить для себя и человечества эту информацию.

Как сделать чтобы персонаж (Character) превращался в ragdoll и падал на землю?

1. Для этого нужно, чтобы у Skeletal Mesh’а, используемого в Character’е был привязан Physical Asset. Проверить, привязан ли он, можно открыв Skeletal Mesh в редакторе (дважды кликнув по нему в Content Browser), и посмотрев на параметр Physical Asset.

2.1. Если тело (Physical Asset) у вас сделано неправильно, одним куском (что, например, именно так у входящего в стандартный набор персонажа Mannequin), нужно сгенерировать новое тело на базе скелета. Нажимаем на Skeletal Mesh правой кнопкой (в Content Browser) и выбираем Create -> Physical Asset. После чего нужно открыть Skeletal Mesh и в настройках указать в качестве физического тела свежесозданное тело.

2.2. После создания и привязки физического тела нужно открыть его, и опять, нажав Simulate, убедиться в том, что всё работает как следует.

4. И чтобы заставить тело подчиниться гравитации, нужно включить симуляцию физики: Mesh->setSimulatePhysics(true), после этого тело упадёт и начнёт беспорядочно валяться по полу.

RagDoll

Как сделать чтобы тело повалялось и успокоилось?

Функция FreezeMesh

6. Эту функцию можно будет вызывать когда вам надоело, что тело валяется и дрыгается на земле, скажем через пару секунд. Для этого нужно создать Custom Event в Event Graph’е, и вызывать из него команду Delay(2), то есть, приостановить выполнение на 2 секунды, а из неё уже вызывать FreezeMesh.

DelayAndFreeze

Как сделать, чтобы после смерти персонаж перестал подчиняться Controller’у?

Если при смерти у вашего персонажа просто проигрывается анимация смерти, а не включается ragdoll, то персонаж будет продолжать подчиняться Controller’у, например, враг будет даже мёртвым продолжать ползти за героем. Чтобы этого не случилось, достаточно в момент смерти отключить управление персонажа контроллеров. В функции, которая у вас обрабатывает смерть персонажа, достаточно вызвать getAiController->UnPosess.

Внимание! После вызова UnPosess контроллер отстыкуется от pawn’а, и обратиться к нему через getAiController будет уже невозможно!(чтобы осознать это, потребовалось несколько дней отладки)

UnPosess

Сделать чтобы мяч, пинаемый персонажем не крутился задом наперёд

Чтобы решить эту проблему, нужно:

1) Найти внутри вашего персонажа, в дереве компонентов, компонент CharacterMovement
2) в нём найти параметр Push Factor Point ZOffset и установить его = 0

Как сделать простейший объект-пулю

Время от времени возникает потребность создать объект, движущийся как пуля и умеющий обрабатывать столкновение с препятствиями.
Это может быть обычная пуля, ракета, вращающийся кирпич, горящий череп или птица, не принципиально.

Поворот персонажа, управляемого ИИ в сторону врага

1) Для плавного поворота, особенно, когда есть именно враг, можно использовать Controller->setFocus(targetActor)
2) Для поворота на указанную точку (когда врага нет, а надо просто посмотреть куда-то, можно использовать Controller->setFocalPoint(targetPointVector). Плавность поворота при этом не гарантируется.

6 комментариев

Не получается сделать плавное вращение через setFocus, в чем может быть проблема?

Не получается, все равно рывком поворачивается.
проверяю так: у меня в btree стоит задержка, а потом setFocus на pawn игрока, когда он за спиной ai находится

В идеале я ищу что то типа setControlRotation что бы можно было вручную к нужной точке поворачивать через rinterp, но setControlRotation не работает

Нашел, что надо убрать галку в aicontroller SetControlRotationFromPawnOrientation, тогда setControlRotation работает, но не учитывает pitch? а это проблема. Верх/вниз тоже надо смотреть

В случае когда надо сделать плавный поворот по pitch без изменения скорости (у ракеты тело было настроено всегда поворачивать в направлении скорости), достаточно просто определить угол межу целью и реальным направлением, и добавить к реальному углу небольшой угол равный скорости * dt, где dt — это длина тика (не помню как в UE переменная называется)

Читайте также: