用Perlin噪声生成随机地形块的问题

时间:2018-09-28 00:43:52

标签: c# unity3d

因此,我试图掌握c#的统一开发,对于我的第一个挑战,我决定制作一个我的世界克隆,以更好地理解顶点和网格。我已经成功创建了一个块系统,并且运行良好,但是我的问题是随机的平滑地形。

我的解决方案是创建一个整个世界大小的perlin噪音表,然后我将获得噪音表的特定部分放在每个块上。我已经尝试过了,但是出现错误

IndexOutOfRangeException: Array index is out of range

当我尝试访问表以获取块生成器中的高度时。

这是有问题的两个脚本:

脚本1:地形管理器

该脚本应该彼此相邻生成块,并且效果很好。

void Start () {
    chunks = new Chunk[renderArea * renderArea];
    worldHeightmap = PerlinNoise.GenerateHightmap(chunkSize * worldSize + 1, chunkHeight * worldSize + 1, worldSeed, worldSeedIntensity);       
    print(worldHeightmap.Length);

    RVector3 chunkDimensions = new RVector3(chunkSize, chunkHeight, chunkSize);

    for(int x = 1; x < renderArea + 1; x++) {
        for(int z = 1; z < renderArea + 1; z++) {
            Vector3 spawnPos = new Vector3(x * chunkSize, 0, z * chunkSize);
            // Ignore this float [,] heightMapPeice = new float[x * chunkSize, z * chunkSize];

            // Creates Chunk //
            GameObject chunkHolder = Instantiate(block, block.transform.position, Quaternion.identity);
            chunk = chunkHolder.GetComponent<Chunk>();

            chunk.GenerateChunk(chunkDimensions, spawnPos, worldHeightmap, new Vector2(x, z));
            chunks[chunkIndex] = chunk;
            chunkIndex++;
        }
    }

    print(chunks.Length + " Chunks Generated");
}

脚本2:块生成器

public void GenerateChunk (RVector3 chunkDimensions, Vector3 spawnPosition, float[,] chunkHeights, Vector2 heightIndex) {
    chunkSize = chunkDimensions;
    chunkBlocks = new Block[chunkSize.x + 1, chunkSize.y + 1, chunkSize.z + 1];

    transform.position = spawnPosition;

    for(int x = 0; x <= chunkSize.x; x++) {
        for(int y = 0; y <= chunkSize.y; y++) {
            for(int z = 0; z <= chunkSize.z; z++) {
                chunkBlocks[x,y,z] = new Block(true);

                //print(x * (int) heightIndex.x);

                if(y < chunkHeights[x * chunkSize, z * chunkSize]) { 
                    chunkBlocks[x,y,z] = new Block(false);
                }
            }
        }
    }

    updateChunk();
}

如果我能在这方面得到一些帮助,将不胜感激。非常感谢<3。

1 个答案:

答案 0 :(得分:0)

在我看来,您的问题源自以下3个for循环的范围:

for(int x = 0; x <= chunkSize.x; x++) {
        for(int y = 0; y <= chunkSize.y; y++) {
            for(int z = 0; z <= chunkSize.z; z++) {

您要从0chunkSize.<axis>进行迭代,当我只能假设您只需要chunkSize.<axis> + 1时,每个轴总共有chunkSize.<axis>个迭代。您可以使用<代替<=

来解决此问题
for(int x = 0; x < chunkSize.x; x++) {
        for(int y = 0; y < chunkSize.y; y++) {
            for(int z = 0; z < chunkSize.z; z++) {