Моя разработка игры Tower Defense. Часть первая
ДЛЯ ЛЛ: Разработка игры от человека далекого от разработки игр. Захотел написать игру в стиле Tower Defense. Написал диздок. Разработал часть механик.
Всем привет!
С самого детства я мечтал разрабатывать игры, но возможность и уверенность появилась только сейчас. Этим постом я хочу открыть серию постов о разработке своей собственной игры (а может и не одной). А также это будет для меня маленьким дневником и порфтолио, с которым в будущем я планирую искать себе работу в игровой индустрии. С чего начинается разработка игры (по моему мнению)? Ну естественно с выбора движка. Мой выбор пал на Unity, потому что я имею какие-то базовые знания C#. В качестве жанра первой игры я выбрал Tower Defense, так как считаю что такой проект будет не сложным для начинающего разработчика. А в качестве платформы выбрал Android.
Примерный план разработки:
Разработать идею и предварительный стиль игры.
Рассмотреть игры конкурентов.
Определиться с графикой.
Определиться с музыкой и звуковыми эффектами.
Разработка дизайн документа с описанием основных механик игры.
Написание кода.
Получение удовлетворения от разработки.Создание рабочего билда и тесты.
Если прочитали до этого момента - пожелайте мне удачи.
Итак... приступаем.
Поиграв в небольшое количество, скачанных с Play Market'а, игр, а также посмотрев обзоры на ютубе я пришел к выводу что правильным вектором в разработке такой игры будет грамотная экономическая система. Графика и саундтрек не так сильно важны, как действительно сложный, но честный геймплей. Карты не должны быть "читерскими" со стороны разработчика, но и не должны проходиться легко. Также должна быть изюминка, которая, выделит твою игру среди остальных.
Ассеты для игры я решил взять с сайта Kenney.nl. Выглядят сносно, эффекты и шейдеры добавим уже в самом Unity (благо его инструментарий позволяет). На данном этапе своих скиллов не вижу смысла покупать или создавать вручную графику, а вот музыку буду писать сам.
Дизайн документ.
Базовый геймплей:
Покупка и продажа башен:
Быстрый выстрел по одной цели.
Медленный выстрел по одной цели с откидыванием.
Выстрел по области.
Выстрел по нескольким противникам одновременно.
Улучшение башен и ловушек:
Ледяная ветка (Уменьшение скорости противника).
Огненная ветка (Периодический урон).
Электрическая ветка (Урон по цепочке).
Постоянное улучшение:
Скорость атаки башни.
Урон башни.
Урон ловушек.
Покупка мин:
Мина.
Мина для отбрасывания (Не улучшается).
Противники:
Маленький противник:
Высокая скорость.
Маленькое количество HP.
Слабый урон.
Средний противник:
Средняя скорость.
Среднее количество HP.
Средний урон.
Большой противник:
Малая скорость.
Большое количество HP.
Большой урон.
Особенности противников:
Огненные противники:
Резист к огненной атаке.
Увеличен получаемый урон от ледяной атаки.
Ледяные противники:
Резист к ледяной атаке.
Увеличен получаемый урон от огненной атаки.
Каменные противники:
Резист ко всем видам атак (в том числе и обычных).
Увеличен получаемый урон от электрической атаки.
Приступаем к разработке.
Проект решил делать в 3D, а в качестве рендера решил использовать URP. Для себя первым шагом я решил сделать ИИ (искусственный интелект) противников. Переместив ассеты в проект я создал примерный макет карты:
Для начала создадим и настроим навигационную сетку для наших противников. При импорте не забудьте моделей включить Read/Write для создания навигации во время игры. Для объектов по которым можно ходить я добавил NavMeshModifier с модификатором Walkable, а также переместил их на слой Ground. Для тех моделей по которым ходить нельзя ставим соответственно Not Walkable. С помощью скрипта будем делать динамическую сетку. Создадим пустой объект, добавим на него NavMeshSurface (Предварительно установив пакет в Window -> Package Manager -> Packages: Unity Registry -> AI Navigation). Создадим скрипт с названием Navigation Baker и добавим на только что созданный объект. Пропишем чтобы сетка строилась когда запускается игра.
Для создания противника в первую очередь нам потребуется класс. Если у вас возникают вопросы по скриптам или просто рекомендации - пишите в комментарии, отвечу по возможности.
Да, возможно сейчас скрипт выглядит нелепо, но в будущем мы будем по кирпичику его достраивать. С задачей передвижения мы справились. Теперь нужно настроить параметры на самом префабе нашего противника. Итог:
Теперь стоит приступить к нашим башням. Для этого соберем из моделек подходящую башню и поставим на свободную клетку. Теперь создадим новый скрипт. Скрипт выглядит вот так:
На данном этапе мы имеем двигающихся противников, стреляющую (пусть и не видно) башню, автоматическую постройку навигационной сетки.
Получилось немного, но это хороший старт. В следующем посте будем разрабатывать механику создания башни, а также полоску жизней противников.