NavArea, NavigationQueryFilter和NavModifierVolume

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。


4 在命令AI行动的时候,使用Filter。另外,在AIController中也可以设置默认的filter


在下图中,AI将沿着路径2前进,而不是一般的路径1


  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值