Создаю лутер шутер в изометрии - Противники, NavMesh и UI

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

NavMesh

На мой взгляд, самый простой этап разработки - встраивание навигационных мешей. Unity предоставляет свою реализацию NavMesh как дополнительного модуля и после тестов могу сказать что их реализация весьма себе не плохая.

Стартовое запекание навмеша происходит во время генерации и занимает ~30мс, что вместе с генерацией уровня забирает лишь 70мс. У меня нет требований к генерации и даже если она начнёт требовать 1000 мс, то вместе с асинхронностью это не будет заметно.

300 противников на динамическом навмеше вызывают проседания на ~20 fps, а вместе со средним fps в районе 300, это капля в море. В будущем у меня есть идея как оптимизировать расчёты и мне кажется можно спокойно выйти к 1000 единиц противников разом (что в условиях игры не возможно, но ради теста можно и попытаться.)

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

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

UI

Теперь же по поводу демонстрации здоровья у противников, изначально была идея поставить каждому противнику по своему Canvas'у (пространству для интерфейса) и просто встроить и обновлять по своему элементу.

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

Таких ~30 штук на старте
Таких ~30 штук на старте

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

Всё находится на 1 канвасе
Всё находится на 1 канвасе

Как только противник погибает, его UI элемент возвращается в пул, и лежит в деактивированном виде до следующего запроса. Такая система позволяет использовать огромное кол-во таких элементов, с потерями fps находящимися в районе погрешности.

Рефакторинг

Было потрачено 3 дня только на переписывание старого кода, но в итоге я получил возможность легко изменять и дополнять всё что связанно с активаторами, оружием и инвентарём.

К примеру был создан интерфейс характеристик оружия, а на его встраивание у меня ушло минут 30, хотя думал что уйдут сутки. Он подстраивается под текст описания кнопки, а сама кнопка подстраивается под свой же текст и может содержать любой текст без видимых артефактов. (пригодится при локализации)

Создаю лутер шутер в изометрии - Противники, NavMesh и UI

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

Создаю лутер шутер в изометрии - Противники, NavMesh и UI

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

Своё дополнение для редактора

В процессе работы я заметил что на сцене ~500000 вершин, хотя в этот момент ещё даже не было генерации.

Не найдя пути по анализу сцены на наличие объектов с большим кол-вом вершин, я решил сделать своё расширение для редактора которое будет в "табличном" виде демонстрировать все объекты в отсортированном виде.

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

Можете использовать, скачайте HierarchyAnalys.cs, закиньте куда вам угодно, а далее включите через Window -> Analysis -> HierarchyAnalysator.

Итог

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

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

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

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

108108
14 комментариев

Атака грангеров на дтфера

9
Ответить

выглядит как то, во что бы я определенно попробовал поиграть) надеюсь, вложишь всю душу в геймплей и стилистику! удачи!

3
Ответить

Чекнул кстати руинер?

1
Ответить
Автор

чеканул, может даже подумаю как встроить холодное оружие в игру

1
Ответить

Выглядит хорошо!
С нуля сам (не считая 3д) делаешь, или какой-то базовый контроллер используешь?

Ответить
Автор

Сам с нуля. Из не своего только модель персонажа, все остальные модели мои.

1
Ответить
Ответить