Trial Park: Дневник разработчика
Привет, Пикабу
В марте стартовал игровой джем #GamesJam #GamesJamKanobu - нужно за месяц написать игру, используя физику. Моя цель - оценить перспективность своей идеи, а также поделится своими знаниями в разработке.
Если Вы начаниющий разработчик, думаю, этот пост будет Вам интересен.
Для начала, пару слов об игре: Игрок должен уйти от погони, расстреливая все, что приближает к его машинке. Игра должна вызывать ощущение погони, драйва, в нее можно играть, чтобы "выпустить пар" после рабочего дня. В идеале, игра должна будить в игроке эмоции, как у гражданина с открытым ртом:
Технические подробности: Игра пишется на 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 - это "слушать" врагов, которые покинули пределы игровой зоны - конечно, большую часть врагов должен уничтожать игрок, но это физическая симуляция, поэтому лучше перестраховаться: мы ведь не хотим, чтобы игра "зависла", когда один из врагов укатился черт знает куда, а игра все ждет, что игрок его расстреляет:
Для самых стойких, кто долистал дочитал до конца, ссылка на страницу GamesJam:
http://gamesjam.org/3162/ (тут можно поиграть в актуальную версию)
Если у Вас есть технические вопросы, или замечания по геймплею, с удовольствием отвечу.
В следующей версии, я планирую добавить:
- "многоходовый" мега-босс - механический крокодил, вместо зубов у него будут ракеты, а из глотки буду вырываться бочки с горючим
- систему бустеров для игрока - пополнение энергии, временное усиление огневой мощи, вместимости рожка для патронов и т.д.
- систему анти-бустеров для врагов - замедление, взрыв бомбы и т.д.
Если пост окажется интересным читателям, то в следующем апдейте я опишу, как будет реализована стейт машина многоходового босса, как реализован WaveManager, отвечающий за настройку и управление волнами врагов, а также какой подход лучше использовать для управления частицами, типа взрывов, крови и т.д.
Спасибо за внимание и успехов в разработке :)
Лига Разработчиков Видеоигр
7.1K пост22.3K подписчиков
Правила сообщества
ОБЩИЕ ПРАВИЛА:
- Уважайте чужой труд и используйте конструктивную критику
- Не занимайтесь саморекламой, пишите качественные и интересные посты
- Никакой политики
СТОИТ ПУБЛИКОВАТЬ:
- Посты о Вашей игре с историей её разработки и описанием полученного опыта
- Обучающие материалы, туториалы
- Интервью с опытными разработчиками
- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе
НЕ СТОИТ ПУБЛИКОВАТЬ:
- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры
- Посты, единственная цель которых - набор команды для разработки игры
- Посты, не относящиеся к тематике сообщества
Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.
ЗАПРЕЩЕНО:
- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции
- Выдавать чужой труд за свой
Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.
О РАЗМЕЩЕНИИ ССЫЛОК:
Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:
- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества
- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз
- Cсылка размещается в формате: "Страница игры в Steam: URL"