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

NavigationLayers є додатковою функцією для подальшого контролю того, які сітки навігації розглядаються в запиті шляху. Вони працюють подібно до того, як фізичні шари контролюють зіткнення між об’єктами зіткнення або як візуальні шари контролюють те, що відображається у вікні перегляду.

NavigationLayers можна назвати в ProjectSettings так само, як фізичні або візуальні шари.

../../_images/navigationlayers_naming.png

Якщо в регіоні немає жодного сумісного навігаційного шару з параметром navigation_layers запиту шляху, ця навігаційна сітка регіонів буде пропущена під час пошуку шляху. Перегляньте Використання NavigationPaths для отримання додаткової інформації щодо запиту шляхів до NavigationServer.

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.