微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在 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);
        }
    }

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

First generation

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

enter image description here

我想,在进行了一些谷歌搜索后,表面上可能仍然有旧数据,我尝试了一些解决方案,例如 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 举报,一经查实,本站将立刻删除。