Використання NavigationPath QueryObjects
NavigationPathQueryObjects можна використовувати разом з NavigationServer.query_path() для отримання сильно спеціалізованого шляху навігації, включаючи додаткові метадані про шлях.
Це вимагає додаткових налаштувань порівняно з отриманням звичайного NavigationPath, але дозволяє адаптувати пошук шляху та надані дані шляху до різних потреб проекту.
NavigationPathQueryObjects складається з пари об’єктів, об’єкта NavigationPathQueryParameters, що містить параметри налаштування для запиту, і NavigationPathQueryResult, який отримує (регулярні) оновлення з кінцевим шляхом і метаданими із запиту.
2D і 3D версії NavigationPathQueryParameters доступні як NavigationPathQueryParameters2D і NavigationPathQueryParameters3D відповідно.
2D і 3D версії NavigationPathQueryResult доступні як NavigationPathQueryResult2D і NavigationPathQueryResult3D відповідно.
Обидва параметри та результат використовуються як пара з функцією NavigationServer.query_path().
Доступні параметри налаштування та їх використання дивіться в документації класу параметрів.
Хоча це не сувора вимога, обидва об’єкти створюються один раз заздалегідь, зберігаються в постійній змінній для агента та повторно використовуються для кожного запиту наступного шляху з оновленими параметрами. Це повторне використання дозволяє уникнути наслідків для продуктивності через часте створення об’єктів, якщо в проекті є велика кількість одночасних агентів, які регулярно оновлюють свої шляхи.
# Prepare query objects.
var query_parameters := NavigationPathQueryParameters2D.new()
var query_result := NavigationPathQueryResult2D.new()
func query_path(p_start_position: Vector2, p_target_position: Vector2, p_navigation_layers: int = 1) -> PackedVector2Array:
if not is_inside_tree():
return PackedVector2Array()
query_parameters.map = get_world_2d().get_navigation_map()
query_parameters.start_position = p_start_position
query_parameters.target_position = p_target_position
query_parameters.navigation_layers = p_navigation_layers
NavigationServer2D.query_path(query_parameters, query_result)
var path: PackedVector2Array = query_result.get_path()
return path
# Prepare query objects.
var query_parameters := NavigationPathQueryParameters3D.new()
var query_result := NavigationPathQueryResult3D.new()
func query_path(p_start_position: Vector3, p_target_position: Vector3, p_navigation_layers: int = 1) -> PackedVector3Array:
if not is_inside_tree():
return PackedVector3Array()
query_parameters.map = get_world_3d().get_navigation_map()
query_parameters.start_position = p_start_position
query_parameters.target_position = p_target_position
query_parameters.navigation_layers = p_navigation_layers
NavigationServer3D.query_path(query_parameters, query_result)
var path: PackedVector3Array = query_result.get_path()
return path