Создаю лутер шутер в изометрии - Генерация и миникарта

Идёт вторая неделя разработки и она оказалась весьма продуктивной, с идеей написать небольшую статью.

Генерация

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

Пример

Всё работает так:

  • Создаём префабы комнат.
  • Каждому префабу назначаем свои параметры поворота
  • Делаем Dictionary<vector2, Room>.
  • Назначаем стартовую комнату и получаем её случайные двери.
  • От каждой двери проверяем заполненность точек в Dictionary.
  • Если точки свободны добавляем комнату в Dictionary и спавним в мир.
  • Ставим нужный поворот комнаты
  • Повторяем процесс нужное кол-во раз.

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

Префаб

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

Blender
Blender

Далее уже в движке, наложил на них полностью тёмный материал. Темнота вне участков стен идёт уже от самой камеры и тем самым создаёт эффект тёмной плоскости.

В игре
В игре

Работает на моё удивление весьма стабильно и нужный эффект поддерживается весьма без нареканий.

Двери

Выведу этот момент в отдельную категорию, т.к столкнулся с интересной проблемой во время реализации. Когда ты открываешь дверь, то она должна уйти наверх, но вот незадача, мы видим внутренность стенки, а значит сделать тупое поднятие верх нам нельзя, НО! Через пару минут обдумывания проблемы мой весьма тупой мозг выдал следующее - "ШЕЙДЕРЫ УФ БЛЯЯ" и я решил сделать такой шейдер:

  • Получаем позицию пикселя.
  • Если высота выше потолка, то ставим альфа канал в этой точке на 0.
ПРОФИТ
ПРОФИТ

Миникарта

Тут дело вообще простое. Создаём в фигме или фотошопе (хоть в paint) иконку комнаты (главное соблюсти зеркальность).

Создаю лутер шутер в изометрии - Генерация и миникарта

Далее импортируем в движок и в настройках спрайта ставим border на границы с растягивающееся частью.

Создаю лутер шутер в изометрии - Генерация и миникарта

Далее уже в настройках компонента Image, ставим Image type на Sliced, а это в свою очередь позволит нам бесконечно растягивать эту иконку без искажений изображения.

Создаём префабы иконок под все типы комнат, в моём случае 5 штук. И сохраняем их до момента генерации.

Создаю лутер шутер в изометрии - Генерация и миникарта

Во время генерации, зная позиции комнат и игрока мы можем ставить эти префабы иконок на позиции - (позиция комнаты * размер миникарты), а далее поворачивая эти иконки на значение - (180 градусов - поворот комнаты), т.к UI развёрнут по вертикали по отношению к мировым координатам. В итоге получаем весьма не плохие результаты.

Создаю лутер шутер в изометрии - Генерация и миникарта

Итог

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

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

Весь прогресс опубликовываю на Discord сервере по Unity, если хотите то можете присоединиться к обсуждению или показать что то своё, сегодня как раз скриншотный субботник.

Спасибо за прочтение.

286286
82 комментария

Мерцание лампы надо сделать случайным

8
Автор

Есть идея взять код мерцания из игр Valve

38

Открывать миллион просто закрытых дверей. Что может быть увлекательней. Сделай автооткрываение при приближении - не душни. Ну или добавь ключи или отмычки.

12
Автор
7

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

3

Если за дверью стреляющие враги, можно выхватить на пустом месте. Чтобы не парило, некоторые двери можно просто не закрывать.

Да идей то много можно сделать.

Если комнатки будут строиться по типу арен - то можно сделать из последнего моба будет падать ключ на открытие двери (а работать будет при приближении).
Так случайно не откроешь и не как в Дед под Спайсом, где каждую дверь затыкивать надо.