Использование NavigationLayers

NavigationLayers — это дополнительная функция для дальнейшего управления тем, какие навигационные сетки учитываются в запросе пути. Они работают аналогично тому, как физические слои управляют столкновениями между объектами столкновения или как визуальные слои управляют тем, что отображается в Окне просмотра.

NavigationLayers можно именовать в ProjectSettings так же, как физические слои или визуальные слои.

../../_images/navigationlayers_naming.png

Если в регионе нет ни одного совместимого навигационного слоя с параметром navigation_layers запроса пути, навигационная сетка этого региона будет пропущена при поиске пути. Подробнее о запросе путей к NavigationServer см. в документе Использование NavigationPaths.

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)

Изменение слоёв навигации для запросов пути — это более производительная альтернатива включению/отключению целых регионов навигации. В отличие от изменения регионов, запрос пути навигации с различными слоями навигации не приводит к масштабным обновлениям на NavigationServer.

Изменение навигационных слоёв узлов NavigationAgent немедленно вступит в силу при следующем запросе пути. Изменение навигационных слоёв регионов вступит в силу после следующей синхронизации NavigationServer.