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

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

Генерация

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

Пример

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

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

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

Префаб

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

Blender
Blender

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

В игре
В игре

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

Двери

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

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

Миникарта

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

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

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

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

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

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

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

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

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

Итог

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

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

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

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

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