Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Використання NavigationLayers
NavigationLayers є додатковою функцією для подальшого контролю того, які сітки навігації розглядаються в запиті шляху. Вони працюють подібно до того, як фізичні шари контролюють зіткнення між об’єктами зіткнення або як візуальні шари контролюють те, що відображається у вікні перегляду.
NavigationLayers можна назвати в ProjectSettings так само, як фізичні або візуальні шари.
Якщо в регіоні немає жодного сумісного навігаційного шару з параметром navigation_layers запиту шляху, ця навігаційна сітка регіонів буде пропущена під час пошуку шляху. Перегляньте Використання NavigationPaths для отримання додаткової інформації щодо запиту шляхів до NavigationServer.
NavigationLayers — це одне значення int, яке використовується як бітова маска. Багато вузлів, пов’язаних з навігацією, мають функції set_navigation_layer_value() і get_navigation_layer_value(), щоб встановити та отримати номер шару безпосередньо без потреби у складніших побітових операціях.
У сценаріях для роботи з бітовою маскою navigation_layers можна використовувати такі допоміжні функції.
func change_layers():
var region: NavigationRegion2D = get_node("NavigationRegion2D")
# enables 4-th layer for this region
region.navigation_layers = enable_bitmask_inx(region.navigation_layers, 4)
# disables 1-rst layer for this region
region.navigation_layers = disable_bitmask_inx(region.navigation_layers, 1)
var agent: NavigationAgent2D = get_node("NavigationAgent2D")
# make future path queries of this agent ignore regions with 4-th layer
agent.navigation_layers = disable_bitmask_inx(agent.navigation_layers, 4)
var path_query_navigation_layers: int = 0
path_query_navigation_layers = enable_bitmask_inx(path_query_navigation_layers, 2)
# get a path that only considers 2-nd layer regions
var path: PackedVector2Array = NavigationServer2D.map_get_path(
map,
start_position,
target_position,
true,
path_query_navigation_layers
)
static func is_bitmask_inx_enabled(_bitmask: int, _index: int) -> bool:
return _bitmask & (1 << _index) != 0
static func enable_bitmask_inx(_bitmask: int, _index: int) -> int:
return _bitmask | (1 << _index)
static func disable_bitmask_inx(_bitmask: int, _index: int) -> int:
return _bitmask & ~(1 << _index)
using Godot;
public partial class MyNode2D : Node2D
{
private Rid _map;
private Vector2 _startPosition;
private Vector2 _targetPosition;
private void ChangeLayers()
{
NavigationRegion2D region = GetNode<NavigationRegion2D>("NavigationRegion2D");
// Enables the 4th layer for this region.
region.NavigationLayers = EnableBitmaskInx(region.NavigationLayers, 4);
// Disables the 1st layer for this region.
region.NavigationLayers = DisableBitmaskInx(region.NavigationLayers, 1);
NavigationAgent2D agent = GetNode<NavigationAgent2D>("NavigationAgent2D");
// Make future path queries of this agent ignore regions with the 4th layer.
agent.NavigationLayers = DisableBitmaskInx(agent.NavigationLayers, 4);
uint pathQueryNavigationLayers = 0;
pathQueryNavigationLayers = EnableBitmaskInx(pathQueryNavigationLayers, 2);
// Get a path that only considers 2nd layer regions.
Vector2[] path = NavigationServer2D.MapGetPath(
_map,
_startPosition,
_targetPosition,
true,
pathQueryNavigationLayers
);
}
private static bool IsBitmaskInxEnabled(uint bitmask, int index)
{
return (bitmask & (1 << index)) != 0;
}
private static uint EnableBitmaskInx(uint bitmask, int index)
{
return bitmask | (1u << index);
}
private static uint DisableBitmaskInx(uint bitmask, int index)
{
return bitmask & ~(1u << index);
}
}
func change_layers():
var region: NavigationRegion3D = get_node("NavigationRegion3D")
# enables 4-th layer for this region
region.navigation_layers = enable_bitmask_inx(region.navigation_layers, 4)
# disables 1-rst layer for this region
region.navigation_layers = disable_bitmask_inx(region.navigation_layers, 1)
var agent: NavigationAgent3D = get_node("NavigationAgent3D")
# make future path queries of this agent ignore regions with 4-th layer
agent.navigation_layers = disable_bitmask_inx(agent.navigation_layers, 4)
var path_query_navigation_layers: int = 0
path_query_navigation_layers = enable_bitmask_inx(path_query_navigation_layers, 2)
# get a path that only considers 2-nd layer regions
var path: PackedVector3Array = NavigationServer3D.map_get_path(
map,
start_position,
target_position,
true,
path_query_navigation_layers
)
static func is_bitmask_inx_enabled(_bitmask: int, _index: int) -> bool:
return _bitmask & (1 << _index) != 0
static func enable_bitmask_inx(_bitmask: int, _index: int) -> int:
return _bitmask | (1 << _index)
static func disable_bitmask_inx(_bitmask: int, _index: int) -> int:
return _bitmask & ~(1 << _index)
using Godot;
public partial class MyNode3D : Node3D
{
private Rid _map;
private Vector3 _startPosition;
private Vector3 _targetPosition;
private void ChangeLayers()
{
NavigationRegion3D region = GetNode<NavigationRegion3D>("NavigationRegion3D");
// Enables the 4th layer for this region.
region.NavigationLayers = EnableBitmaskInx(region.NavigationLayers, 4);
// Disables the 1st layer for this region.
region.NavigationLayers = DisableBitmaskInx(region.NavigationLayers, 1);
NavigationAgent3D agent = GetNode<NavigationAgent3D>("NavigationAgent2D");
// Make future path queries of this agent ignore regions with the 4th layer.
agent.NavigationLayers = DisableBitmaskInx(agent.NavigationLayers, 4);
uint pathQueryNavigationLayers = 0;
pathQueryNavigationLayers = EnableBitmaskInx(pathQueryNavigationLayers, 2);
// Get a path that only considers 2nd layer regions.
Vector3[] path = NavigationServer3D.MapGetPath(
_map,
_startPosition,
_targetPosition,
true,
pathQueryNavigationLayers
);
}
private static bool IsBitmaskInxEnabled(uint bitmask, int index)
{
return (bitmask & (1 << index)) != 0;
}
private static uint EnableBitmaskInx(uint bitmask, int index)
{
return bitmask | (1u << index);
}
private static uint DisableBitmaskInx(uint bitmask, int index)
{
return bitmask & ~(1u << index);
}
}
Зміна навігаційних шарів для запитів шляхів є дружньою альтернативою ввімкненню/вимкненню цілих навігаційних областей. Порівняно зі змінами регіону, запит шляху навігації з різними шарами навігації не запускає масштабні оновлення на NavigationServer.
Зміна шарів навігації вузлів NavigationAgent матиме негайний вплив на наступний запит шляху. Зміна шарів навігації регіонів матиме ефект після наступної синхронізації NavigationServer.