Static mesh area class setting is ignored

Expected behavior: When the ‘area class’ of a static mesh with a collider and collision enabled is set to ‘NavArea_Null’, the static mesh should not have any navigation mesh on its surface. (Since it is marked as never walkable.)

Bug: The navigation mesh still builds walkable areas on the static mesh.

Steps to repeat:

  1. Create a ThirdPerson Blueprint project.
  2. In the third peson example map: Add a ‘NavMeshBoundsVolume’ that encompasses the entire level geometry.
  3. Show the navigation mesh and validate that cube on the floor has a small section of NavMesh on its top.
  4. Select the cube, then select and open the ‘M_Cube_Chamfer’ static mesh.
  5. Note that the static mesh has a collision object assigned.
  6. Set the Navvigation → Area Class setting to ‘NavArea_Null’.
  7. Save the change and return to the scene.
  8. Update the position of the cube slightly to force the NavMesh to rebuild.
  9. Note that the NavMesh section on the top of the cube still exists, even though the entire cube is marked as ‘never walkable’.

Hello SteveFSP,

I was able to reproduce this issue on our end. I have written up a report (UE-31968) and I have submitted it to the developers for further consideration. I will provide updates with any pertinent information as it becomes available. Thank you for your time and information.

Make it a great day

It’s not a bug. You also need to set the Is Dynamic Obstacle flag, otherwise Area Class is not being taken into consideration.

Cheers,

–mieszko

OK, so just a little clarification to make sure I understand this…

Is this a true statement?

The the only way to tell the engine, through the static mesh configuration, that all of a static mesh’s geometry/voxels are to be marked as ‘never walkable’ is to set the mesh as IsDynamicObstable and NavArea_Null, even if the mesh in the level will always be set as “Static”? E.g. A large building with a flat, but inaccessible roof, must be marked as IsDynamicObstable.

If the above is true, is there a negative run-time impact of marking large static objects as IsDynamicObstacle? If that is the case, I guess NavModifierVolumes on each level object will get the job done. That’s just an extra, potentially error prone step I thought I could avoid.

The the only way to tell the engine, through the static mesh configuration, that all of a static mesh’s geometry/voxels are to be marked as ‘never walkable’ is to set the mesh as IsDynamicObstable and NavArea_Null, even if the mesh in the level will always be set as “Static”? E.g. A large building with a flat, but inaccessible roof, must be marked as IsDynamicObstable.

Yes.

If the above is true, is there a negative run-time impact of marking large static objects as IsDynamicObstacle?

Marking a mesh as an obstacle makes it cheaper in terms of navmesh generation, since we don’t have to use mesh’s precise collision, just it’s bounds.

If that is the case, I guess NavModifierVolumes on each level object will get the job done

Marking meshes as obstacles will be more efficient compared to using nav modifiers - with nav modifiers mesh’s collision will be used during navmesh generation, and as a last step all the navmesh inside volumes will be marked as unwalkable.