在本集成阶段中,您将学习如何使用查询来计算地形中两点之间的路径。这是对工具箱层提供的查询的简介。
我们首先看一下如何在 Navigation Lab 中执行查询。
将 Start 和 Dest 控件分别设置为 PosA 和 PosB。这将告诉查询,您想要计算从位置 A 标记到位置 B 标记的路径。
请注意,您可以在 Navigation Lab 中轻松检索查询的起始点和结束点。在主窗口的底部,Navigation Lab 列出 3D 空间中 A 标记和 B 标记的位置(以 Navigation 坐标系形式表示)。单击 Copy 按钮可将这些值复制到剪贴板。
现在,我们将尝试使用 AstarQuery 类的实例在运行时复制您游戏中的相同查询。
[Tutorial_FirstIntegration.cpp 中的代码]
#include "gwnavruntime/queries/astarquery.h" ... class MyGameLevel { public: ... void Update(float deltaTimeInSeconds); ... void TestAStarQuery(Kaim::World* world); ... protected: ... Kaim::Ptr<Kaim::AStarQuery<Kaim::DefaultTraverseLogic> > m_astarQuery; // Not used for the entity, but simply to demonstrate how to run a query ... }; ... bool MyGameLevel::Initialize(Kaim::World* world) { ... m_astarQuery = *KY_NEW Kaim::AStarQuery<Kaim::DefaultTraverseLogic>; m_astarQuery->BindToDatabase(world->GetDatabase(0)); ... } ... void MyGameLevel::TestAStarQuery(Kaim::World* world) { // Choose two positions (in Navigation space) you want to test. // You can use the Navigation Lab to choose them. Kaim::Vec3f startPos = Kaim::Vec3f(-11.5963f,1.06987f,10.4563f); Kaim::Vec3f destPos = Kaim::Vec3f(-16.636f,-26.7078f,8.10107f); // Leverage the visual debugging system. Kaim::ScopedDisplayList displayList(world, Kaim::DisplayList_Enable); displayList.InitSingleFrameLifespan("Test AStar Query", "My Game"); displayList.PushLine(startPos, startPos + Kaim::Vec3f::UnitZ(), Kaim::VisualColor::Blue); displayList.PushLine(destPos, destPos + Kaim::Vec3f::UnitZ(), Kaim::VisualColor::Blue); if(m_astarQuery->m_processStatus == Kaim::QueryNotStarted) { // Each AstarQuery must be set up to run on a specific Database. m_astarQuery->Initialize(startPos, destPos); // Blocking means that we want the result immediately. // Alternatively, a query can be asynchronous and time-sliced. m_astarQuery->PerformQueryBlocking(); } else if (m_astarQuery->m_processStatus == Kaim::QueryDone) { // When the query is done, we ask for the result. Kaim::AStarQueryResult result = m_astarQuery->GetResult(); // Kaim::AStarQueryResult enumerates many possible query results. // For now, let's focus on success. switch( result ) { case Kaim::ASTAR_DONE_PATH_FOUND: { displayList.PushText(destPos + Kaim::Vec3f::UnitZ(), Kaim::VisualColor(0, 255, 0), "AStar query success !"); break; } default: displayList.PushLine(startPos, destPos , Kaim::VisualColor::Red); displayList.PushText(destPos + Kaim::Vec3f::UnitZ(), Kaim::VisualColor(255, 0, 0), "AStar query failed !"); break; } // Here, we build and send a query, so it can be displayed into the NavigationLab. // cf. IQuery::SendVisualDebug() for more details. m_astarQuery->SendVisualDebug(); } } ... void MyGameLevel::Update(float deltaTimeInSeconds) { ... TestAStarQuery(m_entity.m_navBot->GetWorld()); ... } ... void MyGameWorld::Update(float deltaTimeInSeconds) { ... m_world->Update(deltaTimeInSeconds); m_gameLevel.Update(deltaTimeInSeconds); }
当您连接到游戏时,现在应该看到在 3D 视图中绘制的由查询计算的路径。假设您的 NavMesh 相同,并且使用的 A 标记和 B 标记的位置也相同,则生成的路径应该与您第一次在 Navigation Lab 内运行查询所显示的路径相同: