Trial Park

Цель игры:

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

Технические подробности:

Игра пишется на Unity3d, с использованием 2d-физики. Разработкой прототипа занимаюсь один: программная часть и геймплей лежат на мне, графические заготовки беру в интернете рисую сам. Если прототип вызовет интерес и разовьется в полноценную техно-демку, к проекту подключится дизайнер и придаст игре ту самую изюминку, которой сейчас не хватает на скриншоте:

Моя профессиональная деятельность - программирование игр. Цель участия в джеме - оценить перспективность идеи, а также поделится своими знаниями в разработке. Поэтому страничка будет обновляться новыми данными о процессе разработки и размышлениями об игровом процессе.

Итак, приступим: игра опирается на физику 2d потому, что она требует меньше вычислительных ресурсов, и позволяет заполнить пространство уровня намного плотнее, чем в 3d. Игра ориентирована на мобильные платформы, так что - это актуальная проблема. Визуально же, игра может быть реализована в полном 2d, или же использовать 3d модели - на данном этапе для меня это не важно.

Игровой процесс разделяется на волны, в которых игрок должен отражать нападения разных врагов. Волны бывают простыми, когда игрок занимается отстрелом большого кол-ва врагов, и уникальными, когда игрок сражается с боссами. В какой-то мере, игра является endless runner'ом. С технической точки зрения это значит, что все игровые ресурсы стоит использовать многократно, иначе рано или поздно игра начнет притормаживать - это начнет работать сборщик мусора. В игре с постоянным и равномерным движением эти рывки буду особенно заметны, поэтому в основе всего лежит шаблон - пул объектов (Object Pool).

Пул объектов - это таблица списков, на C# она выглядит так: Dictionary < string, List< GameObject > >. В начале игры, мы заполняем эту таблицу идентификаторами объектов, которые нам нужны, и инициализируем списки экземплярами префабов - кол-во создаваемых объектов меняется в зависимости от того, как часто используется объект, например, мы добавляем 32 монетки "Coin", и всего лишь 4 яйца "Egg" - т.к. одновременно игроку может выпасть много монеток, но всего несколько яиц с динозавром. Еще один момент, на который стоит обратить внимание при использовании пула объектов - это на то, что объект всегда должен выходить из пула "чистым", в состоянии "по умолчанию" - иногда это самое сложное и чревато багами. Самый просто пример: все объекты в игре физические, и когда объект возвращается в пул, мы должны сбросить его скорости вращения / перемещения, иначе при повторном использовании он "выпрыгнет" помня о старых скоростях, что нам совсем не нужно, это выглядит так:

protected virtual void OnDisable()
{
    _rigidbody.velocity = Vector2.zero;
    _rigidbody.angularVelocity = 0.0f;
}

Конечно же, чем сложнее объект и чем больше состояний он имеет, тем сложнее его вернуть в состояние "по умолчанию".

Т.к. мы не знаем заведомо, где будет начало или конец волны (уровня), то нам нужно позаботится о динамическом создании уровня, здесь нам на помощь приходят триггеры:

Основная идея: Trigger Collector - это коллайдер, который охватывает всю "рабочую" область уровня, которая немного больше, чем размер видимой области камеры. Он слушает событие OnTriggerExit2D, и когда в него попадает элемент конструктора террейна - это значит, что ему пора возвращаться в пул, также это является сигналом, что нужно создать новый элемент дороги из пула и поставить его в авангарде. Вторая функция, которую выполняет Trigger Collector - это "слушать" врагов, которые покинули пределы игровой зоны - конечно, большую часть врагов должен уничтожать игрок, но это физическая симуляция, поэтому лучше перестраховаться: мы ведь не хотим, чтобы игра "зависла", когда один из врагов укатился черт знает куда, а игра все ждет, что игрок его расстреляет:

Для самых стойких, кто долистал дочитал до конца, ссылка на играбельную версию:

http://pixelfreshgames.com/tests/trial_park/ (сборка на WebGL, у нее нет прелоадера, так что нужно просто подождать, пока все загрузится)

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

В следующей версии, я планирую добавить:

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

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

Спасибо за внимание и успехов в разработке :)

mobile
Логотип проекта

Trial Park - это смесь жанров "moto trial" и виртуального тира. Игрок уходит от погони, отстреливаясь от врагов.

Играть
3


Участие в джемах


blog comments powered by Disqus