Minecraft就像unity3d中的地形

时间:2018-07-25 13:34:27

标签: c# unity3d terrain perlin-noise

我是Minecraft古老地形的粉丝,拥有令人赞叹的悬挑,山脉和有趣的世界。我的问题是,现在我使用的是Perlin杂讯,虽然这种杂讯对平滑的地形有好处,但实际上并不会产生零星的跳跃,而使山峰可以在大部分平坦的区域内出现。

最重要的是,我使用的方法获取2d perlin噪声,将其放入数组中,然后获取其下的每个Y值并将其设置为块;这样可以停止生成悬垂,例如:Old Minecraft Terrain Image

现在我有这个:

public class GenerateIdMap : MonoBehaviour {
     [Serializable] public class IBSerDict : SerializableDictionaryBase<int, byte> {};
     public int size = 60;
     public int worldHeight = 3;
     public float perlinScale = 15f;
     public int seed;
     public int heightScale = 10;
     public int maxHeight = 256;
     public IBSerDict defaultBlocks = new IBSerDict();
     void Start()
     {
         if (seed != 0) seed = (int)Network.time * 10;
         CreateMap();
     }
     byte[,,] CreateMap()
     {
         byte[,,] map = new byte[size, maxHeight, size];
         for (int x = 0; x < size; x++)
         {
             for (int z = 0; z < size; z++)
             {
                 int y = (int)(Mathf.PerlinNoise((x + seed) / perlinScale, (z + seed) / perlinScale) * heightScale) + worldHeight;
                 y = Mathf.Clamp(y, 0, maxHeight-1);
                 while (y > 0)
                 {
                     map[x, y, z] = GetBlockType(y);
                     y--;
                 }
             }
         }
         return map;
     }
     byte GetBlockType(int y)
     {
         SortedDictionary<int, byte> s_defaultBlocks = new SortedDictionary<int, byte>(defaultBlocks);
         foreach (var item in s_defaultBlocks.OrderBy(key => key.Key))
         {
             if (y <= item.Key)
             {
                 print(item.Value);
                 return item.Value;
             }
         }
         return 0;
     }  }

GetBlockType函数是新功能,为了在该高度获得默认块,我稍后会对其进行修复,但现在可以使用。如果在该vector3上实例化一个预制件,则会看到地形。有人可以帮我弄清楚如何制作更好的地形吗?预先感谢!

1 个答案:

答案 0 :(得分:0)

您的两个问题都应单独解决。

关于生成值没有变化的第一个问题通常可以通过以下两种方法之一解决:第一种方法是修改输入到perlin噪声中,即八度和持久性,第二种是混合使用多个功能的输出,甚至将一个功能的输出用作另一功能的输入。按功能,我的意思是Perlin / Simplex / Voronoi等。

如前所述,使用前一种方法,很难在大面积上获得具有有趣特征的地形(生成的值是均匀的),但是通过使用坐标范围和八度/持久性,可以可能。但是,可能建议使用第二种方法,因为通过混合使用不同功能的输入和输出,您可以得到一些非常有趣的形状(Voronoi会生成类似于圆形切割器的形状)。

为了解决突出问题,您需要稍微改变生成世界的方法。当前,您只是在生成地形的高度值,然后分配这些值中的每一个仅给您地形表面。理想情况下,您希望生成一个伪随机值,以用作3d空间中每个块(以及地下的块)的通过标志。该标志将指示是否应在3d世界中放置一个块。

这比较慢,但是会根据需要生成洞穴和悬垂物。