162

Как Construction Script помогает мне в дизайне уровней [UE4]

Всем привет! В этом посте покажу вам как сделать то, что на гифке выше с помощью Blueprints.


В Unreal Engine 4 есть очень классная вещь - Construction Script. Его фишка в том, что он выполняется прямо в редакторе, когда вы размещаете или редактируете ваш объект. Попасть в него можно на том же уровне вкладок, где находится Event Graph, либо в разделе функций вашего блупринта.

Далее рассмотрим Construction Script на примере моей палатки. Он включает две моих функции: Place All Sticks размещает все колышки, а TurnAllRopes поворачивает и скейлит все веревочки.

Чтобы это хорошо работало, я имею (StaticMesh) веревочку длинною 100 юнитов (1 метр) с правильным пивотом. В данном случае, он находится на краю, а сама веревка направлена по локальной оси Х этого меша. Это нужно для того, чтобы дальше было легко поворачивать и скейлить этот объект.

Веревку я привязываю к колышку. Ну, то есть, размещаю "внутри". Таким образом, её координаты будут локальными относительно колышка. А вот вращение для веревки выставляю абсолютным.

У самой палатки я подготовил 8 сокетов, к которым буду "привязывать" веревку.

Теперь вернемся к нашим функциям PlaceAllSticks и TurnAllRopes. На самом деле, в каждой из этих функций просто вызывается 8 раз своя дополнительная функция для единичного случая. То есть, вот на примере с веревками. С колышками то же самое.

Как это работает для единичного случая?


Сначала нам надо воткнуть колышек по уровню лэндскейпа. Тут в дело вступает функция PlaceStick. Она берет на вход колышек, пускает луч по каналу Landscape (это мой собственный канал для ландшафта, но вы можете использовать дефолтный Visibility, если хотите) из точки [локация колышка + 500 по Z] в точку [локация колышка - 500 по Z]. Далее, если произошло столкновение, мы меняем координату Z колышка на точку столкновения.


Я еще добавляю небольшой рандом (поэтому на гифке выше колышки немного трясутся). Понятное дело, вы тут должны учесть пивот вашего колышка. В моём случае он по центру и я могу размещать колышек прямо в точке столкновения луча с ландшафтом.  Если бы пивот был на кончике, я бы просто добавил вектор смещения в эту функцию.

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


Напомню, у нас есть веревка, которая расположена в самом колышке. Теперь нам надо её повернуть и изменить длину.


Для поворота есть отличная стандартная функция в Unreal Engine 4 - FindLookAtRotation. Она принимает точку старта (локация нашего объекта) и точку, на которую он должен повернуться (Target). Соответственно, выдает нам Rotation, который мы просто назначаем нашему объекту. Не забываем про то, что в Unreal Engine 4 Forward Vector любого объекта направлен по его локальной оси Х.


(Учтите, в моём примере я всё вычисляю в мировых координатах, потому что мне так удобней!)


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


(На 100 мы делим потому, что наша веревка изначально длиной в 100 юнитов)

Теперь я могу двигать палатку по ландшафту, а её колышки всегда будут подгоняться под окружающий рельеф. Это намного проще, чем выставлять такие вещи вручную для каждой палатки :)


Буду рад, если мой опус кому-нибудь поможет. Спасибо за внимание!

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции

- Выдавать чужой труд за свой

Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"

2
Автор поста оценил этот комментарий

когда-то давно пытался че-то делать в ue4, но забросил, хотя тема всё-же интересная, но я не об этом, у меня к тебе вопрос:

Ща немного сумбурно выражусь, но то, что происходит в констракшн скриптс обрабатывается в готовой игре, или оно уже будет там в готовом виде?

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

раскрыть ветку (1)
4
Автор поста оценил этот комментарий
В вашем примере свет станет по дефолту включённым ещё на этапе компиляции.
показать ответы
2
Автор поста оценил этот комментарий

Я бы сказал, что было бы проще/более правильно, запихать колы/веревки и места для них в массивы. И дальше вызывать по номеру массива, а не вручную прописывать каждый колышек с каждой точкой

раскрыть ветку (1)
3
Автор поста оценил этот комментарий
У меня функция универсальная для любого колышка.

Я мог запросто пустить цикл, а не вызывать вручную 8 раз. Было бы колышков больше, так бы и поступил. А при таком количестве это не столь важно.
показать ответы
4
Автор поста оценил этот комментарий
А разве угол верёвки не должен быть таким же как и у крыши платки?
раскрыть ветку (1)
5
Автор поста оценил этот комментарий
Нет) У любой палатки есть каркас, он и создаёт угол крыши, а веревки всё это дело натягивают в разные стороны.

Но пост не об этом :)
показать ответы
0
Автор поста оценил этот комментарий

Ещё вопросик - а может есть какой-то способ получить всё что крепится к сокетам у какого-то объекта? чтобы не писать роп1...ропN или типа селект по ClassName и среди них, те что относятся к перетягиваемой палатке? /* не бейте сильно, я только начал учиться*/

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Можно взять компоненты нашей палатки одной из нод с картинки и пускать тогда цикл ForEachLoop для массива. Но тут важно учесть, что в моём примере и веревки, и колышки сделаны статик мешами, их следует различать. Если искать компоненты по тегу, то можно заранее забить разные теги. А можно тупо брать имя меша и смотреть, есть ли в нем вхождение "rope", например (для этого есть стандартная функция для строки "Contains")


В общем, можно по всякому :)

Иллюстрация к комментарию
показать ответы
0
Автор поста оценил этот комментарий

Извините, а почему нельзя пробежаться по всем ропам в TurnAllRopes через какой-нибудь foreach или как он тут называется ?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Почему нельзя? Можно.

Например, можно сделать цикл "For". В блупринтах он будет выглядеть как на скриншоте ниже. Работать будет также, как если просто вызвать функцию 8 раз. Тут уж решайте сами, что вам больше нравится :)

Иллюстрация к комментарию
показать ответы
0
Автор поста оценил этот комментарий
То есть, если ландшафт выше точки крепления верёвки на палатке, то палатка растягивается вверх?
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Палатка не растягивается

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества