У меня есть проект класса, в котором мы должны использовать 3D-объекты Unities Terrain и создать плавно сгенерированный ландшафт 3x3. Для этого нам сказали создать центральный ландшафт с прилегающими ландшафтами в 8 основных направлениях. Я заставил шум Перлина работать с помощью этого метода.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TerrainNoiseGeneration : MonoBehaviour
{

private TerrainData myTerrainData;
public Vector3 worldSize;
public int resolution = 129;
private float userInput = (float)4.2;
public float offsetX;
public float offsetZ;

// Start is called before the first frame update
void Start()
{
    myTerrainData = gameObject.GetComponent<TerrainCollider>().terrainData;
    worldSize = new Vector3(100, 50, 100);
    myTerrainData.size = worldSize;
    myTerrainData.heightmapResolution = resolution;
    float[,] heightArray = new float[resolution, resolution];
    heightArray = PerlinNoise(userInput, offsetX, offsetZ);
    myTerrainData.SetHeights(0, 0, heightArray);
}

// Update is called once per frame
void Update()
{
    float[,] heightArray = new float[resolution, resolution];
    heightArray = PerlinNoise(userInput, offsetX, offsetZ);
    myTerrainData.SetHeights(0, 0, heightArray);
}

float[,] PerlinNoise(float userInput, float offsetX, float offsetZ)
{
    float[,] heights = new float[resolution, resolution];

    for (int z = 0; z < resolution; z++)
    {
        for (int x = 0; x < resolution; x++)
        {
            float nx = (x + offsetX) / resolution * userInput;
            float ny = (z + offsetZ) / resolution * userInput;
            heights[z, x] = Mathf.PerlinNoise(nx, ny);
        }
    }

    return heights;
}

Этот код позволяет мне сгенерировать гладкую местность в первом объекте Terrain, но когда я пытаюсь ввести значения смещения, чтобы края могли выровняться, они не имеют одинаковых значений.

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

Обновление: мне удалось решить проблему с помощью довольно простого решения того факта, что мне нужно было использовать свое разрешение в качестве смещения, а не расстояния между ландшафтами.

0
RyanXLVI 15 Дек 2019 в 07:54
Я изменил для вас ваш тег Unityscript на C#, так как это не Unityscript (производная версия Javascript, созданная для Unity).
 – 
ProgrammingLlama
18 Дек 2019 в 03:29

1 ответ

Мне нужно было установить OffsetX и OffsetZ равными их соответствующим позициям разрешения, а не их позициям единства.

Например, мой ландшафт имеет размер 100x100, поэтому я установил смещение на 100 или -100 в зависимости от его местоположения, но вместо этого мне нужно было использовать 128 или -128, чтобы оно соответствовало разрешению.

0
RyanXLVI 15 Дек 2019 в 08:46