【问题标题】:How do I calculate which chunks should be loaded first in a voxel game?如何计算在体素游戏中应该首先加载哪些块?
【发布时间】:2016-12-04 11:19:09
【问题描述】:

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

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

我的问题是:如何以最有效的方式创建加载列表?玩家一直在移动,他在移动。世界会按照玩家移动的方向加载区块。也可能有高楼,所以几块在彼此之上。当建筑物“在视线内”(达到一定距离)时,应完全加载。像 Minecraft 中那样拥有 16x256x16 大小的块会更好吗?

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

我过去的尝试: 根据与玩家的距离对区块列表进行排序。所以最近的块首先加载,最远的块最后加载。由于某些原因,这导致世界加载缓慢,因为玩家下方和上方的块也首先加载,但更重要的是加载与玩家高度相同的块,因为他需要一些东西可以走不会从世界上掉下来。玩家并不慢,他的移动速度适中。

我应该注意我将块存储在 C# 字典中。关键是 ChunkPosition(x,y,z 以块为单位,所以第一个块是 0,0,0,他的右邻居是 1,0,0 等),值是块类,它保存所有的块数据,它的块等等。

如果您需要更多信息,请在 cmets 中询问。

提前致谢!

【问题讨论】:

  • 你不能这样做。只需获取许多已经存在的 minecraft / voxel 工具包中的一个 - 在资产商店中很容易获得,或者只是在谷歌上找到许多许多免费的工具包。你需要 3+ 人年的编程才能从头开始。这是完全、完全、毫无意义的。
  • 我开发这个主要是为了学习目的,所以它不是毫无意义的。我不想使用已经存在的工具包。当然这样会更容易。

标签: c# unity3d hashmap minecraft terrain


【解决方案1】:

本质上,您想找到最接近 [玩家及其正在寻找的位置] 的区块。我的意思是,如果你还没有加载前面的块,你不想在你的播放器后面加载一个块。所以,做一些类似(伪代码)

     int priority = -(distanceFromPlayer + closenessToCenterOfScreen);

所以,你计算块的优先级,然后根据它们的优先级一一加载。在我的示例中,与玩家的距离越大,优先级越低,而块越靠近(查看的)屏幕中心,优先级越高。然后,检查优先级是否低于视距,如果是,请不要加载它,因为它太远了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多