如何解决在 unity 中,第二次在运行时烘焙导航网格会导致导航网格仅部分构建
我目前正在设计一个统一的迷宫游戏,并且有一些敌人 AI 会在迷宫周围追逐玩家。如果玩家到达迷宫上的某个方块,它会生成一个尺寸稍大的新迷宫。
我一直在使用 unity AI NavMeshSurface 类来实现这一点,并在生成关卡后调用 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;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。