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.

顯示導覽

導航圖層是一個可選功能,用於進一步控制在路徑查詢時會考慮哪些導航網格。其運作方式類似於物理圖層如何控制碰撞物件間的碰撞,或是視覺圖層如何決定哪些內容會在檢視區中顯示。

NavigationLayers 可以在「ProjectSettings」中命名,與PhysicsLayers 或VisualLayers 相同。

../../_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)

更改路徑查詢的導覽層是啟用/停用整個導覽區域的一種效能友善的替代方案。與區域變更相比,具有不同導覽層的導覽路徑查詢不會觸發導覽伺服器上的大規模更新。

變更NavigationAgent節點的導覽層將立即影響下一次路徑查詢。更改區域的導覽層將立即對該區域產生影響,但任何新區域連接或斷開連接只會在下一個實體訊框之後生效。