Как реализовать переходы между сгенерированными локациями(Unity 2D)?

Разрабатываю 2d (вид сверху) игру на Unity с рандомно генерируемыми локациями по типу как в roguelike-играх. Сейчас в игре 2 сцены, а именно меню и "main", в которой я планировал подгружать сгенерированные локации. Столкнулся с такой проблемой: по задумке, игрок может перейти из одной локации в соседние, зайдя в триггер на краю локации, по типу как в фоллаутах 1-2, получается что из первой локации можно перейти в локацию выше/ниже/правее/левее от текущей, при этом, локация из которой игрок переходить, должна сериализоваться, т.е. сохранить положение предметов, врагов и прочих объектов, чтобы в дальнейшем, при возвращении в исходную локу она уже была сгенерирована и загружалась из "сэйва". В общем возникла неразбериха, каким образом это реализовывать.
К примеру возьмём генерацию мира в Майнкрафт: при создании нового мира (по сути сейва), этот мир весит пару мегабайт, так как сгенерировано лишь пару чанков, но при продвижении игрока мир генерируется дальше и разрастается, при этом можно вернуться на место респауна и оно останется прежним.
Я пробую сделать локацию как класс с полями List floor, List items и т.п., и при генерации локации добавлять в списки соответствующие ГО, а также поля типа GameObject locationTop/Right/Left/Bot и в этих полях хранить ссылки на ГО уже созданных локаций, но что-то мне подсказывает, что это заведомо неверная реализация.
Прошу объяснить, как с точки зрения производительности лучше это реализовать или направить в какую сторону копать. Заранее спасибо.
  • Вопрос задан
  • 83 просмотра
Решения вопроса 1
BasmanovDaniil
@BasmanovDaniil
Геймдизайнер-телепат
Если у вас мир не бесконечный, то один из возможных подходов, это на старте создания мира для каждой локации сгенерировать свой seed, далее во время игры, если вы в эту локацию каким-либо образом попадёте (пешком, телепортируетесь или ещё как), то другой генератор берёт сохранённый seed и создаёт эту локацию с нуля. Если вы потом как-то внесёте изменения в эту локацию, то вы эти изменения сохраняете отдельно, будь то выпавшие предметы или снесённые стенки. Если вы потом захотите вернуться в эту локацию, то вы берёте сохранённый seed, с нуля генерируете локацию и применяете изменения. Другой вариант - в качестве seed для локации брать её координаты, такая схема подойдёт и для бесконечного мира, но не в каждой игре можно очевидным образом найти координаты уровня.

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

Вообще говоря, на тему генераторов и сидов могу посоветовать вот эту статью от разработчика Cogmind, там всё то же самое, что и я сказал, только подробнее.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
twobomb
@twobomb
Если берем майнкрафт или игры типа него, то для генерации игра использует seed(семя) обычное число от которого генерируются все последующие случайные числа, но эти случайные числа всегда в одинаковой последовательности что значит что мир будет выглядеть у всех одинаково, но стоит изменить хотя бы одну цифру последовательность генерации полностью меняется и мир совсем другой.
По поводу сохранения, сохранять стоит только то что изменил игрок, поставил блок, разбил окно, выкинул оружие ну и естественно то что нужно, а мир сохранять не нужно он всегда будет одинаков если генерируется от одного числа.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
YOPS LTD Санкт-Петербург
от 30 000 до 48 000 руб.
ЛАНИТ Москва
от 80 000 до 100 000 руб.
Кнопка Екатеринбург
До 100 000 руб.