Skip to content

Commit 8db4fdd

Browse files
authored
Merge pull request godotengine#8976 from smix8/nav_examples01
Update some navigation code examples
2 parents 1d1f796 + cac53e5 commit 8db4fdd

6 files changed

+146
-82
lines changed

tutorials/navigation/navigation_connecting_navmesh.rst

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,20 +44,23 @@ The default 3D ``edge_connection_margin`` can be changed in the ProjectSettings
4444
The edge connection margin value of any navigation map can also be changed at runtime with the NavigationServer API.
4545

4646
.. tabs::
47-
.. code-tab:: gdscript GDScript
47+
.. code-tab:: gdscript 2D GDScript
4848

4949
extends Node2D
50-
# 2D margins are designed to work with "pixel" values
51-
var default_2d_map_rid: RID = get_world_2d().get_navigation_map()
52-
NavigationServer2D.map_set_edge_connection_margin(default_2d_map_rid, 50.0)
5350

54-
.. tabs::
55-
.. code-tab:: gdscript GDScript
51+
func _ready() -> void:
52+
# 2D margins are designed to work with 2D "pixel" values.
53+
var default_map_rid: RID = get_world_2d().get_navigation_map()
54+
NavigationServer2D.map_set_edge_connection_margin(default_map_rid, 50.0)
55+
56+
.. code-tab:: gdscript 3D GDScript
5657

5758
extends Node3D
58-
# 3D margins are designed to work with 3D unit values
59-
var default_3d_map_rid: RID = get_world_3d().get_navigation_map()
60-
NavigationServer3D.map_set_edge_connection_margin(default_3d_map_rid, 0.5)
59+
60+
func _ready() -> void:
61+
# 3D margins are designed to work with 3D world unit values.
62+
var default_map_rid: RID = get_world_3d().get_navigation_map()
63+
NavigationServer3D.map_set_edge_connection_margin(default_map_rid, 0.5)
6164

6265
.. note::
6366

tutorials/navigation/navigation_using_navigationlayers.rst

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,40 @@ without the need for more complex bitwise operations.
2323
In scripts the following helper functions can be used to work with the ``navigation_layers`` bitmask.
2424

2525
.. tabs::
26-
.. code-tab:: gdscript GDScript
26+
.. code-tab:: gdscript 2D GDScript
27+
28+
func change_layers():
29+
var region: NavigationRegion2D = get_node("NavigationRegion2D")
30+
# enables 4-th layer for this region
31+
region.navigation_layers = enable_bitmask_inx(region.navigation_layers, 4)
32+
# disables 1-rst layer for this region
33+
region.navigation_layers = disable_bitmask_inx(region.navigation_layers, 1)
34+
35+
var agent: NavigationAgent2D = get_node("NavigationAgent2D")
36+
# make future path queries of this agent ignore regions with 4-th layer
37+
agent.navigation_layers = disable_bitmask_inx(agent.navigation_layers, 4)
38+
39+
var path_query_navigation_layers: int = 0
40+
path_query_navigation_layers = enable_bitmask_inx(path_query_navigation_layers, 2)
41+
# get a path that only considers 2-nd layer regions
42+
var path: PoolVector2Array = NavigationServer2D.map_get_path(
43+
map,
44+
start_position,
45+
target_position,
46+
true,
47+
path_query_navigation_layers
48+
)
49+
50+
static func is_bitmask_inx_enabled(_bitmask: int, _index: int) -> bool:
51+
return _bitmask & (1 << _index) != 0
52+
53+
static func enable_bitmask_inx(_bitmask: int, _index: int) -> int:
54+
return _bitmask | (1 << _index)
55+
56+
static func disable_bitmask_inx(_bitmask: int, _index: int) -> int:
57+
return _bitmask & ~(1 << _index)
58+
59+
.. code-tab:: gdscript 3D GDScript
2760

2861
func change_layers():
2962
var region: NavigationRegion3D = get_node("NavigationRegion3D")

tutorials/navigation/navigation_using_navigationmaps.rst

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,19 @@ The 2D default navigation map RID can be obtained with ``get_world_2d().get_navi
2626
The 3D default navigation map RID can be obtained with ``get_world_3d().get_navigation_map()`` from any :ref:`Node3D<class_Node3D>` inheriting Node.
2727

2828
.. tabs::
29-
.. code-tab:: gdscript GDScript
29+
.. code-tab:: gdscript 2D GDScript
3030

3131
extends Node2D
3232

33-
var default_2d_navigation_map_rid: RID = get_world_2d().get_navigation_map()
33+
func _ready() -> void:
34+
var default_navigation_map_rid: RID = get_world_2d().get_navigation_map()
3435

35-
.. tabs::
36-
.. code-tab:: gdscript GDScript
36+
.. code-tab:: gdscript 3D GDScript
3737

3838
extends Node3D
3939

40-
var default_3d_navigation_map_rid: RID = get_world_3d().get_navigation_map()
40+
func _ready() -> void:
41+
var default_navigation_map_rid: RID = get_world_3d().get_navigation_map()
4142

4243
Creating new navigation maps
4344
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -57,20 +58,21 @@ Navigation regions and avoidance agents can only be part of a single navigation
5758
A navigation map switch will take effect only after the next NavigationServer synchronization.
5859

5960
.. tabs::
60-
.. code-tab:: gdscript GDScript
61+
.. code-tab:: gdscript 2D GDScript
6162

6263
extends Node2D
6364

64-
var new_navigation_map: RID = NavigationServer2D.map_create()
65-
NavigationServer2D.map_set_active(true)
65+
func _ready() -> void:
66+
var new_navigation_map: RID = NavigationServer2D.map_create()
67+
NavigationServer2D.map_set_active(true)
6668

67-
.. tabs::
68-
.. code-tab:: gdscript GDScript
69+
.. code-tab:: gdscript 3D GDScript
6970

7071
extends Node3D
7172

72-
var new_navigation_map: RID = NavigationServer3D.map_create()
73-
NavigationServer3D.map_set_active(true)
73+
func _ready() -> void:
74+
var new_navigation_map: RID = NavigationServer3D.map_create()
75+
NavigationServer3D.map_set_active(true)
7476

7577
.. note::
7678

tutorials/navigation/navigation_using_navigationpathqueryobjects.rst

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -30,33 +30,43 @@ This reuse avoids performance implications from frequent object creation if a pr
3030
has a large quantity of simultaneous agents that regularly update their paths.
3131

3232
.. tabs::
33-
.. code-tab:: gdscript GDScript
33+
.. code-tab:: gdscript 2D GDScript
3434

35-
# prepare query objects
36-
var query_parameters = NavigationPathQueryParameters2D.new()
37-
var query_result = NavigationPathQueryResult2D.new()
35+
# Prepare query objects.
36+
var query_parameters := NavigationPathQueryParameters2D.new()
37+
var query_result := NavigationPathQueryResult2D.new()
3838

39-
# update parameters object
40-
query_parameters.map = get_world_2d().get_navigation_map()
41-
query_parameters.start_position = agent2d_current_global_position
42-
query_parameters.target_position = agent2d_target_global_position
39+
func query_path(p_start_position: Vector2, p_target_position: Vector2, p_navigation_layers: int = 1) -> PackedVector2Array:
40+
if not is_inside_tree():
41+
return PackedVector2Array()
4342

44-
# update result object
45-
NavigationServer2D.query_path(query_parameters, query_result)
46-
var path: PackedVector2Array = query_result.get_path()
43+
query_parameters.map = get_world_2d().get_navigation_map()
44+
query_parameters.start_position = p_start_position
45+
query_parameters.target_position = p_target_position
46+
query_parameters.navigation_layers = p_navigation_layers
4747

48-
.. tabs::
49-
.. code-tab:: gdscript GDScript
48+
NavigationServer2D.query_path(query_parameters, query_result)
49+
var path: PackedVector2Array = query_result.get_path()
50+
51+
return path
52+
53+
54+
.. code-tab:: gdscript 3D GDScript
55+
56+
# Prepare query objects.
57+
var query_parameters := NavigationPathQueryParameters3D.new()
58+
var query_result := NavigationPathQueryResult3D.new()
59+
60+
func query_path(p_start_position: Vector3, p_target_position: Vector3, p_navigation_layers: int = 1) -> PackedVector3Array:
61+
if not is_inside_tree():
62+
return PackedVector3Array()
5063

51-
# prepare query objects
52-
var query_parameters = NavigationPathQueryParameters3D.new()
53-
var query_result = NavigationPathQueryResult3D.new()
64+
query_parameters.map = get_world_3d().get_navigation_map()
65+
query_parameters.start_position = p_start_position
66+
query_parameters.target_position = p_target_position
67+
query_parameters.navigation_layers = p_navigation_layers
5468

55-
# update parameters object
56-
query_parameters.map = get_world_3d().get_navigation_map()
57-
query_parameters.start_position = agent3d_current_global_position
58-
query_parameters.target_position = agent3d_target_global_position
69+
NavigationServer3D.query_path(query_parameters, query_result)
70+
var path: PackedVector3Array = query_result.get_path()
5971

60-
# update result object
61-
NavigationServer3D.query_path(query_parameters, query_result)
62-
var path: PackedVector3Array = query_result.get_path()
72+
return path

tutorials/navigation/navigation_using_navigationpaths.rst

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -33,34 +33,43 @@ Outside of grids due to polygons often covering large open areas with a single,
3333

3434

3535
.. tabs::
36-
.. code-tab:: gdscript GDScript
36+
.. code-tab:: gdscript 2D GDScript
3737

3838
extends Node2D
39-
# basic query for a navigation path in 2D using the default navigation map
40-
var default_2d_map_rid: RID = get_world_2d().get_navigation_map()
41-
var start_position: Vector2 = Vector2(0.0, 0.0)
42-
var target_position: Vector2 = Vector2(5.0, 0.0)
43-
var path: PackedVector2Array = NavigationServer2D.map_get_path(
44-
default_2d_map_rid,
45-
start_position,
46-
target_position,
47-
true
48-
)
4939

50-
.. tabs::
51-
.. code-tab:: gdscript GDScript
40+
# Basic query for a navigation path using the default navigation map.
41+
42+
func get_navigation_path(p_start_position: Vector2, p_target_position: Vector2) -> PackedVector2Array:
43+
if not is_inside_tree():
44+
return PackedVector2Array()
45+
46+
var default_map_rid: RID = get_world_2d().get_navigation_map()
47+
var path: PackedVector2Array = NavigationServer2D.map_get_path(
48+
default_map_rid,
49+
p_start_position,
50+
p_target_position,
51+
true
52+
)
53+
return path
54+
55+
.. code-tab:: gdscript 3D GDScript
5256

5357
extends Node3D
54-
# basic query for a navigation path in 3D using the default navigation map
55-
var default_3d_map_rid: RID = get_world_3d().get_navigation_map()
56-
var start_position: Vector3 = Vector3(0.0, 0.0, 0.0)
57-
var target_position: Vector3 = Vector3(5.0, 0.0, 3.0)
58-
var path: PackedVector3Array = NavigationServer3D.map_get_path(
59-
default_3d_map_rid,
60-
start_position,
61-
target_position,
62-
true
63-
)
58+
59+
# Basic query for a navigation path using the default navigation map.
60+
61+
func get_navigation_path(p_start_position: Vector3, p_target_position: Vector3) -> PackedVector3Array:
62+
if not is_inside_tree():
63+
return PackedVector3Array()
64+
65+
var default_map_rid: RID = get_world_3d().get_navigation_map()
66+
var path: PackedVector3Array = NavigationServer3D.map_get_path(
67+
default_map_rid,
68+
p_start_position,
69+
p_target_position,
70+
true
71+
)
72+
return path
6473

6574
A returned ``path`` by the NavigationServer will be a ``PackedVector2Array`` for 2D or a ``PackedVector3Array`` for 3D.
6675
These are just a memory-optimized ``Array`` of vector positions.

tutorials/navigation/navigation_using_navigationregions.rst

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -36,38 +36,45 @@ Creating new navigation regions
3636

3737
New NavigationRegion nodes will automatically register to the default world navigation map for their 2D/3D dimension.
3838

39-
The region RID can then be obtained from NavigationRegion Nodes with ``get_region_rid()``.
39+
The region RID can then be obtained from NavigationRegion Nodes with ``get_rid()``.
4040

4141
.. tabs::
42-
.. code-tab:: gdscript GDScript
42+
.. code-tab:: gdscript 2D GDScript
43+
44+
extends NavigationRegion2D
45+
46+
var navigationserver_region_rid: RID = get_rid()
47+
48+
.. code-tab:: gdscript 3D GDScript
4349

4450
extends NavigationRegion3D
4551

46-
var navigationserver_region_rid: RID = get_region_rid()
52+
var navigationserver_region_rid: RID = get_rid()
4753

4854
New regions can also be created with the NavigationServer API and added to any existing map.
4955

5056
If regions are created with the NavigationServer API directly they need to be assigned a navigation map manually.
5157

5258
.. tabs::
53-
.. code-tab:: gdscript GDScript
59+
.. code-tab:: gdscript 2D GDScript
5460

5561
extends Node2D
5662

57-
var new_2d_region_rid: RID = NavigationServer2D.region_create()
58-
var default_2d_map_rid: RID = get_world_2d().get_navigation_map()
59-
NavigationServer2D.region_set_map(new_2d_region_rid, default_2d_map_rid)
63+
func _ready() -> void:
64+
var new_region_rid: RID = NavigationServer2D.region_create()
65+
var default_map_rid: RID = get_world_2d().get_navigation_map()
66+
NavigationServer2D.region_set_map(new_region_rid, default_map_rid)
6067

61-
.. tabs::
62-
.. code-tab:: gdscript GDScript
68+
.. code-tab:: gdscript 3D GDScript
6369

6470
extends Node3D
6571

66-
var new_3d_region_rid: RID = NavigationServer3D.region_create()
67-
var default_3d_map_rid: RID = get_world_3d().get_navigation_map()
68-
NavigationServer3D.region_set_map(new_3d_region_rid, default_3d_map_rid)
72+
func _ready() -> void:
73+
var new_region_rid: RID = NavigationServer3D.region_create()
74+
var default_map_rid: RID = get_world_3d().get_navigation_map()
75+
NavigationServer3D.region_set_map(new_region_rid, default_map_rid)
6976

7077
.. note::
7178

72-
NavigationRegions can only be assigned to a single NavigationMap.
73-
If an existing region is assigned to a new map it will leave the old map.
79+
Navigation regions can only be assigned to a single navigation map.
80+
If an existing region is assigned to a new navigation map it will leave the old map.

0 commit comments

Comments
 (0)