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

Posted

技术标签:

【中文标题】在统一中,在运行时第二次烘焙导航网格会导致导航网格仅部分构建【英文标题】:In unity, baking a nav mesh at runtime for a second time causes the navmesh to only partially build 【发布时间】:2021-04-08 04:16:53 【问题描述】:

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

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

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

public void GenerateNewMaze(int rows, int columns) mazeData = dataGenerator.FromDimensions(rows, columns); 显示迷宫(); surface.BuildNavMesh(); 公共无效 DisposeOldMaze() GameObject[] mazeObjects = GameObject.FindGameObjectsWithTag("Generated"); foreach (mazeObjects 中的游戏对象 mazeObject) 销毁(迷宫对象);

我第一次运行它时效果很好:

但是从第二个开始,我开始发现一些奇怪的差距:

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

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

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

【问题讨论】:

【参考方案1】:

原来是我做的一些奇怪的事情。对于那些感兴趣的人,我的误解是在我的迷宫对象上调用 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;
    

【讨论】:

以上是关于在统一中,在运行时第二次烘焙导航网格会导致导航网格仅部分构建的主要内容,如果未能解决你的问题,请参考以下文章

导航系统

unity中NavMeshAgent有关知识

3 列网格导航栏引导程序

如何在 EXTJS 4.1 中创建导航栏?

网格 CSS 导航栏样式问题

Three.js导航网格实现教程NavMehs