【问题标题】: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

【问题讨论】:

    标签: unity3d navmesh


    【解决方案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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-06-24
      • 1970-01-01
      • 2013-02-02
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多