NavigationMeshGenerator
已弃用: This class may be changed or removed in future versions.
继承: Object
对导航网格进行创建和清理的辅助类。
描述
该类负责创建和清除用作 NavigationRegion3D 内的 NavigationMesh 资源的 3D 导航网格。NavigationMeshGenerator 在 2D 中的用途非常有限,因为导航网格烘焙过程需要 3D 节点类型和 3D 源几何体来解析。
整个导航网格的烘焙最好在单独的线程中完成,因为所涉及的体素化、碰撞测试和网格优化步骤是非常缓慢且性能密集型的操作。
导航网格的烘焙分成若干步进行,最终结果取决于 NavigationMesh 资源的 3D 源几何体和该资源的属性。第一步是从根节点开始,并根据 NavigationMesh 的属性从 SceneTree 收集所有有效的 3D 源几何体节点。第二步会对所有收集的节点进行解析,以获得其相关的 3D 几何体数据,合并构造成一个 3D 网格。由于可解析的对象类型众多,从普通的 MeshInstance3D 到 CSGShape3D 再到各种 CollisionObject3D,其中某些收集几何数据的操作可能会触发 RenderingServer 和 PhysicsServer3D 的同步。服务器同步通常涉及 Mutex 锁定以确保线程安全,这会对烘焙时间或帧率产生负面影响。可解析对象过多,以及与多线程服务器之间的连续同步,都会大幅影响烘焙时间。而如果对象数量较少,但都是非常大而且复杂的对象,那么就会在为服务器准备数据上花费时间,这可能会明显拖延下一帧渲染。一般而言,可解析对象的总数与它们各自的大小和复杂度之间应该达到平衡,防止出现帧率问题和超长的烘焙时间。合并后的网格后续会被交给 Recast 导航对象,通过在网格的包围区域周边创建体素世界,来测试适合 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.
使用从 root_node
开始收集的源几何图形来烘焙 navigation_mesh
。
void bake_from_source_geometry_data(navigation_mesh: NavigationMesh, source_geometry_data: NavigationMeshSourceGeometryData3D, callback: Callable = Callable()) 🔗
使用 source_geometry_data
中提供的数据对 navigation_mesh
进行烘焙。烘焙过程结束后,会调用可选的 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()) 🔗
根据 navigation_mesh
的属性解析 SceneTree 中的源几何体。会使用解析的结果对提供的 source_geometry_data
资源进行更新。后续可以在使用 bake_from_source_geometry_data 烘焙导航网格时使用该资源。解析过程完成后,会调用可选的 callback
。
注意:因为 SceneTree 并不是线程安全的,所以这个函数需要在主线程执行或使用延迟调用。
注意:从 Mesh 资源读取数据数组虽然很方便,但会对帧率造成负面影响。这些数据需要从 GPU 获取,卡住正在处理的 RenderingServer。出于性能考量,请优先使用碰撞形状或在代码中创建完整的数据数组等方法。