Проблема с генерированием случайных кусков местности с шумом Perlin - PullRequest
0 голосов
/ 28 сентября 2018

Итак, я пытаюсь понять развитие единства с помощью c #, и для своей первой задачи я решил сделать клон Minecraft, чтобы лучше понимать вершины и сетки.Я успешно создал систему чанков, и она отлично работает, но моя проблема со случайной гладкой местностью.

Мое решение состояло в том, чтобы создать таблицу шума 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. </p>

1 Ответ

0 голосов
/ 28 сентября 2018

Мне кажется, что ваша проблема проистекает из следующих трех циклов:

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

Вы выполняете итерацию от 0 до chunkSize.<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++) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...