NavigationMeshGenerator¶
已弃用: This class may be changed or removed in future versions.
继承: Object
用于创建和清除导航网格的助手类。
描述¶
此类负责在NavigationRegion中创建和清除用作NavigationMesh资源的3D导航网格。NavigationMeshGenerator非常有限,无法用于2D,因为导航网格烘焙过程需要解析3D节点类型和3D源几何。
整个导航网格烘焙最好在单独的线程中完成,因为所涉及的体素化、碰撞测试和网格优化步骤非常缓慢且performance-intensive操作。
导航网格烘焙分多个步骤进行,结果取决于NavigationMesh资源的3D源几何和属性。在第一步中,从根节点开始并根据NavigationMesh属性从SceneTree收集所有有效的3D源几何节点。其次,解析所有收集到的节点以获取其相关的3D几何数据,并构建组合的3D网格。由于可解析对象的许多不同类型,从普通的MeshRender到ICSGShapeBase或各种ColliderObjectBase,收集几何数据的一些操作可能会触发RenderingServer和PhysicsServer3D同步。服务器同步可能会对烘焙时间或帧速率产生负面影响,因为它通常涉及线程安全的Mutex锁定。许多可解析对象以及与其他线程服务器的持续同步会显着增加烘焙时间。另一方面,只有少数但非常大和复杂的对象需要一些时间来为服务器做准备,这可能会明显延迟下一帧渲染。作为一般规则,应平衡可解析对象的总数及其单个大小和复杂性,以避免帧速率问题或非常长的烘焙时间。然后将组合网格传递给重铸导航对象,通过在网格边界区域周围创建体素世界来测试适合NavigationMesh代理属性的可步行地形的源几何形状。
然后返回最终的导航网格并将其存储在NavigationMesh中,以用作NavigationRegion节点内的资源。
注意:使用网格不仅可以定义可步行的表面,还可以阻止导航烘焙并不总是有效的。在处理网格源几何时,导航烘焙没有几何“内部”的概念,这是有意的。根据当前烘焙参数,一旦阻碍网格足够大,可以在内部安装导航网格区域,烘焙将生成阻碍源几何网格内部的导航网格区域。
方法¶
void |
bake(navigation_mesh: NavigationMesh, root_node: Item) |
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: Item, callback: Callable = Callable()) |
方法说明¶
void bake(navigation_mesh: NavigationMesh, root_node: Item) 🔗
已弃用: 由于核心多线程方面的更改,该方法已被弃用。更新现有代码时,请先创建一个 NavigationMeshSourceGeometryData3D 资源。将该资源与 parse_source_geometry_data() 结合使用来解析 SceneTree 以查找应有助于导航网格烘焙的节点。对 SceneTree 的解析需要在主线程进行。解析完成后,将该资源和 bake_from_source_geometry_data() 结合使用来烘焙导航网格。
使用从root_node开始收集的源几何烘焙navigation_mesh。
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: Item, callback: Callable = Callable()) 🔗
根据navigation_mesh的属性解析源几何的SceneTree。使用结果数据更新提供的source_geometry_data资源。然后可以使用该资源烘焙带有bake_from_source_geometry_data()的导航网格。该过程完成后,将调用可选的callback。
注意:此函数需要在主线程上运行或使用延迟调用,因为SceneTree不是线程安全的。
性能:虽然方便,但从Mesh资源读取数据数组会对帧率产生负面影响。需要从GPU接收数据,从而在进程中停止RenderingServer。为了性能,更喜欢使用例如碰撞形状或完全在代码中创建数据数组。