Space Turret Runner
2 поста
2 поста
6 постов
Если нажать на слово "Пикабу" в посте или комментарии, вас ждет пасхалка! 😉
Наполнение контента в игре продолжается. Сейчас в игре игроку доступно более 10 видов кораблей. От легких истребителей, до крейсеров и дредноутов. Каждый со своими особенностями и вооружением.
С увеличением размера кораблей мы постарались передать чувство управления чем то тяжелым и неповоротливым. А если оно взрывается, то расталкивает всё вокруг! Мы решили использовать возможностями физического движка и добавили физику взрывов 🙂
Новый контент - это хорошо, но еще надо следить и за производительностью. При тестировании новых кораблей были выявлены просадки FPS. Что весьма логично, ведь общее количество полигонов могло достигать 200 тысяч на экране. И с этим что-то нужно было делать. Мы решили упростить модели кораблей, чтобы более простые использовать в игре, а более детализированные - в предварительном просмотре в магазине. Таким образом, нам удалось уменьшить количество полигонов у каждого корабля с 4-8 тысяч до 1-2 тысячи.



Было - Стало.
Это не реклама, но в упрощении моделей очень помогла программа Polygon Cruncher. Она имеет триал-версию на 7 дней, но если программу не закрывать, то можно продлить этот период 😃
Итого, общее количество полигонов удалось снизить с 200 тысяч до 60 тысяч на экране! Это превосходный результат!
Мы также немного поработали над тем, чтобы уменьшить визуальное подёргание камеры и кораблей игрока:
Код движения камеры перенесли в метод LateUpdate, а у кораблей в компоненте Rigidbody поменяли свойство Interpolate с None на Interpolate.
Сравнить и увидеть разницу можно с предыдущим видео
Мы решили опробовать новую платформу и опубликовали веб-версию игры. Для этого нам пришлось немного переделать интерфейс и добавить поддержку клавиатуры.



Альбомная ориентация экрана
Для всех желающих - вот ссылка на веб версию
Конечно, не обошлось без ошибок. После релиза на itch.io выяснилось, что весь прогресс игрока пропадает после публикации новой версии игры.
Дорогие инди-разработчики! Не используйте PlayerPrefs для WebGL. Под капотом оно сделано так, что Вы имеете доступ к PlayerPrefs, пока у Вас постоянная ссылка на сборку. На Itch.io при добавлении новой версии, сборка размещается в новой подпапке, что создает новую область для PlayerPrefs и считать старые значения будет уже невозможно.
Для исправления бага нам пришлось разработать сохранение данных в файл, причем со своими нюансами. Данные файла и PlayerPrefs хранятся в IndexedDB, после записи файла нужно правильно выполнить сохранение в БД. Вот такие костыли 😔 Надеюсь, это поможет сэкономить кому-то время.
Главное - удалось исправить ошибки, пусть на это и было потрачено несколько дней.
На этом статья заканчивается. Надеюсь, было интересно! Впереди еще больше контента, пишите комментарии, замечания, отзывы - мы рады всем!
А для тех, кто дочитал до конца - #комплиментдня
Разработка игры и подготовка материала занимает много времени. Но всё это сделано не зря, если в игру поиграл ты - мой самый требовательный игрок
Поправили кусок кода сохранения в файл -> pastebin.com
Всем привет!
Наверняка, многие из вас видели рекламу про чувачков, которые бегут по платформе, подбирают x20 и их становится в 20 раз больше?
Вот и нам надоела эта реклама. И решили сделать свою похожую игру! Благо механика и геймплей простые. Моделей платформ, зданий и всего остального у нас было в избытке, нужен был только код!
Выбрали тему - космический шутер и понеслось! Добавили пули и кораблики с алгоритмом поведения Boids.
Самое начало разработки
Написали специальный шейдер для эффекта появления новых платформ
Развили идею с кораблями.
Сделали основной параметр игры - количество экипажа. И максимум 20 кораблей во флоте игрока. Причем игроку доступны разные типы кораблей. Каждый корабль на своем борту содержит определенное количество экипажа. Есть корабли с 1 пилотом, есть корабли с 2 пилотами и т.д. Планируем добавить разные классы кораблей, от истребителей до крейсеров!
Если игрок, например, набирает 40 человек экипажа, то в его флоте будет 10 кораблей с 1 пилотом, 5 кораблей с 2 пилотами и 5 кораблей с 4 пилотами (т.к. ограничение на 20 кораблей во флоте). Ограничение на корабли сделано специально, т.к. у нас мобильная игра.
Примеры кораблей в игре
Пришлось заморочиться, чтобы написать алгоритм подборки кораблей во флот таким образом, чтобы общий экипаж соответствовал требуемому количеству без превышения лимита кораблей.
Выше пример работы алгоритма. x1, x2, x4 - это кол-во кораблей с 1, 2, 4 пилотами соответственно.
В игру также добавили таблицу рекордов, сделана на основе Unity Leaderboards. Очень легко интегрировать и настраивать, рекомендую 👍
Чтобы было интереснее, в игру добавили магазин, где игрок будет открывать новые типы кораблей, зданий, врагов и турелей. Валюта магазина - это очки, которые игрок получает в игре за уничтожение врагов. Новые корабли помогут увеличить общий лимит экипажа, усилить свой флот и пройти еще дальше.
Для любителей читов и нечестных игр, мы специально закодировали значения очков, чтобы их нельзя было легко накрутить через редактор памяти 😉
В этом очень помогли ролики от Emerald Powder, спасибо ему от души, дай бог здоровья 🍺 Ссылка на ролик:
Оптимизация игры - это настоящий творческий полет фантазии!
Например, в игре есть проверка, что если вражеский корабль пролетел через камеру, то он удаляется. Оптимизация заключается в том, чтобы проверять только один корабль за отрисовку одного кадра, а не все корабли каждый кадр.
Оптимизация в алгоритме Boids. В нем для расчета параметров каждому кораблю требуется определить кто летит рядом с ним. Наша оптимизация в том, чтобы проверять соседей только у одного корабля за 1 кадр. В следующий кадр алгоритм проверит соседей у следующего корабля и т.д.
Ну и много-много других оптимизаций и улучшений... Это сложно, но очень увлекательно реализовывать.




Несколько скриншотов из игры. Модели корабликов тут уже старые :)))
Вчера мы релизнули игру в Google Play. В ней нет рекламы (пока что) и покупок, полностью бесплатна. Если кто-то захочет посоревноваться - милости просим! Также будем рады новым идеям и предложениям 🙂
Сразу скажу, что рекламу мы добавим позже. За просмотр рекламы можно будет получить двойные очки для магазина. И всё!
#комплиментдня за то, что дочитал до конца.
Когда я читаю твои посты - я получаю истинное удовольствие и расслабление!😊🌟
Всем привет!
Недавно захотелось нам в игру добавить туманности в виде Nebula облаков.
Попробовали поискать информацию в интернете, нашли такие варианты:
1. Использовать Raymarching алгоритм в шейдере, облака выглядят очень красиво и объемно, но результат очень ресурсоемкий.
2. Использовать набор плоскостей, на которые отрисовывается 3D текстура облака. Такой вариант работает быстрее, чем Raymarching, но требуется особая текстура (атлас), где будут отрисованы все "разрезы" облака.
3. Использовать системы частиц. Работает быстро, очень гибко в настройке. Такой подход используется в мобильной игре Galaxy on Fire 2.
На третьем варианте мы и остановились. Добавили эффект полета сквозь туманность. Результат выглядит примерно так:
Ниже мы расскажем, как его добиться :)
Подготовка
Мы начали работу с анализа Nebula облаков. И выделили три составляющих - сами облака, черные скопления и звезды.
Дальше мы искали атлас для частиц - это набор различных картинок, объединенных в одну текстуру. В атласе нас интересовали картинки, которые бы могли подойти для облака.
Здесь мы выбрали картинки для черных скоплений, картинки для самого облака и картинки для звезд. Сформировали новый атлас 4х4. Наборы расположили таким образом, чтобы первая строка картинок относилась к черным скоплениям, вторая и третья строки - к облаку, а последняя строка картинок - к звездам. Таким образом, мы будем использовать одну текстуру в нескольких системах частиц, это увеличит производительность.
Теперь нужно определиться с цветами. По запросу "nebulas gradient color" в интернете можно найти множество разных наборов цветов. Мы выбрали такую палитру:
Система частиц для основного облака
Теперь создаем систему частиц для основного облака, выставляем такие параметры:
Duration: 20
Looping: ✔️
Prewarm: ✔️
Start lifetime: 20
Start size: 100 - 150
Start rotation: 0 - 360
Simulation Space: World
Start Color: выбираем Gradient, режим Mode - fixed
Прозрачность выставляем 150 (верхний ползунок)
Вкладка Emission
Rate over Time: 2
Вкладка Shape
Здесь задаем форму для появления частиц, выберем полусферу, чтобы частицы появлялись "впереди" корабля
Shape: Hemisphere
Radius: 150
Radius thickness: 0.1
Вкладка Color over Lifetime
Тут зададим плавное появление и исчезание частиц через прозрачность (верхние ползунки)
Вкладка Texture Sheet Animation
Теперь надо указать, что в текстуре используется атлас и задать, какие картинки брать из атласа
Mode: Grid
Tiles: X = 4, Y = 4
Animation: Whole sheet
Time mode: Lifetime
Frame over Time (выбираем Random between two constants): 4 - 11.998
Вкладка Renderer
Задаем максимальный размер частицы относительно экрана и указываем материал
Max Particle Size: 10
Material: создать материал
Материал
Для этой системы частиц создаем материал с нашей текстурой-атласом. Шейдер выбираем обычный для частиц Mobile/Particles/Additive
В результате получим примерно такой вид облака:
Система частиц для черных туманностей
Копируем систему частиц для облаков и модифицируем ее под черные туманности.
Для этого изменим следующие параметры:
Start size: 200 - 400
Start Color: выбираем черный цвет
Вкладка Emission
Rate over Time: 0.2
Вкладка Shape
Если оставить полусферу, то черные пятна могут появиться на пути игрока, что выглядит не очень красиво. Поэтому форму генерации мы изменили на конус.
Shape: Cone
Angle: 15
Radius: 100
Radius Thickness: 0.13Length: 160
Emit from: VolumeВкладка Texture Sheet Animation
меняем индексы картинок на индексы под черную туманность
Frame over Time: 0 - 3.998
Материал для черной туманности
Создаем новый материал и выбираем шейдер Mobile/Particles/Multiply.
Этот шейдер будет делать обратный эффект - затенять картинку. Т.е. делать полностью черные частицы.
Получим примерно такую систему:
Система частиц для звезд
Третью систему частиц мы также сделаем копированием из первой системы. И изменим следующие параметры:
Start size: 5-10
Start color: в градиенте выставляем несколько ярких цветов и у всех выставляем яркость 40 (параметр V в палитре HSV). Ниже будет пояснение.
Вкладка Emission
Rate over Time: 1
Вкладка Texture Sheet Animation
меняем индексы картинок на индексы под звезды
Frame over Time: 12 - 15.998
Материал для звезд
Для звезд мы будем использовать собственный шейдер, поэтому материал создаем новый.
Сам шейдер будет основан на простом Additive шейдере, но с нюансом - будет умножать цвет на 4. Таким образом, края текстуры будут иметь цветовой оттенок, а середина станет "засвеченной", т.е. белой. Именно поэтому мы уменьшили яркость цвета в палитре у системы частиц.
Код шейдера доступен по этой ссылке, пользуйтесь на здоровье :)
На этом настройки систем частиц окончены. Также, можно поиграть с разными формами генерации и попробовать сгенерировать само облако отдельно. Конечно, есть некоторые проблемы с отображением черных пятен, но это из-за перекрытия частиц друг другом
#комплиментдня за то, что дочитал до конца.
Ты очень добрый и отзывчивый участник PGD сообщества!
Всем привет!
Когда мы только начинали проект, у меня уже тогда была хитрая идея для локализации.
Зачем нужны тонны текстов и подсказок, различных шрифтов, поддержка кириллицы, мучение с подборкой размера текстов... Это всё не нужно, если будут иконки! Вот он, секрет успешной локализации, - думал я! Человечество уже опубликовало тысячи мобильных игр, придумало всевозможные иконки под всё что угодно!
Воодушевившись этой идеей, мы начали работу над интерфейсом. Минималистичный дизайн, простые иконки и никакого текста!
Пример интерфейса
Но радость была недолгой. Как только мы дошли до дизайна окон, мы поняли, что немного текста добавить придется.
Интерфейс окна улучшений турели
Все только самое необходимое и нужное, минимум информации. :D
Тогда я задумался над системой локализации. Потому, что чем раньше ее сделать, тем меньше ошибок мы допустим при переводе на новые языки.
На тот момент у меня были общие знания по переводу, я где то видел использование файлов xml. Но идти по общему шаблону мне не хотелось. Я был уверен, что смогу придумать что то еще. Ведь у нас редактор Unity, наверняка в нем есть механизмы хранения данных... Например, ScriptableObject. В голове крутилась идея, что он может отлично подойти, главное - правильно организовать сами данные. Как обычно, я загрузил голову перед сном, а на утро уже родилась идея :)
Какие параметры нам могут пригодиться? Как минимум - шрифт, размер текста и набор уникальных идентификаторов. А также название языка и системный идентификатор языка, чтобы по нему потом выбрать локализацию в соотв. с настройками языка на телефоне.
Пример профиля локализации меню
Далее, чтобы программно определять, какой текст мы хотим считать, нам нужно создать свой тип перечислений (enum) и добавить функцию в наш профиль локализации ScriptableObject, которая бы по заданному типу возвращала нужную строчку.
Пример идентификаторов текста enum
Пример функции определения текста
После этого остается сделать простой менеджер локализаций, который будет хранить доступные профили, и скрипт, который мы добавим на все тексты. По заданному типу идентификатора скрипт будет считывать текст из текущего профиля локализации. Также, мы добавим в скрипт размер текста (Нормальный, Меньше, Мелкий), чтобы устанавливать необходимый размер шрифта. Готово!
Пример использования
Какие плюсы использования ScriptableObject?
Если бы мы делали локализацию на основе файлов XML, то нам пришлось бы их размещать в папке Resources, это может плохо сказаться на скорости загрузки приложения (при большом кол-ве файлов в Resources). Ограничение связано с тем, что работа с файлами доступна, только если сами файлы лежат в открытом источнике.
Наши же профили ScriptableObject мы можем размешать в любой части проекта и на скорость загрузки они будут влиять гораздо меньше.
В случае, если нам нужно добавить новую локализацию - нам будет визуально проще править все тексты и меньше шансов, что мы где то забудем перевести текст.
Помните, гораздо проще внедрить локализацию на ранних этапах разработки, когда Вы еще не забыли, на каких элементах есть тексты, в каких окнах и скрытых позициях. Также выработаете навык автоматического добавления нужных идентификаторов при появлении новых текстов :) Учтите, что новые идентификаторы текстов можно добавлять только в конец enum, иначе все текущие настройки текстов в сцене "сдвинутся".
На этом пока всё, о чем будет следующая статья - я еще не придумал, но обязательно что то придумаю :)
Спасибо, что дочитали!
Ниже я оставлю ссылки на примеры скриптов, может кому то понадобятся
Предыдущие статьи:
Часть 5. Игровой ИИ и с чего начать
Часть 4. Противники (продолжение)
Всем привет!
С чего начинается искусственный интеллект (ИИ)? А начинается он с объекта, которым ИИ будет управлять. В зависимости от того, как Вы спроектируете свой объект, будет зависеть сложность его управления.
Мы с самого начала разделили наши объекты на разрушаемые и неразрушаемые. Для разрушаемых объектов сделали простой скрипт Health, который позволял задавать Жизнь и имел функцию AddDamage(float damage), через которую наносился урон объекту. Если у объекта заканчивалась Жизнь, он деактивировался.
Противники у нас разрушаемые, но кроме параметра Жизнь, им нужны были еще параметры Скорость передвижения, Скорость поворота, Наносимый урон, Дальность атаки и Точность попадания. И еще Уровень противника, от которого будут зависеть некоторые показатели.
Поэтому, на базе скрипта Health мы сделали новый скрипт SpaceShip, в котором мы могли хранить такие настройки.
Пример настройки фрегата
Для чего нужно наследоваться от класса Health?
В игре есть пули, ракеты и лазеры, которые при попадании наносят урон. Так как у нас только один класс отвечает за разрушаемость, то нам достаточно проверить, есть ли скрипт Health у объекта, куда попала пуля. И если есть - нанести урон.
Сейчас хочу сказать, что общая структура противников получилась очень удобной и понятной. Если нам нужны были какие то дополнительные параметры для корабля, то мы уже создавали новый класс на базе SpaceShip (например, для авианосца нужна ссылка на объект-истребитель, а также два параметра - лимит истребителей и задержка между их запуском). Параметры корабля инициализировались в скрипте Генератора противников, перед выходом корабля из варпа.
Ну что, теперь у нас уже есть некоторые параметры для нашего ИИ.
На чем сделать ИИ?
Изначально, я очень хотел сделать ИИ на базе нейронных сетей, чтобы корабли сами выстраивали свою стратегию полета, уклонялись от снарядов и вообще, становились сильнее с каждой игрой. К сожалению, мне не хватило знаний, чтобы формализовать и перенести такие действия на нейронные сети. Хотя как работают нейронные сети и как проводить их обучение - я знаю :)
Раз нейронные сети отпадают, то оставался вариант - машина состояний (state machine). Такой вариант хорошо вписывался в общую концепцию поведения кораблей, потому что любое поведение кораблей можно было разделить на составляющие - подлететь к базе, отлететь от базы, приблизиться на определенную дистанцию, лететь к выбранной точке А, повернуться стороной и т.д.
Визуализация двух состояний истребителя
Оставалось выбрать, как реализовать машину состояний:
1. писать свой "движок" для состояний;
2. использовать какой то готовый "движок".
Перед тем, как что то выбрать, сначала надо изучить доступные варианты. В интернете мы нашли много различных готовых "движков", а также подробных инструкций, как сделать свой движок. Но при этом, мы нашли информацию, что в Unity уже есть встроенная машина состояний - это Аниматор. Изначально, задача аниматора в Unity - это проигрывание разных состояний анимации персонажа - бег, ходьба, атака и тд. Но при необходимости, можно добавить выполнение кода в состояние. Вот она, лазейка :)
Многие скажут, что написать движок для машины состояний легко, и будут правы! Игру мы пишем под мобилки, где как раз процессоры многоядерные.
Получается, мы можем писать логику ИИ практически без всякой нагрузки на главный процесс игры! Это же какая оптимизация получается! :) Только при разработке кода, нужно учитывать, что код выполняется параллельно, и если мы будем менять какие то общие переменные, то нужно делать это безопасно, с использованием блокировок.
Состояния аниматора Unity
Чтобы использовать код в состояниях, нужно написать скрипт, который наследуется от класса StateMachineBehaviour. Мы постарались сделать некий удобный шаблон, который использовали во всех подобных скриптах.
public class StateTemplate : StateMachineBehaviour
{
[Header("Parameters")]
//тут можно объявить всякие параметры
[Header("State settings")]
public string onExitDeactivate = "stateA";
public string onFinishActivate = "stateB"; //приватные переменные
public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
//вызывается при каждом входе в состояние
//через animator.GetComponent можно получить доступ к скриптам объекта
}
public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
//пока состояние активно, постоянно вызывается
//если нужно выйти из состояния, вызываем animator.SetBool(onFinishActivate, true);
}
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)Каждое состояние у нас связано с определенной переменной типа bool в аниматоре.
{
//вызывается при каждом выходе из состояния
animator.SetBool(onExitDeactivate, false);
}
}
В функции OnStateEnter обычно кешируются различные классы противника, проводится инициализация состояния, рассчитываются точки маршрута и т.д.
Также важно учесть, что внутри функций нельзя объявлять переменные, иначе при параллельной работе значения будут перезатираться. Все переменные объявляются как атрибуты класса и будут принадлежать одному противнику (владельцу аниматора). Это особенность аниматора Unity.
Разработка ИИ
После этого начался творческий и достаточно сложный этап продумывания поведения для каждого корабля. Мы пересмотрели различные космические битвы, стрелялки с видом сверху и прочее. И придумали следующие стадии для каждого противника:
1. Истребители будут иметь два состояния - в одном состоянии они приближаются к станции на определенную дистанцию, а потом переходят во второе состояние и отлетают в случайном направлении и потом всё повторяется.
2. Фрегаты также имеют два состояния, сначала они приближаются к станции на некоторую дистанцию, а потом переходят во второе состояние, где летают влево-вправо перед станцией.
3. Крейсеры и Авианосцы также имеют два состояния - подлетают к станции и после этого поворачиваются одной из сторон к станции и открывают огонь.
В дальнейшем, мы улучшили поведение истребителей. Потому что изначально, каждый из них летал самостоятельно, кто то нападал, другой в это время отлетал. Получалось какое то месиво. Этот тип кораблей стал самым ненавистным в игре :) Мы хотели их как то сгруппировать, чтобы игроку было удобнее и зрелищнее их уничтожать. И тут мне попадается статья о симуляции полета стаи птиц под названием Boids. Увидев эту симуляцию, мы просто загорелись желанием реализовать подобное поведение у истребителей! Через несколько вечеров доработка была готова!
Теперь каждый истребитель присваивался группе. "Голова" группы выбирал куда лететь - на станцию или от станции, все остальные члены группы следовали за ним с помощью алгоритма Boids.
Состояния ИИ истребителя
Теперь у истребителей было три состояния:
1. Boids - если истребитель не "голова" группы, он остается в этом состоянии. Здесь происходит расчет движения корабля в стае. В случае, если текущая "голова" группы будет уничтожена, следующий за ним в группе корабль становится новой "головой" группы.
2. Fly Back - это состояние для "головы" группы, истребитель выбирает случайное направление и удаляется от станции.
3. Chase - это также состояние для "головы" группы, истребитель приближается к станции.
Демонстрация нового ИИ истребителей
Результаты оказались просто потрясающими! Новое поведение истребителей стало гораздо зрелищнее и приятнее :)
Если кому то будет интересно, как именно писать код для состояний, то вот пример скрипта, который случайно поворачивает Крейсер влево или вправо и открывает стрельбу по игроку NetRotateSide.cs
В завершение статьи хочу сказать, что разработка ИИ оказалась одной из самых интересных этапов написания игры. У нас получилось сделать гибкую систему, которую легко можно расширить и добавить новые фичи. Надеюсь, что статья поможет кому то с выбором основы под ИИ :)
В следующей статье я расскажу о том, как мы делали локализацию.
Если у Вас есть идеи поведения противников - делитесь!
Всем хорошего кодинга!
Предыдущие статьи:
Часть 4. Противники (продолжение)
Часть 2. Генератор волн противников
Ссылка игры в Google Play: Space Turret: Defense Point
Всем привет!
Во многих играх Боссы занимают весьма важную роль. Их прохождение гарантирует, что игрок приобрел некоторые навыки, смог развиться до определенного уровня и уже хорошо разбирается в механике игры. Поэтому мы подготовили 5 различных боссов под каждую кампанию. Итак, встречайте! :)
Крейсер Паршивых Пиратов
Пираты, отчаявшись захватить станцию, предпринимают свою последнюю попытку. Использовав практически все ресурсы, они разрабатывают особый Крейсер.
Этот супер тяжелый класс, размер которого в несколько раз превышает обычный крейсер и имеет на своем борту супер тяжелое вооружение. Его корпус обшит титановыми пластинами толщиной не менее полуметра. Мощность двигателя также была повышена, но в ущерб топливу. Половина трюма корабля занимают топливные баки, которые при взрыве могут нанести серьезный ущерб окружающим кораблям.
Авианосец Кровавых Пиратов
Кровавые Пираты смогли дальше продвинуться в развитии космических технологий и построили Авианосец.
Этот корабль дополнительно оборудован ракетными установками. Пока истребители будут отвлекать противника, Авианосец сможет нанести критические повреждения станции. Современные маневровые двигатели обеспечивают отличное уклонение от снарядов противника.
Линкор Наемников
Наемники обладают самыми совершенными военными технологиями в области кораблестроения.
Именно они смогли построить первый Линкор, благодаря которому добились своей жестокой известности. На текущий момент это самый большой, мощный и хорошо вооруженный корабль. На своем борту он имеет целых 10 тяжелых ионных орудий, вмонтированных в корпус корабля. Также имеется ангар для истребителей, вместимостью до 50 кораблей! Еще ни одна станция не смогла отразить нападение Линкора!
Дредноут Враждебной Империи
Пираты, Наемники... Их мощь и сила никогда не сравнятся с силой Империи! Обладая всеми ресурсами галактики, они смогли построить Дредноут!
Это самый совершенный и разрушительный тип кораблей, который получилось построить у человечества. Совершенная броня, огромные генераторы, громадные ангары, тяжелые ионные орудия и торпедные установки - гарантия победы Дредноута в любой битве.
Флагман Зоргов
Вселенная таит в себе много опасностей, но появление Флагмана Зоргов - было абсолютной неожиданностью.
Именно этот противник является "мозгом" всей расы Зоргов. Способен выпускать огромный луч разрушающей энергии, расщепляющий всё на своем пути. Имеет на борту множество различных защитных систем. Одна из них - особый щит, который защищает Флагман от любых повреждений. Щит поддерживается специальными Дронами-Защитниками. Это Абсолютное оружие, настоящий Армагеддон всего живого!
На этом статья подходит к концу. Было потрачено множество вечеров на проектирование и разработку этих боссов, особенно на Флагмана Зоргов. Мы не стали раскрывать все фишки Флагмана, так что надеемся, он сможет удивить тех, кто до него дойдет :)
В следующей статье я попробую рассказать о глубоком внутреннем мире противников, как мы организовали внутренние структуры и как проектировали их интеллект.
Если у Вас есть вопросы или замечания - пишите, с радостью отвечу :)
Предыдущие статьи:
Часть 3. ПротивникиЧасть 2. Генератор волн противников
Ссылка игры в Google Play: Space Turret: Defense Point
Всем привет!
Сегодня я расскажу и покажу то, что большинство игроков не сможет увидеть в игре. Мы очень долго старались это скрывать, практически целый год (10 месяцев). Это те вещи, над которыми мы работали ночами, куда вкладывали максимум усилий. Более того, мне пришлось вложить часть своей души в одну из вещей, чтобы сделать ее ошеломительной.
Итак, речь пойдет о противниках и я их покажу крупным планом!
Истребители
Самый первый противник, которого встречает игрок - это истребитель.
Данный корабль относится к легкому классу кораблей. Это маневренный, легкий и очень быстрый противник. Имеет очень слабую броню и простое плазменное вооружение. Сами по себе они не могут причинить какой-либо серьезный ущерб станции, но если они собираются в стаю, то всё может поменяться. В основном используются в качестве разведки, также могут быть использованы в качестве поддержки крейсеров и авианосцев.
Фрегаты
После того, как игрок успешно отбивается от нескольких стай истребителей, пираты отправляют в подмогу корабли среднего класса - фрегаты.
Эти корабли оснащены уже ракетными установками и чуть более крепкой броней по сравнению с легким классом. С помощью этих кораблей пираты уже успешно захватили несколько десятков станций.
Крейсеры
Если игроку удастся каким то образом выжить, то в следующий раз пираты уже пришлют на помощь Крейсеры.
Данный вид противника относится к тяжелому классу кораблей. Они были специально сконструированы для осады крупных станций. Их особый сплав корпуса способен выдержать прямые попадания ионного орудия. На борту у себя имеют две тяжелые турели. Единственным их слабым местом является скорость - они очень медленные. Но будьте уверены, несмотря на это, нескольких крейсеров будет достаточно, чтобы разнести всю вашу станцию.
Взрыватели
Когда у пиратов дело доходит до жареного, они применяют абсолютное оружие - взрывателей.
Главная задача этих противников - разнести всё на Вашей станции. На своем борту они несут несколько десятков тонн взрывчатки. Имеют очень толстую броню, чтобы гарантировать доставку своего груза до цели. Для этого корабля был разработан особый двигатель, который способен выдавать огромную мощь. Но для того, чтобы запустить этот двигатель в режиме постоянного ускорения, ему необходимо сначала зарядиться. Именно это является единственным слабым местом Взрывателей, т.к. в процессе зарядки двигателя корабли полностью неподвижны.
Авианосцы
Только однажды одному из шпионов ценой собственной жизни удалось получить секретную информацию о разработке пиратов - Авианосцах.
Эти противники также относятся к тяжелому классу кораблей. На своем борту не имеют никакого вооружения, кроме нескольких десятков истребителей, готовых в любую секунду атаковать Вашу станцию. Это настоящие плавучие крепости, главной задачей которых является поддержка крейсеров.
Зорги
Последняя кампания сильно отличается от всех предыдущих. В ней Игроку предстоит встретиться с новой расой противников - Зоргами. Это роботизированные, бездушные и безжалостные противники, которые разоряют всё на своем пути. О них мало что известно, кроме того, что первые контакты с Зоргами произошли в секторе Альфа.
Дроны-Разведчики
Эти противники также быстры и маневренны, как истребители, но они гораздо сильнее. Каждый дрон обладает штурмовым лазером, который может нанести неплохой ущерб станции. Нападают в огромных количествах. При обнаружении врага дроны вызывают подкрепление.
Дроны поддержки
Эти дроны относятся к среднему классу кораблей, обычно они первыми приходят в подкреплении. Имеют мощный лазер, способный легко прожечь дыру в корпусе станции.
При уничтожении дрона, его ядро преобразует внутреннюю структуру и распадается на более мелкие части - дронов-разведчиков.
Штурмовые дроны
Это самые тяжелые боевые единицы Зоргов. Их корпус состоит из неизвестного сплава, которому практически невозможно нанести урон. Их лазерное оружие гораздо больше, чем у других дронов. При уничтожении, ядро дрона также преобразует внутреннюю структуру и распадается на нескольких дронов поддержки.
В следующей части я продолжу повествование о противниках, и это будет рассказ о самых мощных, самых непробиваемых и долгоживущих кораблях в игре, которые игрок встретит только один раз - Боссы...
Предыдущие статьи:
Ссылка игры в Google Play: Space Turret: Defense Point