Search Issue Tracker
Active
Under Consideration for 2021.3.X, 2022.3.X, 6000.0.X
Fixed in 6000.1.0a10
Votes
0
Found in
2021.3.44f1
2022.3.50f1
6000.0.22f1
Issue ID
UUM-84579
Regression
No
NavMeshSurface data is incorrect when the Scene is loaded without disabling and re-enabling the NavMeshSurface GameObject
Reproduction steps:
1. Open the attached “NavMesh Issue Simple.zip” project
2. Open the “ReproScene” Scene
3. Observe the Navigation paths in the Scene view
Expected result: 2 of the paths are yellow (NavMeshPathStatus.PathPartial)
Actual result: 3 of the paths are green (NavMeshPathStatus.PathComplete)
Reproducible with: 1.0.0-exp. 4 (2021.3.44f1) 1.1.5 (2022.3.50f1), 2.0.4 (6000.0.23f1)
Reproducible on: Windows 11
Not reproducible on: No other environment tested
Notes:
- Disabling and re-enabling the “NavMeshes” GameObject from the Hierarchy shows the correct result
- Also reproduces in the Player
Add comment
All about bugs
View bugs we have successfully reproduced, and vote for the bugs you want to see fixed most urgently.
Latest issues
- [Dragon Crashers] Build fails in U6
- [Dragon Crashers] 4 Shader error messages on import
- [Dragon Crashers] Readme text is white on light grey
- Cursor stays in front of the first character when entering text in the TextMeshPro field
- Searching in Hierarchy causes unwanted component calls
adriant
Dec 10, 2024 22:13
The scene in the provided project contains four overlapping NavMeshes, built in the same space for four different agent types. The NavMeshes are not all covering both the start and the target point of the wanted paths.
The call to NavMesh.CalculatePath() from the provided script picks the first NavMesh that it can find at the desired ends. Internally, the NavMeshes are stored in the order in which they have been added to the system. When the scene is loaded, the gameobjects with NavMeshSurfaces get enabled in a different order than when their parent gameobject gets re-enabled. How the scene loads the objects is generally out of our control. It affects which NavMesh is found first at the points of interest, and thus it affects the outcome of the call to CalculatePath() in each of those situations.
Two implementation details that can be relevant in this case are that:
1. CalculatePath() determines the NavMesh for the target point first;
2. Subsequently, the start point might wrongfully be found on another overlapping NavMesh (which leads to not finding a path that obviously exists).
There are two options for avoiding this problem:
1. Use the overloaded function public static bool CalculatePath(Vector3 sourcePosition, Vector3 targetPosition, AI.NavMeshQueryFilter filter, AI.NavMeshPath path) in order to control precisely, with the filter parameter, for which agent type to run the query. In the case when multiple NavMeshes for the same desired agent type overlap, then their order in the system matters again. The function variant is described at the end of the scripting reference page https://docs.unity3d.com/ScriptReference/AI.NavMesh.CalculatePath.html .
or
2. Make sure that the NavMeshes are always enabled in the same order, prior to doing the first calls to the generic CalculatePath(sourcePosition, targetPosition, areaMask, path). This is generally not the intended approach in scenes with overlapping NavMeshes because there is no control over which NavMesh is chosen by CalculatePath() for the start and end points.
Please let us know if you can use any of these workarounds to implement the behaviors you expected.