在统一中,第二次在运行时烘焙导航网格会导致导航网格仅部分构建

In unity, baking a nav mesh at runtime for a second time causes the navmesh to only partially build

我目前正在统一设计一个迷宫游戏,并且有一些敌人 AI 在迷宫周围追逐玩家。如果玩家到达迷宫中的某个方块,它将生成一个尺寸稍大的新迷宫。

我一直在使用统一 AI NavMeshSurface class 来实现这一点,并在生成关卡后调用 surface.BuildNavMesh() 生成导航网格。

每次重新生成关卡时,当前关卡的迷宫游戏对象都会被销毁:


    public void GenerateNewMaze(int rows, int columns)
    {
        mazeData = dataGenerator.FromDimensions(rows, columns);
        DisplayMaze();
    
        surface.BuildNavMesh();
    }
    
    public void DisposeOldMaze()
    {
        GameObject[] mazeObjects = GameObject.FindGameObjectsWithTag("Generated");
    
        foreach (GameObject mazeObject in mazeObjects)
        {
            Destroy(mazeObject);
        }
    }

我第一次 运行 它完美地工作:

然而,从第二个开始,我开始出现一些奇怪的差距:

我想也许表面在谷歌搜索后仍然有旧数据,我尝试了几个解决方案,例如 surface.RemoveData()NavMesh.RemoveAllNavMeshData(),然后再次构建导航网格,但我似乎明白了完全相同的结果。

目前我只能考虑为每个迷宫生成一个新的 NavMeshSurface,但这似乎有点过分而且没有必要。

我遵循的教程是:https://www.youtube.com/watch?v=FkLJ45Pt-mY

原来是我做的奇怪的事情。对于那些感兴趣的人,我的误解是在框架结束之前,我的迷宫对象上的 Destroy 调用没有完成。所以 NavMesh 正在为新旧迷宫生成

因此我需要在当前帧中处理当前迷宫对象并在下面更新NavMesh。我通过调用 FlagLevelForProgression 而不是 GenerateNewMaze:

使用以下代码完成此操作
public void FlagLevelForProgression()
{
    mazeConstructor.DisposeOldMaze();

    // Load any stuff we need to...

    canProgressToNextLevel = true;
}

void FixedUpdate()
{
    if(canProgressToNextLevel)
    {
        GenerateNewMaze();
        canProgressToNextLevel = false;
    }
}