【发布时间】: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