36

Как я сделал в своей игре систему привязок для строительства

Честно говоря, когда я впервые задумался о добавлении системы строительства, я и представить не мог, насколько это окажется сложным. Я использую Unreal Engine 5 и первая мысль, которая пришла мне в голову: "Ну, это же не должно быть так уж трудно, верно? Может, кто-то уже снял об этом видео!"

Я начал искать на YouTube, просматривать курсы на Udemy и так далее. Udemy оказался практически мёртв в этом вопросе — или мне просто не повезло. YouTube был полон базовых туториалов, которые показывали, как настроить простейшую систему строительства, и на этом всё. Никакой глубины, ничего действительно полезного — только примитивные системы, которые либо едва работали, либо вообще не подходили под мои нужды. Я искал именно систему привязки строительства, похожую на Satisfactory.

Ладно, следующая мысль: "Ну, наверняка должен быть хороший плагин или ассет для этого!" Я обыскал Marketplace Unreal Engine (тогда ещё не было FAB), и ситуация повторилась. Либо ассеты были слишком примитивными, либо просто не подходили под мои цели.

И вот тогда я понял, что придётся разрабатывать свою систему. И вот тут косяк — практически не было информации — не только о том, как создать такую систему, но даже о том, как её описать или определить принципы её работы. Чем больше я размышлял, тем сильнее ощущал, что изобретаю велосипед (классика программирования, да?).

Вот к чему я пришёл

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

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

  • Зона 1 → Привязка к верхней стороне

  • Зона 2 → Привязка к нижней стороне

  • Зона 3 → Привязка к левой стороне

  • Зона 4 → Привязка к передней стороне

  • Зона 5 → Привязка к правой стороне

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

Затем я начал реализовывать всё на чистой математике. Определение зон оказалось не таким сложным — хаотичным, но возможным. Я даже создал рабочий прототип! Но тут возникли две большие проблемы:

  1. Система была слишком... общей. У меня было мало контроля над ней, и расширять её было болью, потому что, ну... я не так уж силён в математике.

  2. Всё работало нормально, пока куб не поворачивался. Как только он поворачивался... всё шло к чертям. Система просто рушилась.

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

И вот тут началась моя безумная идея...

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

Я создал простую модель куба в движке, затем вручную добавил 30 сокетов — по пять на каждую сторону куба — и использовал систему ID для отслеживания, где какой сокет.

Основная идея:

  1. Камера игрока смотрит на куб

  2. Из камеры идет трейс луч на куб, который обрамляет любую модель в игре (на которой можно строить).

  3. Я проверяю, какой сокет ближе всего к точке попадания трейса.

  4. Бум! Теперь я точно знаю, куда привязывать новый объект.

Слева - как здание выглядит в игре, справа как оно выглядит если отобразить куб для привязки

Слева - как здание выглядит в игре, справа как оно выглядит если отобразить куб для привязки

Но потом возникла ещё одна проблема, из-за которой система стала ещё сложнее.

Теперь я знал, куда именно смотрит игрок и где должна появиться новая сущность. Но как именно её выровнять относительно существующей структуры? Нужны были правила. Много правил. Так что я их создал. 13 различных наборов правил, если быть точным.

Вот такая вот дичь, да

Вот такая вот дичь, да

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

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

Её не настолько просто менять, как мне бы хотелось, но по крайней мере, я знал, как она работает.

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

Но эй, оно работает! И теперь у меня есть:

✅ Наклонные фундаменты

✅ Стены, потолки

✅ Привязка к сетке на любых поверхностях и многое другое

Вот как это выглядит в игре:

Я и сейчас продолжаю задаваться вопросом: А не изобрёл ли я велосипед? Не усложнил ли я себе жизнь?

В любом случае, надеюсь, вам понравился этот разбор моей системы! Дайте знать, если есть вопросы или если хочется чтобы я объяснил что-то подробнее.

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

ЗАПРЕЩЕНО:

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

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

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


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

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

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

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

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

Темы

Политика

Теги

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

Сообщества

18+

Теги

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

Сообщества

Игры

Теги

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

Сообщества

Юмор

Теги

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

Сообщества

Отношения

Теги

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

Сообщества

Здоровье

Теги

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

Сообщества

Путешествия

Теги

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

Сообщества

Спорт

Теги

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

Сообщества

Хобби

Теги

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

Сообщества

Сервис

Теги

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

Сообщества

Природа

Теги

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

Сообщества

Бизнес

Теги

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

Сообщества

Транспорт

Теги

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

Сообщества

Общение

Теги

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

Сообщества

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

Теги

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

Сообщества

Наука

Теги

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

Сообщества

IT

Теги

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

Сообщества

Животные

Теги

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

Сообщества

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

Теги

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

Сообщества

Экономика

Теги

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

Сообщества

Кулинария

Теги

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

Сообщества

История

Теги

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

Сообщества

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

Теги

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

Сообщества