既然您的地形具有一些 NavData,您需要在游戏中加载相应地形时添加一些代码以将 NavData 加载到数据库,并在不再需要时将其从数据库中移除。
在本教程的后面,当您将 NavData 生成集成到关卡设计工具时,可以改为将 NavData 集成到用于其他资源的相同数据加载管线,并使用 NavData::LoadFromMemory() 从加载 NavData 的内存位置设置 NavData 实例。请参见集成阶段 6:使用 NavData 生成 API。
[Tutorial_FirstIntegration.cpp 中的代码]
#include "gwnavruntime/navdata/navdata.h" #include "gwnavruntime/kernel/SF_File.h" #include "gwnavruntime/base/fileopener.h" ... class MyGameLevel { public: ... bool Initialize(Kaim::World* world); ... void Destroy(); ... protected: Kaim::Ptr<Kaim::NavData> m_navData; ... }; bool MyGameLevel::Initialize(Kaim::World* world) { Kaim::Ptr<Kaim::File> kaimFile; Kaim::DefaultFileOpener fileOpener; // Open the NavData file. const std::string navdataFilePath = TestSystem::Instance().InputDir() + "GeneratedNavData/opencastle/opencastle.NavData"; kaimFile = fileOpener.OpenFile(navdataFilePath.c_str(), Kaim::OpenMode_Read); if(kaimFile == KY_NULL) return false; // Instantiate and load the NavData from the file contents. m_navData = *KY_NEW Kaim::NavData; KyResult loadingResult = KY_ERROR; loadingResult = m_navData->Load(kaimFile); // Close the NavData file. kaimFile ->Close(); kaimFile = KY_NULL; // Check that the NavData have been correctly loaded. if (KY_FAILED(loadingResult)) return false; // Add the NavData to the Database. // AddToDatabaseImmediate() forces the new NavData to be added and // stitched immediately in the current frame. In your final game, you // will probably want to use AddToDatabaseAsync(), which time-slices // the addition of the new data over multiple frames to avoid CPU peaks. m_navData->Init(world->GetDatabase(0)); m_navData->AddToDatabaseImmediate(); ... return true; } ... void MyGameLevel::Destroy() { ... m_navData->RemoveFromDatabaseImmediate(); m_navData = KY_NULL; ... } class MyGameWorld { ... protected: ... MyGameLevel m_gameLevel; ... }; bool MyGameWorld::Initialize() { ... return m_gameLevel.Initialize(m_world); } ... void MyGameWorld::Destroy() { m_gameLevel.Destroy(); ... }
您不会立即在 Navigation Lab 的 3D 视图中看到 NavMesh。这很正常;为了避免在网络中发送数量可能很大的数据,不会将 NavData 从游戏发送到可视调试器。但是,这可能对在调试时加载 NavData 和几何体很有帮助,方便在上下文中查看从游戏中发送的调试数据。
因此,Navigation Lab 会提示您提供包含加载到游戏中的 NavData 文件的路径:
若要验证 NavData 是否已正确加载到游戏中,请打开 Profiling 面板。在 Summary 组中,NavData count 值必须大于 0。如果是使用 DefaultFileLoader 将 NavData 加载到内存中的(如以上代码示例中所示),Memory Footprint 值也将包含您数据的大小。
或者,可以渲染游戏或编辑器中的 NavData 来测试 NavData 是否正确加载。请参见渲染 NavData。