이제 지세에 몇몇 NavData가 있으므로 이러한 NavData를 게임에서 해당 지세를 로드할 때 Database로 로드하고, 더 이상 필요하지 않을 때 Database에서 제거하는 몇 가지 코드를 추가해야 합니다.
NavData를 Database에 추가하려면 다음을 수행해야 합니다.
이 자습서의 후반에서 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 렌더링을(를) 참조하십시오.