Как сделать мини-карту в Unity и не запутаться в 3 соснах
66

Этот метод слишком не оптимизирован. Вы понимаете, что попусту отрисовываете сцену второй камерой? К тому же, может возникнуть проблема с тем, что на карте будут отображаться лишние объекты. Причем в реалтайме. Контролировать слои - это будет тот еще геморрой.

Карта в любом случае должна быть совершенно отдельным объектом - это может быть как “запеченная” картинка уровня, так и 3д геометрия. Главный смысл тут в том, что ты рендеришь малозатратный по ресурсам объект, а не уровень целиком.

Алгоритм работы с такой картой не столь интуитивный, как прямая привязка спрайтов к объектам, но в разы более оптимизированный. Сперва-наперво убираем все эти костыли с рендером второй камеры в Raw Image. Далее запекаем/скриним/рисуем карту уровня в большую картинку. Делаем отдельный Canvas под это дело.

Естественно выйдет так, что координаты уровня и канваса у нас не совпадают. Чтобы решить эту проблему, нам нужен простой алгоритм для калибровки карты. Интуитивнее всего его реализовать так - создаем два объекта пустышки внутри координат канваса карты. Назовем их X и Y. Точно такие две пустышки делаем внутри координат игрового мира.

Далее расставляем координаты относительно неких ориентиров, например домов или деревьев. То есть находим дерево на уровне, двигаем к нему пустышку Х, а дальше ищем тоже самое дерево на карте и двигаем к нему уже пустышку Х, которую создавали внутри канваса. Для пустышек Y делаем всё тоже самое, но по другой оси. Чем дальше будут X и Y друг от друга, тем точнее будет калибровка.

Теперь берем позиции пустышек из сцены и сравниваем их с пустышками в канвасе. И из всего этого вычисляем точные коэффициенты в процентном соотношении по двум осям. Умножая на эти коэффициенты, мы сможем перевести координаты объекта из сцены, в соответствующие координаты на карте. На этом самое сложное закончилось.

Добавлять иконки на карту лучше так же через скрипт. Коэффициенты у нас есть. Если объект статичный, то шлем его позицию из сцены в карту, создаем UI объект из префаба и назначаем координаты по коэффициенту. Делать это нужно всего один раз, при старте. Никаких апдейтов. Если маркер нужно удалить, опять же шлем по триггеру инфу в карту и удаляем.


С миникартой дело обстоит ровно также. Но теперь нам нужно отделить и зафиксировать иконку игрока в центре карты, а двигать мы будем сам канвас миникарты, внутри которого будут все иконки со статичными объектами. Опять всё с коэффициентами и бла-бла-бла. Причем не обязательно использовать метод Update(). Лучше всего вообще сделать лок на обновление миникарты в 25-30 кадров - разницы никто не заметит, а нагрузка на железо будет меньше.

4
Ответить

Ваш комментарий прекрасен (без шуток). Все очень доходчиво и по делу.
Знаете, было бы вообще классно, если бы вы на основе этого коментария написали статью с примером, ну или видео. Уверен, это было бы очень круто.
Или возможно на другую тему.
Я серьёзно, без шуток, и прочего.
Действительно очень годный комментарий и я подчеркнул много нового для себя, спасибо.

Ответить