设置 TagVolume

此页面介绍如何在游戏中创建、更新和销毁 TagVolume

有关障碍物管理系统中 TagVolume 类的作用的介绍,请参见使用动态障碍物和 TagVolume

有关 NavTag 系统的背景信息,请参见使用自定义数据进行标记

游戏端类

您需要在游戏中创建一个用于管理初始化和销毁 TagVolume 的类。您的游戏中可能已经有一个类在管理 TagVolume 计划在 Gameware Navigation 世界中表示的对象或玩家角色的寿命。如果是这样,则可以使用该类。

例如:[Tutorial_ObstacleIntegration.cpp 中的代码]

class MyGameTagVolume
{
public:
    MyGameTagVolume(): m_navTagVolume(KY_NULL) {}

    void Initialize(Kaim::World* world);
    void Destroy();

    Kaim::Ptr<Kaim::TagVolume> m_navTagVolume;
    // We will keep the InitConfig too. This is not necessary, but it is convenient in case
    // we want to re-create the TagVolume with slightly different settings.
    Kaim::TagVolumeInitConfig m_navTagVolumeInitConfig;
};

初始化

要初始化 TagVolume,必须提供 TagVolumeInitConfig 配置类的实例,该实例是使用 TagVolume 所需的数据设置的。您必须以最小值设置:

例如:[Tutorial_ObstacleIntegration.cpp 中的代码]

void MyGameTagVolume::Initialize(Kaim::World* world)
{
    // Set up the TagVolumeInitConfig
    m_navTagVolumeInitConfig.m_world = world;
    m_navTagVolumeInitConfig.m_altitudeMin = 10.0f;
    m_navTagVolumeInitConfig.m_altitudeMax = 11.0f;
    m_navTagVolumeInitConfig.m_points.PushBack(Kaim::Vec2f(-19.0967f, 7.93156f));
    m_navTagVolumeInitConfig.m_points.PushBack(Kaim::Vec2f(-15.3928f, 4.77404f));
    m_navTagVolumeInitConfig.m_points.PushBack(Kaim::Vec2f(-11.9082f, 9.46633f));
    m_navTagVolumeInitConfig.m_points.PushBack(Kaim::Vec2f(-14.6730f, 16.2140f));
    m_navTagVolumeInitConfig.m_points.PushBack(Kaim::Vec2f(-14.5526f, 10.8631f));
    m_navTagVolumeInitConfig.m_points.PushBack(Kaim::Vec2f(-18.5613f, 10.9361f));
    // This sets the NavTag as non-walkable: it will "cut a hole" in the NavMesh
    m_navTagVolumeInitConfig.m_navTag.SetAsExclusive();
    m_navTagVolumeInitConfig.m_navTag.m_blindDataArray.PushBack(0);

    // Create and initialize the TagVolume, and add it to the World
    m_navTagVolume = *KY_NEW Kaim::TagVolume;
    m_navTagVolume->Init(m_navTagVolumeInitConfig);
    m_navTagVolume->AddToWorld();
}

更新

TagVolume 类不打算进行更新。使用给定的轮廓和 NavTag 值创建后,它必须保持不变,直到销毁。

如果您需要 TagVolume 表示移动或修改分区(例如洪水在地面上缓慢流动),应当销毁 TagVolume,然后使用新尺寸重新创建。但是,由于涉及将体积合并到 NavMesh 的计算不太常用,因此您不应在每一帧或每隔几帧执行此操作。而是考虑在代码中设置距离阈值,并接受障碍物表示中小于阈值的些许误差。

销毁

销毁 TagVolume

例如:[Tutorial_ObstacleIntegration.cpp 中的代码]

void MyGameTagVolume::Destroy()
{
    m_navTagVolume->RemoveFromWorld();
    m_navTagVolume = KY_NULL;
}