Процесс создания Snake New’n’Tasty

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

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

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

Написал небольшой конечный автомат на Action-делегате, с 3 функциями-состояниями:
1) Пустая функция (заглушка) Null
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, позволяющий создать миры из тайлов (небольших кусочков) и «сшивать» их между собой. Текстуры основаны на Kenney’s Assets. Там же имелась библиотека деревьев, ящиков, дверок, стрелочек, вполне отвечающая стилистике моей игры. Врагов взял из ассета Jelly Monsters. Добавил меню (uGUI), переключение между уровнями, панели паузы, загрузки, справку. После этого игра приобрела законченный вид.