Создаю лутер шутер в изометрии - Генерация и миникарта
Идёт вторая неделя разработки и она оказалась весьма продуктивной, с идеей написать небольшую статью.
Генерация
До этого никогда не делал подобных систем, но тут вдруг столкнулся с необходимостью понять, а как подобное реализовать. Все алгоритмы которые я смотрел были основаны на системы раскидывании комнат на основе триангуляции Делоне, но способ требует догенерации туннелей, а мне это не нужно. В итоге в мою голову пришла весьма простая реализация.
Всё работает так:
- Создаём префабы комнат.
- Каждому префабу назначаем свои параметры поворота
- Делаем Dictionary<vector2, Room>.
- Назначаем стартовую комнату и получаем её случайные двери.
- От каждой двери проверяем заполненность точек в Dictionary.
- Если точки свободны добавляем комнату в Dictionary и спавним в мир.
- Ставим нужный поворот комнаты
- Повторяем процесс нужное кол-во раз.
Во время создания каждой комнаты заполняем комнату из которой она вышла и другие доп. данные, которое можно использовать в будущем.
Префаб
Я захотел сделать эффект "Темноты" за стенами, а для этого нужно было сделать тёмный unlit материал для этого пространства. Я решил опять не придумывать сверх умные системы, а просто создал свои модели стен с нужной геометрией и выделил в них тёмные участки.
Далее уже в движке, наложил на них полностью тёмный материал. Темнота вне участков стен идёт уже от самой камеры и тем самым создаёт эффект тёмной плоскости.
Работает на моё удивление весьма стабильно и нужный эффект поддерживается весьма без нареканий.
Двери
Выведу этот момент в отдельную категорию, т.к столкнулся с интересной проблемой во время реализации. Когда ты открываешь дверь, то она должна уйти наверх, но вот незадача, мы видим внутренность стенки, а значит сделать тупое поднятие верх нам нельзя, НО! Через пару минут обдумывания проблемы мой весьма тупой мозг выдал следующее - "ШЕЙДЕРЫ УФ БЛЯЯ" и я решил сделать такой шейдер:
- Получаем позицию пикселя.
- Если высота выше потолка, то ставим альфа канал в этой точке на 0.
Миникарта
Тут дело вообще простое. Создаём в фигме или фотошопе (хоть в paint) иконку комнаты (главное соблюсти зеркальность).
Далее импортируем в движок и в настройках спрайта ставим border на границы с растягивающееся частью.
Далее уже в настройках компонента Image, ставим Image type на Sliced, а это в свою очередь позволит нам бесконечно растягивать эту иконку без искажений изображения.
Создаём префабы иконок под все типы комнат, в моём случае 5 штук. И сохраняем их до момента генерации.
Во время генерации, зная позиции комнат и игрока мы можем ставить эти префабы иконок на позиции - (позиция комнаты * размер миникарты), а далее поворачивая эти иконки на значение - (180 градусов - поворот комнаты), т.к UI развёрнут по вертикали по отношению к мировым координатам. В итоге получаем весьма не плохие результаты.
Итог
И так, вроде как это всё что было мною сделано, темы партиклов затрагивать не буду, т.к они весьма простые, а всё остальное находится в весьма сломанном состоянии и требует доработок, поэтому задачи ещё есть и чем дальше иду, тем больше их становится.
* Вы должны понимать что делать всё именно так, может быть неправильно, т.к я сам ещё начинающий разработчик и считать это за правильную реализацию не стоит.
Весь прогресс опубликовываю на Discord сервере по Unity, если хотите то можете присоединиться к обсуждению или показать что то своё, сегодня как раз скриншотный субботник.
Спасибо за прочтение.