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.

내비게이션 보이기

내비게이션 보이기

탐색 경로는 NavigationServer에서 직접 쿼리할 수 있으며 탐색 지도에 작업할 탐색 메시가 있는 한 추가 노드 또는 개체가 필요하지 않습니다.

2D 경로를 얻으려면 ``NavigationServer2D.map_get_path(map, from, to, optimize, navigation_layers)``를 사용하십시오.

3D 경로를 얻으려면 ``NavigationServer3D.map_get_path(map, from, to, optimize, navigation_layers)``를 사용하십시오.

추가 설정이 필요한 사용자 정의 가능한 탐색 경로 쿼리에 대해서는 :ref:`doc_navigation_using_navigationpathqueryobjects`를 참조하세요.

쿼리에 필요한 매개 변수 중 하나는 탐색 지도의 RID입니다. 각 게임 세계에는 자동으로 생성된 기본 탐색 지도가 있습니다. 기본 내비게이션 맵은 노드를 상속하는 Node2D에서 ``get_world_2d().get_navigation_map()``를 사용하여 검색하거나 노드를 상속하는 Node3D에서 ``get_world_3d().get_navigation_map()``를 사용하여 검색할 수 있습니다. 두 번째와 세 번째 매개변수는 시작 위치와 목표 위치로 2D의 경우 Vector2, 3D의 경우 Vector3입니다.

optimized 매개변수가 ``true``인 경우 경로 위치는 추가 깔때기 알고리즘 패스를 통해 다각형 모서리를 따라 단축됩니다. 이는 경로가 A* 알고리즘에서 찾은 다각형 복도를 따라 모서리 주위를 감싸기 때문에 크기가 다른 다각형이 있는 탐색 메시의 자유로운 움직임에 적합합니다. 작은 셀의 경우 A* 알고리즘은 그리드와 함께 사용할 때 보기 흉한 모퉁이 경로를 생성할 수 있는 매우 좁은 깔때기 통로를 생성합니다.

optimized 매개변수가 ``false``인 경우 경로 위치는 각 다각형 가장자리의 중심에 배치됩니다. 이는 경로가 그리드 셀의 중심을 통과하므로 동일한 크기의 다각형을 가진 내비게이션 메시의 순수 그리드 이동에 적합합니다. 하나의 긴 가장자리로 넓은 개방 영역을 덮는 폴리곤으로 인해 그리드 외부에서는 불필요하게 긴 우회 경로가 생성될 수 있습니다.

extends Node2D

# Basic query for a navigation path using the default navigation map.

func get_navigation_path(p_start_position: Vector2, p_target_position: Vector2) -> PackedVector2Array:
    if not is_inside_tree():
        return PackedVector2Array()

    var default_map_rid: RID = get_world_2d().get_navigation_map()
    var path: PackedVector2Array = NavigationServer2D.map_get_path(
        default_map_rid,
        p_start_position,
        p_target_position,
        true
    )
    return path

NavigationServer에서 반환된 path``는 2D의 경우 ``PackedVector2Array``이고 3D의 경우 ``PackedVector3Array``입니다. 이는 단지 메모리 최적화된 벡터 위치의 ``Array``입니다. 배열 내부의 모든 위치 벡터는 NavigationPolygon 또는 NavigationMesh 내부에 있음이 보장됩니다. 경로 배열은 비어 있지 않은 경우 번째 인덱스 ``path[0] 위치의 시작 위치에 가장 가까운 탐색 메시 위치를 갖습니다. 대상 위치에 가장 가까운 사용 가능한 탐색 메시 위치는 마지막 인덱스 path[path.size()-1] 위치입니다. 사이의 모든 인덱스는 액터가 내비게이션 메시를 떠나지 않고 대상에 도달하기 위해 따라야 하는 경로 지점입니다.

참고

대상 위치가 병합되거나 연결되지 않은 다른 탐색 메시에 있는 경우 탐색 경로는 시작 위치 탐색 메시에서 가능한 가장 가까운 위치로 연결됩니다.

다음 스크립트는 ``set_movement_target()``로 대상 위치를 설정하여 기본 탐색 지도를 사용하여 탐색 경로를 따라 노드를 상속하는 Node3D를 이동합니다.

@onready var default_3d_map_rid: RID = get_world_3d().get_navigation_map()

var movement_speed: float = 4.0
var movement_delta: float
var path_point_margin: float = 0.5

var current_path_index: int = 0
var current_path_point: Vector3
var current_path: PackedVector3Array

func set_movement_target(target_position: Vector3):

    var start_position: Vector3 = global_transform.origin

    current_path = NavigationServer3D.map_get_path(
        default_3d_map_rid,
        start_position,
        target_position,
        true
    )

    if not current_path.is_empty():
        current_path_index = 0
        current_path_point = current_path[0]

func _physics_process(delta):

    if current_path.is_empty():
        return

    movement_delta = movement_speed * delta

    if global_transform.origin.distance_to(current_path_point) <= path_point_margin:
        current_path_index += 1
        if current_path_index >= current_path.size():
            current_path = []
            current_path_index = 0
            current_path_point = global_transform.origin
            return

    current_path_point = current_path[current_path_index]

    var new_velocity: Vector3 = global_transform.origin.direction_to(current_path_point) * movement_delta

    global_transform.origin = global_transform.origin.move_toward(global_transform.origin + new_velocity, movement_delta)