在统一中,第二次在运行时烘焙导航网格会导致导航网格仅部分构建
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,但这似乎有点过分而且没有必要。
原来是我做的奇怪的事情。对于那些感兴趣的人,我的误解是在框架结束之前,我的迷宫对象上的 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;
}
}
我目前正在统一设计一个迷宫游戏,并且有一些敌人 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,但这似乎有点过分而且没有必要。
原来是我做的奇怪的事情。对于那些感兴趣的人,我的误解是在框架结束之前,我的迷宫对象上的 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;
}
}