Zoomed

Как я превратил свой город в игровую площадку: Дневник инди-разработчика

У каждого инди-разработчика рано или поздно возникает эта навязчивая мысль: «А что, если перенести мой родной город в игру?». Идея чертовски заманчивая. Одно дело — бегать по выдуманным фэнтезийным мирам, и совсем другое — выстраивать геймплей на перекрестке, который ты переходишь каждый день по пути за кофе.

Для меня таким полигоном стал Кемерово. Но как от абстрактной идеи перейти к рабочему прототипу? Все начинается с R&D (Research and Development) — фазы исследований, где ты ломаешь дрова, чтобы найти идеальный инструмент.

От сырых данных к чистому холсту

Любой проект начинается с попыток заставить технологии работать на твою задумку. Когда я только загорелся этой идеей, я ковырялся с сырыми XML-выгрузками из OpenStreetMap. Я пытался заставить движок правильно парсить узлы, пути и отношения, чтобы понять, где находится дом, а где пролегает шоссе. Это был полезный, но довольно тяжеловесный опыт. Суть прототипирования механик заключается в том, чтобы найти самый изящный, быстрый и легковесный путь к результату. Если генерация карты будет занимать часы или "съедать" всю память, тестировать геймплей будет невозможно.

Так родился мой текущий скрипт-генератор для Unity, который перевел проект из тяжелого 3D в изящную 2D-плоскость.

Как научить игру строить города (объясняю на пальцах)

Если убрать всю заумную математику и строчки кода на C#, логика моего скрипта работает как слаженная бригада строителей:

  1. Запрос чертежей: Вместо того чтобы парсить карту прямо в игре, я вынес сложную логику на внешний Python-сервер. Игра просто стучится по ссылке и скачивает аккуратный, уже пережеванный файл в формате JSON (kemerovo_unity.json), где лежат только нужные координаты.
  2. Возведение зданий: Мы перешли в 2D. Игра берет координаты и размер каждого дома и буквально "штампует" на экране простые плоские прямоугольники (спрайты). Я задал им приятный серо-синий оттенок. Даже если зданий будет больше 30 тысяч, игра не зависнет, потому что используется хитрая оптимизация видеокарты (GPU Instancing).
  3. Прокладка асфальта: Дороги строятся еще проще. Движок использует инструмент LineRenderer — он просто тянет линию от точки А к точке Б, задавая ей нужную ширину реальной улицы.

Момент магии и что дальше?

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

Фото к статье 1

Зачем все это было нужно? Это — фундамент. Платформа для экспериментов.

Создание новых игровых механик всегда требует чистого холста. Нельзя тестировать логику поведения толпы или физику машин в пустоте. Теперь, когда у меня есть рабочая, мгновенно загружаемая 2D-карта моего города, я могу начинать творить. Запустить по этим линиям-дорогам симуляцию трафика? Сделать экономический тайкун службы доставки? Или устроить зомби-выживание в знакомых дворах?

Эксперимент с загрузкой карты удался. Холст натянут. Впереди самое интересное — вдохнуть в эти серо-синие квадратики жизнь.