top of page

Snake Creation

Разработка заняла у меня более двух месяцев.

Движение змейки основано на Rigidbody-физике. Змейка пускает 9 рэйкастов вниз (8 по периметру и 1 в центре), если попадает слой Ground, она может подпрыгнуть (прикладывается импульс вверх). Движение -- прикладывается сила в направлении осей джойстика или клавиатуры. Трение -- если кнопки движения не нажаты, скорость плавно уменьшается. Сделал ограничение на максимальную скорость.

Для разработки атаки языком, я использовал компонент Line Renderer. Он рисует линию в пространстве из точки origin (рот змейки) в точку destination (цель).

Написал небольшой конечный автомат на Action-делегате, с 3 функциями-состояниями:
1) Пустая функция (заглушка).
2) Язык вырастает: точка currentPosition движется от origin до destination при помощи Vector3.MoveTowards. Переход в (3).
3) Уменьшается: наоборот, от destination до origin. Возврат к состоянию (1).
По умолчанию (1) — ничего не происходит. По нажатию кнопки "Атака": сброс, переход в состояние (2), оттуда в (3), оттуда в (1).

В Update непрерывно вызывается action() и перерисовывается Line Renderer. Двигаем 2 точки: точка 0 всегда в origin, точка 1 привязана к точке currentPosition.

На кончик языка прикрепил триггер. Если враги попадают в триггер, они теряют здоровье, если конфеты -- они добавляют кусочки хвоста.

Для поворота змейки запретил вращение в Rigidbody и поворачивал вручную через кватернионы и фунцию MoveRotation.

Реализовал соскальзывание с крутых склонов (вычисляем нормаль поверхности, если она под углом более 45 градусов -- прикладываем силу вниз).

Добавил Blob-тень прямо под змейкой (при помощи проектора) - удобно прыгать, видишь, куда приземляешься (поздее избавился от неё, так как смотрится неестественно, и обычная тень в итоге лучше).
Добавил звуки и музыку. Для этого я просидел ночь, перебирая звуки из бесплатных интернет-источников, скачивая подходящие. Я обрезал, нормализовал и подредактировал их.

Добавил скрипты здоровья (Health), нанесения урона (DealDamage) и неподвижного врага (Hazard). Добавил чекпойнты — когда касаешься, он активирован (звучит гонг и из него выходят лучики и звездочки); если погиб, начинаешь с этого места. Сначала использовал Xffect Editor, но потом решил, что встроенный Shuriken проще, гибче и нет багов.
Добавил движущегося врага. Повесил на него Health. Нарисовал ему путь при помощи Simple Waypoint System (отличная вещь, но пришлось исправить в ней небольшой баг). Соответственно, расширил функцию атаки языком - теперь можно не только подбирать призы, но и отнимать здоровье у врага.

Добавил призы-конфеты, их можно есть (Lctrl). Некоторые конфеты убегают, когда к ним приближаешься (на них висит триггер, который ищет игрока). Есть граммофон - бесконечный источник, из которого постоянно вылетают конфеты (самоуничтожаются через 10 сек или при падении с обрыва).

Хвост создал в виде стека из Gameobject'ов на 10 элементов. Написал методы "добавить элемент", "удалить элемент", "удалить весь хвост" (в цикле while все элементы поочередно извлекаются и удаляются).
Добавил летающие в воздухе пылинки. Ну и водопад - для украшения (в демо-версии).

Добавил люки -- если встать на них и махнуть языком, на них действует импульс вверх, они подлетают в воздух, а под ними спаунится конфетка.

Добавил Killzone (если падает в пропасть - погибает и возрождается на чекпойнте).

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

 

Первоначально игра выглядела так:

Показал демку знакомым. Никто не понял, сколько труда я вложил в это. Все сказали: "Какая-то дурацкая игра, аляповатые цвета, все из кубиков и шариков -- не умеешь ты писать игры".

Тогда я решил улучшить внешний вид игры. И буквально за пару дней накидал красивый уровень, используя замечательный ассет Tile Tool, позволяющий создать миры из тайлов (небольших кусочков) и "сшивать" их между собой. Там же имелась библиотека деревьев, ящиков, дверок, стрелочек, вполне отвечающая стилистике моей игры. Врагов взял из ассета Jelly Monsters. Добавил меню (uGUI), переключение между уровнями, панели паузы, загрузки, справку. После этого игра приобрела законченный вид.

bottom of page