此页面介绍如何在游戏中创建、更新和销毁 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;
}