Как реализованы порталы в Portal? Думаю, тоже с помощью копирования комнаты.
Нет, вы что? Прямо так, с помощью порталов.
Я не знаю как точно это сделано в Source, но могу предположить как устроены порталы в Unreal Engine (н-р мод Nameless Mod к Deus Ex).
Весь уровень строится из аддитивной геометрии. Вы добавляете в сцену прямоугольные пустые области (комнаты, улица) и твердые блоки (здания, колонны), перед запуском сцены нужно выполнить ее Build (или портализацию). Причем твердые блоки уже выступают в качестве коллайдеров физического движка.
Портализация сводится к определению пересечения созданных брашей и разбиения игрового пространства на маленькие комнатки простой формы. Эти комнатки называются ячейками (cell) а переходы между ними - порталами (portals). Такое разбиение игрового пространства используется как Occlusion Culling в Unity - рендерится только содержимое тех ячеек, которые граничат с ячейкой в к-й находится игрок, а также ячеек, чьи порталы видно из граничных ячеек. При входе в портал меняется текущая ячейка и, след-но - список ее порталов и граничных ячеек.
Так вот, "порталы" в Unreal Engine наверняка (не могу ручаться точно) были сделаны путем добавления вручную дополнительного портала в процессе портализации. Добавлялась еще одна грань между ячейками, но в отличие от нормального процесса портализации 2 соединяемые ячейки находились далеко друг от друга, в разных частях карты. Соседство ячеек в данном случае не требуется, в портале просто указывались номера ячейки
A и
B. В результате в комнате
A игрок мог видеть через портал комнату
B и наоборот. Так обеспечивалась естественная поддержка порталов со стороны игрового движка.
В Source сцена также строится на основе первичной геометрии (пустые и твердые браши), поэтому вполне возможно что порталы устроены так же, как в Unreal Engine, только вместо статического добавления портала используется добавление динамическое.
Создание сцены в Unity основано геометрии сложных мешей с отдельными физическими коллайдерами, поэтому попытка разбить пространство на ячейки приведет к их огромному количеству. В общем, использование портализации уровня в Unity ни к чему хорошему не приведет.
Для создания замкнутого мира скорее всего придется создавать зеркало на границе мира, а при входе в него - телепортировать игрока в противоположную часть сцены.
Нужна помощь? Сами, сами, сами, сами, сами... делаем все сами