c# - 我如何计算在体素游戏中应该首先加载哪些 block ?

标签 c# unity3d hashmap minecraft terrain

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

一个区 block 有 16x16x16 block 大。我的代码在 ~12 毫秒内从文件加载一个 block ,并在 ~3 毫秒内生成其网格。我可以接受,这对于当前的游戏状态来说已经足够快了。

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

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

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

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

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

提前致谢!

最佳答案

本质上,您想要找到最接近 [玩家和他们正在看的地方] 的区 block 。我的意思是,如果你还没有加载前面的 block ,你不想加载你的播放器后面的 block 。所以,做一些像(伪代码)

     int priority = -(distanceFromPlayer + closenessToCenterOfScreen);

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

关于c# - 我如何计算在体素游戏中应该首先加载哪些 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38663910/

相关文章:

c# - 从 sendMessage 返回值或在 unity webgl 中交替

c# - 如何停止 Resharper 在 Enumerable.ToList 和 Select 建议之间切换

c# - 是否可以使用 c# 在 Datagridview 中有两个列标题

android - 如何在 Unity Android 中查找权限来源

java - 在 Java 中深度复制 NavigableMap

java - HashMap 到 JTable

java - 在不同 map 上使用按键

c# - NewtonSoft JsonConverter - 访问其他属性

c# - 查询连接表时未加载子实体

c# - 如何在 Unity 中显示类似于 android 中的 Toast 消息?