Trial Park: Дневник разработчика

Привет, Пикабу


В марте стартовал игровой джем #GamesJam #GamesJamKanobu - нужно за месяц написать игру, используя физику. Моя цель - оценить перспективность своей идеи, а также поделится своими знаниями в разработке.


Если Вы начаниющий разработчик, думаю, этот пост будет Вам интересен.


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

Trial Park: Дневник разработчика Телефон, Android, iOS, Игры, Разработка, Раннер, Тир, Длиннопост

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

Trial Park: Дневник разработчика Телефон, Android, iOS, Игры, Разработка, Раннер, Тир, Длиннопост

Игра опирается на физику 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;

}


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


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

Trial Park: Дневник разработчика Телефон, Android, iOS, Игры, Разработка, Раннер, Тир, Длиннопост

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

Trial Park: Дневник разработчика Телефон, Android, iOS, Игры, Разработка, Раннер, Тир, Длиннопост

Для самых стойких, кто долистал дочитал до конца, ссылка на страницу GamesJam:

http://gamesjam.org/3162/ (тут можно поиграть в актуальную версию)


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


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

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

- систему бустеров для игрока - пополнение энергии, временное усиление огневой мощи, вместимости рожка для патронов и т.д.

- систему анти-бустеров для врагов - замедление, взрыв бомбы и т.д.


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


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

Лига Разработчиков Видеоигр

6.7K постов22.1K подписчика

Добавить пост

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции

- Выдавать чужой труд за свой

Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"

1
Автор поста оценил этот комментарий

Вопрос:

Это норма что останавливается на бугре? Дальше ехать возможно только если тебя "подтолкнет" попавший в тебя снаряд..


В таком моменте появившийся вертолет располагается в не зоны поражения... как и его снаряды.


Еще момент: Слишком большое время нужно чтобы "вынести" мелочь, и если они близко, то заваливат их "осколками"...

Иллюстрация к комментарию
раскрыть ветку
Автор поста оценил этот комментарий
Прикольная концепция, и хорошо что с памяти ничего не тянется во время игры. А то я прям рыдал, когда нужно было в реалтайме в бесконечный скроллер выгружать картинки
Автор поста оценил этот комментарий

Автор. Если можешь скинь пожалуйста свои контакты, типа ВК, или еще чего, а то к тебе будут вопросы и много)))

раскрыть ветку
Автор поста оценил этот комментарий

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

раскрыть ветку