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

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

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

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

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

Похожие вопросы