74

Supaplex Unity3d Clone

Добрый день, уважаемые пикабушники!

Хочу рассказать вам о своих небольших наработках по клонированию замечательной старенькой игры – Supaplex. Для тех, кто не знает, игра Supaplex вышла в 1991 году. Это двухмерный платформер, в котором предстоит играть за компьютерный вирус Мёрфи. Игра происходит внутри компьютера, необходимо проходить головоломки, собирать специальные объекты "Инфотроны", стараться не загонять себя в безвыходные ситуации. В игре много разных блоков: дискеты-взрывчатки, сник-снеки (ножницы), оперативная память, печатная плата, электроны, порты, зонки. Всего в игре 111 уровней.

Supaplex Unity3d Clone Gamedev, Supaplex, Unity3D, Длиннопост, Гифка

Сам я про эту игру узнал не так давно, коллега по работе принес и дал поиграть. В итоге мы немного посоревновались, кто пройдет все уровни быстрее, но так и не прошли все, а остановились в районе 50 – 60 уровней.

Как раз в это время я ковырял Unity и решил попробовать перенести все механики на этот движок, но уже не в 2d, а в 3d. Скажу честно, получилось не очень. До конца так и не удалось перенести всё достоверно, а то что есть – иногда работает неправильно (это баг, а не фича). Но, обо всем по порядку.

Итак, началось все с того, что я захотел перенести Supaplex на Unity и подумал, что не буду смотреть дизассемблированную версию оригинала. Все делалось с нуля и максимально похожим на оригинал.

Для начала надо было решить, как поступить с уровнями. В Unity есть замечательная функция, которая позволяет читать изображение по пикселям. Поэтому, было решено, что все уровни будут изображениями размером 58х22 пикселей (такой размер оригинальных уровней - 58 блоков на 22 блока). Каждый пиксель имеет свой цвет, который соответствует определённому блоку (например, (255, 0, 0) – это цвет Мёрфи, главного игрока). Unity анализирует изображение, определяет, какой цвет соответствует тому или иному блоку, и ставит его в нужную позицию. Теперь для создания уровня нужны были все блоки и "карта уровня". Но как получить "карты уровней", если не знать, как достать их из оригинала.

Здесь на помощь пришел вики сайт по Supaplex, где есть изображения всех уровней, и мой друг, который знает Python. Уровни на вики представлены следующим образом:

Supaplex Unity3d Clone Gamedev, Supaplex, Unity3D, Длиннопост, Гифка
Supaplex Unity3d Clone Gamedev, Supaplex, Unity3D, Длиннопост, Гифка
Supaplex Unity3d Clone Gamedev, Supaplex, Unity3D, Длиннопост, Гифка

Друг написал алгоритм, который переводит все блоки в пиксели нужного нам цвета. Мы скачали все изображения и прогнали их через программулину. Были небольшие неточности и ошибки с границей уровня. Но мы справились, вот какие уровни на входе получает Unity:

Supaplex Unity3d Clone Gamedev, Supaplex, Unity3D, Длиннопост, Гифка
Supaplex Unity3d Clone Gamedev, Supaplex, Unity3D, Длиннопост, Гифка
Supaplex Unity3d Clone Gamedev, Supaplex, Unity3D, Длиннопост, Гифка

После того, как получились карты уровней, началась работа над моделями. Есть две версии игры, с более хорошими моделями и есть версия (первоначальная), в которой модели были сделаны ужасно, совсем не обращалось внимания на количество вершин и треугольников. Это очень сильно сказывалось на производительности. В текущей версии во всех блоках максимально уменьшено количество треугольников, где их не видно – там все удалено. Вот вид "лицевой":

Supaplex Unity3d Clone Gamedev, Supaplex, Unity3D, Длиннопост, Гифка

А вот "со спины":

Supaplex Unity3d Clone Gamedev, Supaplex, Unity3D, Длиннопост, Гифка

Ну и для примера то, как изменилось количество треугольников в модели.

Было:

Supaplex Unity3d Clone Gamedev, Supaplex, Unity3D, Длиннопост, Гифка

Стало:

Supaplex Unity3d Clone Gamedev, Supaplex, Unity3D, Длиннопост, Гифка

На примере блока "Терминал" получилось снизить количество треугольников почти в 42 раза. Первоначально, почти все модели были сделаны так неаккуратно. Поэтому пришлось их переделывать.

Ну вот, все блоки готовы, сделан простой скрипт построения уровня.

Supaplex Unity3d Clone Gamedev, Supaplex, Unity3D, Длиннопост, Гифка

А вот, как выглядит уровень уже после работы скрипта:

Supaplex Unity3d Clone Gamedev, Supaplex, Unity3D, Длиннопост, Гифка

Остается самое веселое – оживить это все.

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

Supaplex Unity3d Clone Gamedev, Supaplex, Unity3D, Длиннопост, Гифка

Чтобы решить эту проблему, пришлось сделать скрипт, который обрабатывал все объекты по очереди, последовательно, один за другим. Это очень помогло, и клон по геймплею стал более похожим на оригинал.  Так же моей ошибкой было то, что я неправильно делал еще одну вещь - для проверки, свободна ли ячейка или нет, пускался луч, очень часто были глюки, когда блоки не распознавались, и ножницы, к примеру, уходили гулять по всей карте, а то и за нее. В текущей версии все определяется по двумерному массиву уровня, где в каждой ячейки стоит какое-то значение. Поэтому теперь, ножницы ведут себя правильно:

Supaplex Unity3d Clone Gamedev, Supaplex, Unity3D, Длиннопост, Гифка

И не только ножницы, но и электроны (да, у них одинаковое поведение):

Supaplex Unity3d Clone Gamedev, Supaplex, Unity3D, Длиннопост, Гифка

Ну, еще немножко похвастаюсь

Supaplex Unity3d Clone Gamedev, Supaplex, Unity3D, Длиннопост, Гифка

Вот главное меню оригинала:

Supaplex Unity3d Clone Gamedev, Supaplex, Unity3D, Длиннопост, Гифка
Supaplex Unity3d Clone Gamedev, Supaplex, Unity3D, Длиннопост, Гифка

А теперь моя версия:

Supaplex Unity3d Clone Gamedev, Supaplex, Unity3D, Длиннопост, Гифка
Supaplex Unity3d Clone Gamedev, Supaplex, Unity3D, Длиннопост, Гифка

Видео прохождения первого уровня (прошу прощения за качество и ватермарку):

Итак, поведем некоторый итог.

На данный момент есть возможность поиграть во все 111 уровней, правда пройти некоторые невозможно. Не реализовано изменение гравитации, и нет блока «Баг» (это обычная печатная плата, которую пробивают электрические разряды), блоки в некоторых ситуациях ведут себя некорректно. Работы еще очень много.

Планы на будущее.

Возможно, проект так и останется незавершенным, потому что ощущается нехватка времени, т.к. Unity - это хобби, которым занимаюсь на работе, когда находится свободная минутка. Также мне пришла идея сделать игру, которая очень похожа на Supaplex и мой Uniplex, но с другими блоками, другим сеттингом, да все другим, но со схожими механиками. Получается, что у меня уже есть какой-никакой прототип.

Всем большое спасибо за внимание и уделенное время!

Всем добра и успехов!

Supaplex Unity3d Clone Gamedev, Supaplex, Unity3D, Длиннопост, Гифка

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

ЗАПРЕЩЕНО:

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

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

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


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

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

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

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

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