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.

Verwenden von NavigationLayers

Navigationsebenen sind eine optionale Funktion, mit der Sie weiter steuern können, welche Navigationsnetze bei einer Pfadabfrage berücksichtigt werden. Sie funktionieren ähnlich wie Physikebenen die Kollision zwischen Kollisionsobjekten steuern oder visuelle Ebenen steuern, was im Ansichtsfenster gerendert wird.

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

../../_images/navigationlayers_naming.png

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

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.

Das Ändern der Navigationsebenen von NavigationAgent-Knoten wirkt sich unmittelbar auf die nächste Pfadabfrage aus. Das Ändern der Navigationsebenen von Regionen wirkt sich nach der nächsten NavigationServer-Synchronisierung aus.