【发布时间】:2018-07-25 13:34:27
【问题描述】:
我是 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 上实例化一个预制件,你会看到地形。有人可以帮我弄清楚如何制作更好的地形吗?提前致谢!
【问题讨论】:
标签: c# unity3d terrain perlin-noise