在 unity2D 中运行时异步构建导航网格

Building navmesh asynchronously during runtime in unity2D

提问人:Povst 提问时间:11/14/2023 更新时间:11/16/2023 访问量:37

问:

我面临的问题是,我的游戏场景会根据玩家的行为而变化(他可以设置障碍物),导航网格代理应该考虑这些变化并销毁它们。

所以我需要在游戏时重新计算 navmesh 代理的路径,我找到了函数 navMeshSurface.BuildNavMeshAsync();希望我能烘烤,游戏不会停止。调用此方法时,游戏将冻结。

异步可能有什么问题?

也许还有重新烘烤的替代方案,请给我出主意

上次迭代

private async void Update()
    {
        if(Input.GetKeyDown(KeyCode.N))
        {
            SpawnNextAtRandomSpawner();
            navMeshSurface = GameObject.Find("Navmesh").GetComponent<NavMeshSurface>();
            await UpdateNavMeshAsync();
        }
    }

    async Task UpdateNavMeshAsync()
    {
        navMeshSurface.RemoveData();
        navMeshSurface.BuildNavMeshAsync(); //Freeze moment
    }
C# 引擎-游戏 开发 导航网格

评论

0赞 derHugo 11/14/2023
不要等待你的电话..当然,这会冻结,因为 Unity 中的是由所有(除其他外)运行一次定义的......只需根本不等待您的调用,而是让它异步运行UpdateUpdate
0赞 BugFinder 11/14/2023
为什么不在表示其自动剪切的位置对象上设置导航网格修改器。那么就不需要重新计算了
0赞 JonasH 11/14/2023
“异步”并不能保证它在多大程度上是异步的。它可以有一个相当慢的同步部分,或者它可能只是谎称是异步的。您需要查看文档。我没有使用过 Unity,但是否没有处理临时阻塞对象的功能?从头开始重建导航网格体似乎是一个非常繁重的解决方案。
0赞 shingo 11/14/2023
你在哪里找到这种方法?docs.unity3d.com/Packages/[email protected]/api/...
0赞 BugFinder 11/14/2023
@JonasH是的,在旧版本或新版本上可以添加组件,因此您可以告诉 navmesh 包含或排除,它会自动计算。

答:

1赞 BugFinder 11/16/2023 #1

你想得太多了

因此,此链接将带您观看以下操作的视频。

https://imgur.com/a/FO1cpV8

public class spawner : MonoBehaviour
{
public int Delay = 5;
public GameObject cube;
public NavMeshSurface surface;
    private float nextspawntime = 0;

    Vector3 newpos()
    {
        return new Vector3(Random.Range(-24,24),0,Random.Range(-24,24));
    }
    void Update()
    {
        nextspawntime += Time.deltaTime; 
        if (nextspawntime> Delay)
        {
            nextspawntime = 0;
            Instantiate(cube, newpos(), Quaternion.identity);
        }
    }
}

navmeshobject

评论

0赞 Povst 11/16/2023
从未听说过 2d 项目的上下文中该组件,但它工作得很好。多谢!
0赞 BugFinder 11/16/2023
NavMesh 不是特定于 2D 的,它也是 3D 的