Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Verwenden von NavigationLayers

NavigationLayers sind ein optionales Feature, um detaillierter zu steuern, welche Navigations-Meshes in einer Pfadabfrage berücksichtigt werden und welche Regionen verbunden werden können. Sie funktionieren ähnlich wie Physikebenen zur Steuerung der Kollision zwischen Kollisionsobjekten oder wie visuelle Ebenen zum Steuern dessen, was im Viewport gerendert wird.

NavigationLayers können in den Projekteinstellungen genauso benannt werden wie Physikebenen oder visuelle Ebenen.

../../_images/navigationlayers_naming.png

Wenn zwei Regionen nicht über eine einzige kompatible Ebene verfügen, werden sie vom NavigationServer nicht zusammengeführt. Siehe Verbinden von Navigations-Meshes für weitere Informationen zum Zusammenführen von Navigations-Meshes.

Wenn eine Region nicht einen einzigen kompatiblen Navigationslayer mit dem Parameter navigation_layers einer Pfadabfrage hat, wird diese Region bei der Wegfindung übersprungen. Siehe Verwenden von NavigationPaths für weitere Informationen zur Abfrage des NavigationServers nach Pfaden.

NavigationLayers sind ein einzelner int-Wert, der als Bitmaske verwendet wird. Viele navigationsbezogene Nodes haben set_navigation_layer_value() und get_navigation_layer_value()-Funktionen, um eine Ebenennummer direkt zu setzen und zu ermitteln, ohne komplexere bitweise Operationen durchführen zu müssen.

In Skripten können die folgenden Hilfsfunktionen verwendet werden, um mit der Bitmaske navigation_layers zu arbeiten.

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: PoolVector3Array = 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)

Das Ändern von Navigationsebenen für Pfadabfragen ist eine Performance-freundliche Alternative zum Aktivieren/Deaktivieren ganzer Navigationsregionen. Im Vergleich zu Regionsänderungen löst eine Pfadabfrage mit verschiedenen Navigationsebenen keine großen Updates auf dem NavigationServer aus.

Eine Änderung der Navigationsebenen von NavigationAgent-Nodes wirkt sich sofort auf die nächste Pfadabfrage aus. Eine Änderung der Navigationsebenen von Regionen wirkt sich unmittelbar auf die Region aus, aber jede neue Verbindung oder Trennung einer Region wird erst nach dem nächsten Physik-Frame wirksam.