NavigationMeshGenerator
Устарело: This class may be changed or removed in future versions.
Наследует: Object
Вспомогательный класс для создания и очистки навигационных сеток.
Описание
Этот класс отвечает за создание и очистку навигационных сеток 3D, используемых в качестве ресурсов NavigationMesh внутри NavigationRegion3D. NavigationMeshGenerator имеет очень ограниченное или вообще не используется для 2D, поскольку процесс запекания навигационной сетки ожидает анализа типов узлов 3D и исходной геометрии 3D.
Запекание всей навигационной сетки лучше всего выполнять в отдельном потоке, поскольку вокселизация, тесты столкновений и этапы оптимизации сетки являются очень медленными и ресурсоемкими операциями.
Запекание навигационной сетки происходит в несколько этапов, и результат зависит от исходной 3D-геометрии и свойств ресурса NavigationMesh. На первом этапе, начиная с корневого узла и в зависимости от свойств NavigationMesh, все допустимые исходные 3D-узлы геометрии собираются из SceneTree. Во-вторых, все собранные узлы анализируются на предмет соответствующих данных 3D-геометрии, и создается объединенная 3D-сетка. Из-за множества различных типов анализируемых объектов, от обычных MeshInstance3D-ов до CSGShape3D-ов или различных CollisionObject3D-ов, некоторые операции по сбору данных геометрии могут вызывать синхронизации RenderingServer и PhysicsServer3D. Синхронизация сервера может иметь отрицательное влияние на время выпечки или частоту кадров, поскольку она часто включает блокировку Mutex для безопасности потока. Множество анализируемых объектов и непрерывная синхронизация с другими потоковыми серверами могут значительно увеличить время выпечки. С другой стороны, лишь немногим, но очень большим и сложным объектам потребуется некоторое время для подготовки к отправке на серверы, что может заметно замедлить рендеринг следующего кадра. Как правило, общее количество анализируемых объектов, их индивидуальный размер и сложность должны быть сбалансированы, чтобы избежать проблем с частотой кадров или слишком длительного времени запекания. Затем объединенная сетка передается в объект Recast Navigation для проверки исходной геометрии на предмет пригодности для проходимости, соответствующей свойствам агента NavigationMesh, путем создания воксельного мира вокруг ограничивающей области сетки.
Затем финализированная навигационная сетка возвращается и сохраняется внутри NavigationMesh для использования в качестве ресурса внутри узлов NavigationRegion3D.
Примечание: Использование сеток не только для определения проходимых поверхностей, но и для запекания препятствий навигации не всегда работает. Запекание навигации не имеет понятия о том, что такое геометрия «внутри» при работе с исходной геометрией сетки, и это сделано намеренно. В зависимости от текущих параметров запекания, как только мешающая сетка становится достаточно большой, чтобы вместить область навигационной сетки внутри, запекание сгенерирует области навигационной сетки, которые находятся внутри мешающей исходной геометрии сетки.
Обучающие материалы
Методы
void |
bake(navigation_mesh: NavigationMesh, root_node: Node) |
void |
bake_from_source_geometry_data(navigation_mesh: NavigationMesh, source_geometry_data: NavigationMeshSourceGeometryData3D, callback: Callable = Callable()) |
void |
clear(navigation_mesh: NavigationMesh) |
void |
parse_source_geometry_data(navigation_mesh: NavigationMesh, source_geometry_data: NavigationMeshSourceGeometryData3D, root_node: Node, callback: Callable = Callable()) |
Описания метода
void bake(navigation_mesh: NavigationMesh, root_node: Node) 🔗
Устарело: This method is deprecated due to core threading changes. To upgrade existing code, first create a NavigationMeshSourceGeometryData3D resource. Use this resource with parse_source_geometry_data() to parse the SceneTree for nodes that should contribute to the navigation mesh baking. The SceneTree parsing needs to happen on the main thread. After the parsing is finished use the resource with bake_from_source_geometry_data() to bake a navigation mesh.
Запекает navigation_mesh с исходной геометрией, собранной, начиная с root_node.
void bake_from_source_geometry_data(navigation_mesh: NavigationMesh, source_geometry_data: NavigationMeshSourceGeometryData3D, callback: Callable = Callable()) 🔗
Запекает предоставленный navigation_mesh с данными из предоставленного source_geometry_data. После завершения процесса будет вызван необязательный callback.
void clear(navigation_mesh: NavigationMesh) 🔗
Удаляет все полигоны и вершины из предоставленного ресурса navigation_mesh.
void parse_source_geometry_data(navigation_mesh: NavigationMesh, source_geometry_data: NavigationMeshSourceGeometryData3D, root_node: Node, callback: Callable = Callable()) 🔗
Анализирует SceneTree на предмет исходной геометрии в соответствии со свойствами navigation_mesh. Обновляет предоставленный ресурс source_geometry_data полученными данными. Затем ресурс можно использовать для запекания навигационной сетки с помощью bake_from_source_geometry_data(). После завершения процесса будет вызван необязательный callback.
Примечание: Эта функция должна выполняться в основном потоке или с отложенным вызовом, поскольку SceneTree не является потокобезопасным.
Производительность: Несмотря на удобство, чтение массивов данных из ресурсов Mesh может отрицательно повлиять на частоту кадров. Данные должны быть получены от графического процессора, останавливая RenderingServer в процессе. Для производительности предпочтительнее использовать, например, формы столкновений или создавать массивы данных полностью в коде.