Description

USplineNavModifierComponent was made available in UE 5.4. It generates several FAreaNavModifier instances covering a region with a certain thickness around a USplineComponent, and worked correctly up to UE 5.5. However, starting with UE 5.6 and up to mainline latest, any aggregate component-to-world transform applied to the USplineComponent gets applied to the FAreaNavModifiers twice. As a result, the region affected by the USplineNavModifierComponent ends up severely mismatched with the spline. Moreover, that incorrectly-transformed region is clipped by the correctly-calculated spline bounds.

This regression was likely a result of the large changes introduced by CL 40202922, combined with a prior non-exposed bug. On file [Engine\Source\Runtime\NavigationSystem\Private\SplineNavModifierComponent.cpp], method USplineNavModifierComponent::GetNavigationData() calculates some "tube" points using helper function SubdivideSpline(), which uses USplineComponent::GetSplinePointAt(Index, ESplineCoordinateSpace::World) to get points in world space. Then, these world-space "tube" points are used to create an FAreaNavModifier, but Spline->GetComponentTransform() is also passed to FAreaNavModifier's constructor, resulting in the component-to-world transform being applied a second time.

This worked before CL 40202922 because USplineComponent::GetSplinePointAt() completely ignored the requested coordinate space. Now that it is being correctly considered, one suggested fix is to call that function passing ESplineCoordinateSpace::Local and letting FAreaNavModifier's constructor apply the component transform only once. Alternatively, FAreaNavModifier's constructor could be passed FTransform::Identity instead.

 

Steps to Reproduce

1. Create a new map based on the "Basic" template
2. Place a NavMeshBoundsVolume actor at (0,0,0) with scale (50,50,10) to cover the whole floor
2.1. If necessary, press "P" to view the green NavMesh covering the floor
3. Create and edit a new Blueprint "BP_NavSpline" derived from Actor
3.1. Add a Spline component
3.2. Add a SplineNavModifier component
3.3. In the details panel for the SplineNavModifier, set "Component Name" to "Spline"
4. Place an instance of "BP_NavSpline" at (0,0,0) and select it
4.1. Create any spline shape by alt+dragging the control points in the Level Editor Viewport
4.2. Note that the NavMesh correctly considers an area around the spline as NavArea_Null
5. Select "BP_NavSpline", then translate and rotate it using the viewport widgets
5.1. Note that the area considered as NavArea_Null is transformed incorrectly (double the expected), becoming mismatched with the spline
5.2. Note that the area considered as NavArea_Null is clipped when further away from the world origin (because the NavMesh region that gets updated is based on the correctly-transformed spline bounds)

Have Comments or More Details?

There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-313874 in the post.

0
Login to Vote

Unresolved
ComponentUE - AI - Navigation
Affects Versions5.65.7
CreatedAug 15, 2025
UpdatedSep 11, 2025
View Jira Issue