Summary
We have two streaming sublevels, A and B:
Sublevel A contains a body of water.
Sublevel B contains a bridge built from a HierarchicalInstancedStaticMeshComponent. The bridge reaches across sublevel B’s boundary and sits on top of the water in sublevel A, so the two sublevels overlap there.
The navmesh uses Dynamic runtime generation with navigation invokers.
When the player moves far enough away, sublevel B (with the bridge) is unloaded while sublevel A (with the water) stays loaded. The navmesh tiles over the water are rebuilt without the bridge, which is correct.
When the player comes back and sublevel B is loaded again, the tiles where the bridge overlaps the water should be rebuilt with the bridge geometry. They are not.
Root cause we found:
Since 5.6, components are no longer added to the navigation octree in each component’s OnRegister. As an optimization, this now happens in OnActorRegistered, after all of the actor’s components are registered.
UInstancedStaticMeshComponent::OnRegister still requests a navigation rebuild for its instances (dirty area) during its own OnRegister. At that point the component isn’t in the navigation octree yet, so the request is ignored.
Regular StaticMeshComponents aren’t affected because adding them to the octree dirties their whole bounds. ISM/HISM components rely only on that earlier request, so nothing is ever rebuilt for them.
Our workaround (engine change): in OnActorRegistered, after the component is added to the navigation octree, re-issue the dirty-area / rebuild request for any ISM component whose earlier request was dropped. This fixes the issue on our side.
What Type of Bug are you experiencing?
AI
Steps to Reproduce
Set up a navmesh with Runtime Generation = Dynamic and use navigation invokers on the player.
Create two streaming sublevels, A and B. Put a body of water in sublevel A.
In sublevel B, place a walkable bridge made of an InstancedStaticMeshComponent or HierarchicalInstancedStaticMeshComponent. Make the bridge extend over and overlap the water in sublevel A, connecting the two areas.
In PIE/game, walk far enough away that sublevel B unloads while sublevel A stays loaded. The navmesh tiles over the water are rebuilt without the bridge.
Walk back so sublevel B loads again.
Look at the navmesh (show Navigation) where the bridge overlaps the water.
Expected Result
When sublevel B is loaded again, the navmesh tiles where its ISM/HISM bridge overlaps sublevel A’s water are rebuilt with the bridge geometry. The navmesh connects across the water and AI/players can path across the bridge.
Observed Result
The navmesh tiles over the water are not rebuilt after sublevel B reloads. The navmesh built without the bridge (water only) stays in place, which leaves a gap/height step where the bridge is. AI cannot path across, and the area stays blocked until something else dirties those tiles. Regular StaticMeshComponents in the same situation rebuild correctly. Only InstancedStaticMeshComponent / HierarchicalInstancedStaticMeshComponent are affected. This started in UE 5.6.
Affects Versions
5.8
Platform(s)
Windows


