Editing Rooms and Portals

Example SceneTree

Собрав все идеи воедино, вот пример дерева сцены:

../../../_images/example_scenetree.png
  • Мы использовали RoomGroup для обозначения внешней области.

  • MeshInstances внутри Rooms являются либо STATIC, либо DYNAMIC.

  • Мы создали Spatial (я решил назвать его 'Freeform', но вы можете использовать любое имя), под которым можно разместить STATIC и DYNAMIC объекты, которые будут автоматически размещены. в комнатах (Freeform находится внутри roomlist, но не внутри комнаты.)

  • Игрок и монстры находятся на ветвях СНАРУЖИ roomlist.

  • Сетки игрока и монстра имеют портальный режим ROAMING поэтому они могут находиться в любой комнате.

  • Камера находится за пределами roomlist.

Создание систем помещений в Blender (или других инструментах моделирования)

Хотя вы можете создать свою систему комнат полностью в редакторе, вы также можете создавать комнаты и порталы в своем инструменте моделирования. Есть одна маленькая загвоздка — такие инструменты моделирования, как Blender, не знают об узлах Room, RoomGroup и Portal. Чтобы обойти это, мы используем ряд соглашений об именах. В первый раз, когда Godot сталкивается с этими узлами со специальными именами, он преобразует их в комнаты, группы комнат и порталы.

Postfix convention

  • -room становится :red:`Room<class_Room>`.

  • -roomgroup становится RoomGroup.

  • -portal становится Portal.

  • -bound становится привязанным вручную.

Rooms и RoomGroups должны создаваться как пустые в Blender. Таким образом, все дочерние элементы сетки пустой -room будут помещены в комнату во время преобразования в Godot.

Например:

  • kitchen-room - создайте Комнату под названием "kitchen".

  • outside-roomgroup - создайте RoomGroup с именем "outside".

  • kitchen-portal - создайте портал, ведущий в Комнату "кухня".

Порталы

Portals are different from Rooms. In Portals, we need to specify the geometry of the Portal in our modelling tool, in addition to just the name. To do this your "portal-to-be" should be created as a Mesh.

Портальные сетки имеют некоторые ограничения для правильной работы. Они должны быть выпуклыми, а точки многоугольника должны находиться в одной плоскости. Точность относительно плоскости не обязательно должна быть точной, так как Godot автоматически усреднит направление плоскости портала. После преобразования в узел Portal принудительно выполняется привязка к плоскости портала, и вершины задаются (и доступны для редактирования) как 2D-координаты в инспекторе, а не как 3D-точки.

The portal's naming is quite important. You can either name the portal -portal which will attempt to autolink the Portal in Godot, or you can use the name of the Room you wish to link the Portal to as a prefix.

Wildcard

In most cases, this can be done using a name such as kitchen-portal. However, there is one problem. Blender and Godot do not deal well when you have multiple objects with the same name. What happens when we want more than one Portal to lead to the kitchen?

Обходным решением является использование подстановочного знака, *. Когда Godot читает подстановочный знак, он игнорирует все, что стоит после него в имени.

This means we can use the following portal names:

  • kitchen*1-portal - создает Portal, ведущий на "kitchen".

  • kitchen*2-portal - также создает Portal, ведущий на "kitchen".

  • kitchen*anything_you_want_here-portal - тоже работает.

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

Manual bounds

Manual bounds are a way of explicitly setting the convex hull for a room, and are used if they are present as children of a room in the scene tree. Aside from the postfix, the naming is unimportant. They should be meshes (i.e. MeshInstance in Godot). Bear in mind they will be converted to convex hulls during the conversion process, so they don't have to be perfect.

Совет

Once used during conversion, they will be converted to the IGNORE Portal Mode and won't be shown. You can alternatively use Generate Points within the editor to convert these to a set of points stored in the room, and delete the original -bound MeshInstance.

Portal point editing

Порталы определяются комбинацией преобразования узла портала и набором точек, которые образуют углы.

The default portal has 4 corners as shown in the inspector:

../../../_images/portal_point_editing.png

You can edit these points in the gizmo or inspector to make a better match to the opening in your game level. It's generally better to keep the number of points as low as possible for the efficiency of the system. For example, it's better to risk rendering a little too much than to spend the time culling objects at 20 different edges.

Редактирование точки помещения

У вас также есть возможность вручную редактировать точки, используемые для определения выпуклой оболочки комнаты. Этих точек нет по умолчанию. Обычно вы создаете их, нажимая кнопку Создать точки на панели инструментов редактора, когда комната выбрана. Это передаст автопривязку из геометрии (или в ручную привязанную сетку) в инспектор. Как только в инспекторе появятся точки, они будут использоваться и переопределять любой другой метод. Поэтому, если вы хотите вернуться к ручному редактированию, удалите все точки комнаты.

../../../_images/room_point_editing.png

Ручное редактирование точек может быть полезно в некоторых ситуациях, особенно когда автопривязка дает не совсем нужный результат. Обычно хорошей идеей является использование большого количества Упрощений в инспекторе комнаты перед созданием точек. Имейте в виду, что по умолчанию значение Simplification будет унаследовано от RoomManager.

RoomManager

Show Debug

Это можно использовать для контроля количества логов, особенно логов преобразования комнат. Для отладки всегда будет установлено значение «false» в экспортируемых проектах.

Отладка Sprawl

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

Соединить меши

Чтобы свести количество обращений к минимуму, система предлагает возможность автоматического объединения похожих STATIC сеток в пределах помещения (также известное как статическое пакетирование). Это может увеличить производительность во многих случаях. Точность сортировки снижается, но поскольку комната является достаточно логичной единицей для сортировки, этот компромисс обычно работает в вашу пользу.

Plane Simplification

В некоторых случаях выпуклые корпуса, автоматически создаваемые для помещений, могут содержать очень большое количество плоскостей, особенно если вы используете криволинейные поверхности. Это не идеально, так как замедляет работу системы. Эта опция позволяет упростить корпуса. Степень упрощения может быть выбрана пользователем, между 0 (без упрощения) и 1 (максимальное упрощение). Вы также можете переопределить это значение в отдельных комнатах.

Порталы

Портал активен

Порталы можно включать и выключать во время выполнения. Это особенно полезно, если у вас есть двери, которые могут открываться и закрываться.

В обе Стороны

Порталы могут быть двусторонними или односторонними. Двусторонние порталы по-умолчанию быстрее настраивать в большинстве случаев, но односторонние порталы могут быть полезны в некоторых случаях. Например, односторонние порталы можно использовать для создания окон, из которых видно, но не видно внутрь. Это может повысить производительность при просмотре зданий извне.

Particle Systems

Помните, что при размещении STATIC системы частиц, AABB при преобразовании может иметь нулевой размер. Это означает, что система частиц может быть неожиданно удалена раньше времени. Чтобы предотвратить это, либо установите систему частиц portal mode на DYNAMIC, либо добавьте Extra Cull Margin к системе частиц в Geometry Inspector.

Multimeshes

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