Реализовал вот такие бесшовные переходы между комнатами
Таким способом можно миры какого-угодно размера делать.
..если, конечно, видеопамять позволяет. Благо у хренового графона свои преимущества – видеопамяти много не надо.
Действие моей следующей игры проходит на космическом корабле. Хоть он не очень большой, но в нём много помещений, между которыми игроку придётся регулярно перемещаться.
Помещения, неожиданно, соединены дверями.
Можно много придумать алгоритмов реализации перемещения между комнатами. Я всё завязал на дверях. У каждой комнаты есть свой список доступных дверей. У каждой двери определено две комнаты, которые она соединяет.
Всегда, в любой момент времени, без исключения, визуализируется только то помещение, в котором игрок находится + помещение за открытой дверью.
Когда игрок пролетает через дверную арку, новое помещение начинает считаться текущим, а прошлое «помещением за открытой дверью», потому они оба продолжают рендериться.
И, соответственно, старое перестаёт, когда дверь закрывается.
Подгрузка комнат (пока что) происходит в момент, когда комнату впервые нужно изобразить. После она остаётся лежать в памяти и включается\выключается по алгоритму выше.
Также (пока что) при запуске игры подгружаются основные комнаты, их ~30%. Оставшиеся ~70% подгружаются в процессе игры при подлёте к ним.
Избежать статтеров при подгрузке можно загрузив все комнаты сразу при запуске. Это занимает в среднем около 10 секунд ±. Много это или мало, пусть каждый решит сам.
Рассматриваю вариант реализовать фоновую подгрузку основных ресурсов ближайших комнат во время блуждания по кораблю, но из-за особенностей движка некоторые элементы невозможно безопасно подгрузить фоново, потому буду рассматривать ещё варианты как сделать так, чтобы и игра быстро запускалась, и статтерила по минимуму.
С помощью такого алгоритма можно объединять бесчисленное количество комнат ...сказал бы я, но, разумеется, всё зависит от их наполнения.
Например, если комнаты содержат одни и те же текстуры, а треугольники выделяются в среднем не на каждый мм² – комнаты смело можно хранить сотнями в памяти одновременно даже на средних машинах. На рендере это практически не скажется, поскольку единомоментно всегда рендерятся и обрабатываются лишь 1-2 комнаты.
Главное связать всё верно, а то стоит не добавить одну дверь в какой-нибудь список, так она сразу станет односторонней – в комнату впустит, а из неё не выпустит.
В конечном счёте, вся эта магия творится так, чтобы игрок ничего не замечал.
Он не должен замечать, что одновременно может быть открыта только одна дверь.
Он не должен замечать, что витиеватые комнаты наезжают на соседей через три дома.
Как и не должен замечать то, что игрок является лампочкой.
На видео ниже можете лицезреть не только как переходы в игре выглядят на длительной дистанции, но и то, что освещение подстраивается под позицию игрока. Это сделано, чтобы при «виде из глаз» придать окружению объёма. Если будет интересно узнать подробнее – пишите, может отдельный короткий пост об этом заделаю.
Ну и добавляйтесь в вишлист. Всем рады.