統合フェーズ 3: NavData をロードおよびアンロードする

ここまでで地形の NavData をいくつか作成しました。対応する地形をゲーム内にロードするときに NavData を Database にロードする場合、および必要でなくなったときに NavData を Database から削除する場合には、いくつかのコードを追加する必要があります。

Database に NavData を追加するには、次の手順を行う必要があります。

  1. .NavData ファイルのデータをメモリに読み込みます。このサンプルでは、Gameware Navigation の SDK で提供されるデフォルトのファイル オープナー オブジェクトを使用します。
  2. NavData クラスのインスタンスを作成し、データへのポインタを設定します。
  3. NavData::AddToDatabaseImmediate() メソッドまたは NavData::AddToDatabaseAsync() メソッドを呼び出して、DatabaseNavData オブジェクトを提供します。

このチュートリアルの後半で、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 を接続します。

NavMesh は Navigation Lab の 3D ビューにすぐには表示されません。これは正常です。ネットワーク間で大量のデータが送信される可能性を避けるため、NavData はゲームからビジュアル デバッガへは送信されません。しかし、ゲームから送信されたデバッグ データを同じ状況でデバッグする為にNavData とジオメトリをロードすると非常に役立ちます。

したがって、Navigation Lab ではゲームにロードされた NavData ファイルを格納するパスを指定するよう求めるプロンプトが表示されます。

NavData が正しくゲーム内にロードされていることを確認するには、Profiling パネルを開きます。Summary グループ内の NavData count の値が 0 より大きいはずです。上のコード サンプルに示すように DefaultFileLoader を使用して NavData をメモリにロードした場合は、Memory Footprint の値にデータのサイズも含まれます。

その他にも、ゲームやエディタの NavData をレンダリングして、NavData が正しくロードされているかどうかをテストすることができます。詳細は、「NavData をレンダリングする」を参照してください。