如何在体素游戏中计算应首先加载哪些块?

时间:2016-07-29 16:55:00

标签: c# unity3d hashmap minecraft terrain

我正在使用 C#作为我的编程语言在Unity3D游戏引擎中开发体素游戏(即Minecraft,Cube World,InifiniMiner等)。

一个块是16x16x16块大。我的代码在~12ms内从文件中加载一个块,并在~3ms内生成其网格。我可以忍受这一点,这对于游戏的当前状态来说足够快。

我的问题是:如何以最有效的方式创建加载列表?玩家一直在移动,他在运动。世界在玩家移动的方向上加载块。也可能有高楼,所以有几块相互叠加。当建筑物在视线中时#34; (达到一定距离),应该完全加载。我最好拥有像Minecraft一样的16x256x16大小的块吗?

这是一个非常复杂的话题,我需要被推向正确的方向,因为有一百万种方法可以解决这个问题,但我试图在之间找到妥协,而不是太复杂而无法实现非常快。如果您的方法非常复杂,请不要犹豫,留下答案。我几乎不知道如何解决这个问题。

我过去尝试的内容:根据与播放器的距离对块列表进行排序。所以最先加载最近的块,最远的块最后加载。由于某些原因导致世界加载缓慢,因为播放器下方和上方的块也是首先加载的,但是加载与播放器位于同一高度的块更重要,因为他需要一些东西可以走路而且不会脱离世界。玩家并不慢,他有一个中等到高的移动速度。

我应该注意,我将块存储在C#字典中。关键是 ChunkPosition (块中的x,y,z,所以第一个块是0,0,0,右边的邻居是1,0,0等),值是块class,包含所有块数据,块等等。

如果您需要更多信息,请在评论中提问。

提前致谢!

1 个答案:

答案 0 :(得分:0)

本质上,您想查找最接近[玩家及其观察位置]的区块。我的意思是,如果您尚未在播放器前面加载块,则不想在其后面加载块。因此,请执行类似(伪代码)

     int priority = -(distanceFromPlayer + closenessToCenterOfScreen);

因此,您可以计算块的优先级高低,然后根据其优先级逐一加载它们。在我的示例中,与玩家的距离越大,优先级越低,并且块越靠近(查看的)屏幕的中心,优先级越高。然后,检查优先级是否在视图距离以下,如果优先级不在视野范围内,则不要因为它距离太远而麻烦加载。