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.

Usando NavigationLayers

NavigationLayers são um recurso opcional para controlar ainda mais quais malhas de navegação são consideradas em uma consulta de caminho. Elas funcionam de forma semelhante a como as camadas de física controlam a colisão entre objetos de colisão ou como as camadas visuais controlam o que é renderizado na Viewport.

As NavigationLayers podem ser nomeadas nas ProjectSettings da mesma forma que as camadas de física ou camadas visuais.

../../_images/navigationlayers_naming.png

Se uma região não tiver uma única camada de navegação compatível com o parâmetro navigation_layers de uma consulta de caminho, a malha de navegação dessa região será ignorada na busca de caminhos. Consulte Usando NavigationPaths para obter mais informações sobre como consultar o NavigationServer para caminhos.

NavigationLayers são um único valor int usado como uma máscara de bits (bitmask). Muitos nós relacionados à navegação possuem funções set_navigation_layer_value() e get_navigation_layer_value() para definir e obter um número de camada diretamente, sem a necessidade de operações bit a bit mais complexas.

Nos scripts, as seguintes funções auxiliares podem ser usadas para trabalhar com a máscara de bits 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)

Alterar as camadas de navegação para consultas de caminho é uma alternativa que economiza desempenho em relação a ativar/desativar regiões de navegação inteiras. Em comparação com as alterações de região, uma consulta de caminho de navegação com diferentes camadas de navegação não aciona atualizações em grande escala no NavigationServer.

Alterar as camadas de navegação dos nós NavigationAgent terá um efeito imediato na próxima consulta de caminho. Alterar as camadas de navegação das regiões terá efeito após a próxima sincronização do NavigationServer.