コード例 #1
0
void ANavModifierVolume::GetNavigationData(FNavigationRelevantData& Data) const
{
	if (Brush && AreaClass && AreaClass != UNavigationSystem::GetDefaultWalkableArea())
	{
		FAreaNavModifier AreaMod(GetBrushComponent(), AreaClass);
		Data.Modifiers.Add(AreaMod);
	}
}
コード例 #2
-1
void UNavCollision::GetNavigationModifier(FCompositeNavModifier& Modifier, const FTransform& LocalToWorld)
{
	QUICK_SCOPE_CYCLE_COUNTER(STAT_NavCollision_GetNavigationModifier);

	const TSubclassOf<UNavArea> UseAreaClass = AreaClass ? AreaClass : UNavigationSystem::GetDefaultObstacleArea();

	Modifier.ReserveForAdditionalAreas(CylinderCollision.Num() + BoxCollision.Num()
		+ (ConvexCollision.VertexBuffer.Num() > 0 ? ConvexShapeIndices.Num() : 0));

	for (int32 i = 0; i < CylinderCollision.Num(); i++)
	{
		FTransform CylinderToWorld = LocalToWorld;
		const FVector Origin = CylinderToWorld.TransformPosition(CylinderCollision[i].Offset);
		CylinderToWorld.SetTranslation(Origin);

		FAreaNavModifier AreaMod(CylinderCollision[i].Radius, CylinderCollision[i].Height, CylinderToWorld, UseAreaClass);
		AreaMod.SetIncludeAgentHeight(true);
		Modifier.Add(AreaMod);
	}

	for (int32 i = 0; i < BoxCollision.Num(); i++)
	{
		FTransform BoxToWorld = LocalToWorld;
		const FVector Origin = BoxToWorld.TransformPosition(BoxCollision[i].Offset);
		BoxToWorld.SetTranslation(Origin);

		FAreaNavModifier AreaMod(BoxCollision[i].Extent, BoxToWorld, UseAreaClass);
		AreaMod.SetIncludeAgentHeight(true);
		Modifier.Add(AreaMod);
	}

	if (ShouldUseConvexCollision())
	{
		// rebuild collision data if needed
		if (!bHasConvexGeometry)
		{
			GatherCollision();
		}

		if (ConvexCollision.VertexBuffer.Num() > 0)
		{
			int32 LastVertIndex = 0;
			TArray<FVector> Verts(ConvexCollision.VertexBuffer);

			for (int32 i = 0; i < ConvexShapeIndices.Num(); i++)
			{
				int32 FirstVertIndex = LastVertIndex;
				LastVertIndex = ConvexShapeIndices.IsValidIndex(i + 1) ? ConvexShapeIndices[i + 1] : ConvexCollision.VertexBuffer.Num();

				FAreaNavModifier AreaMod(Verts, FirstVertIndex, LastVertIndex, ENavigationCoordSystem::Unreal, LocalToWorld, UseAreaClass);
				AreaMod.SetIncludeAgentHeight(true);
				Modifier.Add(AreaMod);
			}
		}
	}
}