@@ -16,51 +16,66 @@ The same approach can be used to distinguish between e.g. landwalking, swimming
1616.. tabs ::
1717 .. code-tab :: gdscript GDScript
1818
19- # create navigation mesh resources for each actor size
19+ # Create a navigation mesh resource for each actor size.
2020 var navigation_mesh_standard_size: NavigationMesh = NavigationMesh.new()
2121 var navigation_mesh_small_size: NavigationMesh = NavigationMesh.new()
2222 var navigation_mesh_huge_size: NavigationMesh = NavigationMesh.new()
2323
24- # set appropriated agent parameters
24+ # Set appropriated agent parameters.
2525 navigation_mesh_standard_size.agent_radius = 0.5
2626 navigation_mesh_standard_size.agent_height = 1.8
2727 navigation_mesh_small_size.agent_radius = 0.25
2828 navigation_mesh_small_size.agent_height = 0.7
2929 navigation_mesh_huge_size.agent_radius = 1.5
3030 navigation_mesh_huge_size.agent_height = 2.5
3131
32- # get the root node for the baking to parse geometry
32+ # Get the root node to parse geometry for the baking.
3333 var root_node: Node3D = get_node("NavigationMeshBakingRootNode")
3434
35- # bake the navigation geometry for each agent size
36- NavigationMeshGenerator.bake(navigation_mesh_standard_size, root_node)
37- NavigationMeshGenerator.bake(navigation_mesh_small_size, root_node)
38- NavigationMeshGenerator.bake(navigation_mesh_huge_size, root_node)
35+ # Create the source geometry resource that will hold the parsed geometry data.
36+ var source_geometry_data: NavigationMeshSourceGeometryData3D = NavigationMeshSourceGeometryData3D.new()
3937
40- # create different navigation maps on the NavigationServer
38+ # Parse the source geometry from the SceneTree on the main thread.
39+ # The navigation mesh is only required for the parse settings so any of the three will do.
40+ NavigationServer3D.parse_source_geometry_data(navigation_mesh_standard_size, source_geometry_data, root_node)
41+
42+ # Bake the navigation geometry for each agent size from the same source geometry.
43+ # If required for performance this baking step could also be done on background threads.
44+ NavigationServer3D.bake_from_source_geometry_data(navigation_mesh_standard_size, source_geometry_data)
45+ NavigationServer3D.bake_from_source_geometry_data(navigation_mesh_small_size, source_geometry_data)
46+ NavigationServer3D.bake_from_source_geometry_data(navigation_mesh_huge_size, source_geometry_data)
47+
48+ # Create different navigation maps on the NavigationServer.
4149 var navigation_map_standard: RID = NavigationServer3D.map_create()
4250 var navigation_map_small: RID = NavigationServer3D.map_create()
4351 var navigation_map_huge: RID = NavigationServer3D.map_create()
4452
45- # create a region for each map
46- var navigation_map_standard_region: RID = NavigationServer3D.region_create()
47- var navigation_map_small_region: RID = NavigationServer3D.region_create()
48- var navigation_map_huge_region: RID = NavigationServer3D.region_create()
49-
50- # set navigation mesh for each region
51- NavigationServer3D.region_set_navigation_mesh(navigation_map_standard_region, navigation_mesh_standard_size)
52- NavigationServer3D.region_set_navigation_mesh(navigation_map_small_region, navigation_mesh_small_size)
53- NavigationServer3D.region_set_navigation_mesh(navigation_map_huge_region, navigation_mesh_huge_size)
54-
55- # add regions to maps
56- navigation_map_standard_region.region_set_map(navigation_map_standard_region, navigation_map_standard)
57- navigation_map_small_region.region_set_map(navigation_map_small_region, navigation_map_small)
58- navigation_map_huge_region.region_set_map(navigation_map_huge_region, navigation_map_huge)
59-
60- # wait a physics frame for sync
61- await get_tree().physics_frame
62-
63- # query paths for each size
64- var path_standard_agent = NavigationServer3D.map_get_path(navigation_map_standard, start_pos, end_pos, true)
65- var path_small_agent = NavigationServer3D.map_get_path(navigation_mesh_small_size, start_pos, end_pos, true)
66- var path_huge_agent = NavigationServer3D.map_get_path(navigation_map_huge, start_pos, end_pos, true)
53+ # Set the new navigation maps as active.
54+ NavigationServer3D.map_set_active(navigation_map_standard, true)
55+ NavigationServer3D.map_set_active(navigation_map_small, true)
56+ NavigationServer3D.map_set_active(navigation_map_huge, true)
57+
58+ # Create a region for each map.
59+ var navigation_region_standard: RID = NavigationServer3D.region_create()
60+ var navigation_region_small: RID = NavigationServer3D.region_create()
61+ var navigation_region_huge: RID = NavigationServer3D.region_create()
62+
63+ # Add the regions to the maps.
64+ NavigationServer3D.region_set_map(navigation_region_standard, navigation_map_standard)
65+ NavigationServer3D.region_set_map(navigation_region_small, navigation_map_small)
66+ NavigationServer3D.region_set_map(navigation_region_huge, navigation_map_huge)
67+
68+ # Set navigation mesh for each region.
69+ NavigationServer3D.region_set_navigation_mesh(navigation_region_standard, navigation_mesh_standard_size)
70+ NavigationServer3D.region_set_navigation_mesh(navigation_region_small, navigation_mesh_small_size)
71+ NavigationServer3D.region_set_navigation_mesh(navigation_region_huge, navigation_mesh_huge_size)
72+
73+ # Create start and end position for the navigation path query.
74+ var start_pos: Vector3 = Vector3(0.0, 0.0, 0.0)
75+ var end_pos: Vector3 = Vector3(2.0, 0.0, 0.0)
76+ var use_corridorfunnel: bool = true
77+
78+ # Query paths for each agent size.
79+ var path_standard_agent = NavigationServer3D.map_get_path(navigation_map_standard, start_pos, end_pos, use_corridorfunnel)
80+ var path_small_agent = NavigationServer3D.map_get_path(navigation_map_small, start_pos, end_pos, use_corridorfunnel)
81+ var path_huge_agent = NavigationServer3D.map_get_path(navigation_map_huge, start_pos, end_pos, use_corridorfunnel)
0 commit comments