NavArea:导航区域,配合NavModifierVolume使用,修改导航网格的路径费用。
NavigationQueryFilter:实现对导航区域的过滤或者费用重写。
通过NavArea, NavigationQueryFilter和NavModifierVolume,可以实现AI对不同路径的选择效果。方法如下:
1 创建NavArea,设置DefaultCost,默认值为1。数值越大,路径费用越高,AI选择的概率越低。
2 创建NavigationQueryFilter,在Area中添加NavArea,可以在此处重写导航费用。
默认情况下,Travel Cost Override不能小于1,原因在于
void UNavigationQueryFilter::InitializeFilter(const ANavigationData& NavData, const UObject* Querier, FNavigationQueryFilter& Filter) const
{
// apply overrides
for (int32 i = 0; i < Areas.Num(); i++)
{
const FNavigationFilterArea& AreaData = Areas[i];
const int32 AreaId = NavData.GetAreaID(AreaData.AreaClass);
if (AreaId == INDEX_NONE)
{
continue;
}
if (AreaData.bIsExcluded)
{
Filter.SetExcludedArea(AreaId);
}
else
{
if (AreaData.bOverrideTravelCost)
{
Filter.SetAreaCost(AreaId, FMath::Max(1.0f, AreaData.TravelCostOverride));
}
if (AreaData.bOverrideEnteringCost)
{
Filter.SetFixedAreaEnteringCost(AreaId, FMath::Max(0.0f, AreaData.EnteringCostOverride));
}
}
}
// apply flags
Filter.SetIncludeFlags(IncludeFlags.Packed);
Filter.SetExcludeFlags(ExcludeFlags.Packed);
}
解决办法是将Filter.SetAreaCost(AreaId, FMath::Max(1.0f, AreaData.TravelCostOverride))重写。
3 布置NavModifierVolume,并将AreaClass选择为我们的NavArea。
在下图中,AI将沿着路径2前进,而不是一般的路径1