Unity: Runtime-Terrain-Editor Как поднять круг - PullRequest
0 голосов
/ 28 октября 2018

Я пытаюсь создать редактор ландшафта, который работает во время выполнения. На этом этапе я могу поднять квадрат, но у меня возникают проблемы с увеличением формы круга. Я видел этот пост и думал, что это решение моей проблемы, поэтому я перенес его в свой код. Это действительно поднимает круг где-то (где я не нажимаю), но это не эффективно, потому что это обновляет всю местность.

Вся функция:

    public void RaiseTerrain(Terrain terrain, Vector3 location, float effectIncrement)
{
    int offset = areaOfEffectSize / 2;

    Vector3 tempCoord = (location - terrain.GetPosition());
    Vector3 coord;

    coord = new Vector3(
        (tempCoord.x / GetTerrainSize().x),
        (tempCoord.y / GetTerrainSize().y),
        (tempCoord.z / GetTerrainSize().z)
        );

    Vector3 locationInTerrain = new Vector3(coord.x * terrainHeightMapWidth, 0, coord.z * terrainHeightMapHeight);

    int terX = (int)locationInTerrain.x - offset;
    int terZ = (int)locationInTerrain.z - offset;
    int terXInv = (int)locationInTerrain.x + offset;
    int terZInv = (int)locationInTerrain.z + offset;

    //This raises a square
    //float[,] heights = targetTerrainData.GetHeights(terX, terZ, areaOfEffectSize, areaOfEffectSize);

    //for (int xx = 0; xx < areaOfEffectSize; xx++)
    //{
    //    for (int yy = 0; yy < areaOfEffectSize; yy++)
    //    {
    //        heights[xx, yy] += (effectIncrement * Time.smoothDeltaTime);
    //    }
    //}
    //targetTerrainData.SetHeights(terX, terZ, heights);

    //This raises a circle
    float[,] heights = targetTerrainData.GetHeights(0, 0, terrainHeightMapWidth, terrainHeightMapHeight);

    for (int xx = terX; xx < terXInv; xx++)
    {
        for (int yy = terZ; yy < terZInv; yy++)
        {
            float currentRadiusSqr = (new Vector2(locationInTerrain.x, locationInTerrain.z) - new Vector2(xx, yy)).sqrMagnitude;
            if(currentRadiusSqr < offset*offset)
            {
                heights[xx, yy] += (effectIncrement * Time.smoothDeltaTime);
            }                
        }
    }
    targetTerrainData.SetHeights(0, 0, heights);
}

Все последующие строки являются выдержками сверху.

Я думаю, моя проблема в этой строке:

float[,] heights = targetTerrainData.GetHeights(0, 0, terrainHeightMapWidth, terrainHeightMapHeight);

Потому что возведение квадрата работает нормально. Я просто обновляю определенную область, поэтому она обновляет ландшафт, не понижая частоту кадров:

float[,] heights = targetTerrainData.GetHeights(terX, terZ, areaOfEffectSize, areaOfEffectSize);
[...]
targetTerrainData.SetHeights(terX, terZ, heights);

Итак, мой вопрос, как я могу поднять круг и обновить изменения, как я сделал с поднятием квадрата? Обновлять только измененные высоты?

Я пытался использовать следующие строки из квадрата:

float[,] heights = targetTerrainData.GetHeights(terX, terZ, areaOfEffectSize, areaOfEffectSize);
[...]
targetTerrainData.SetHeights(terX, terZ, heights);

в сочетании с:

        for (int xx = terX; xx < terXInv; xx++)
    {
        for (int yy = terZ; yy < terZInv; yy++)
        {
            float currentRadiusSqr = (new Vector2(locationInTerrain.x, locationInTerrain.z) - new Vector2(xx, yy)).sqrMagnitude;
            if(currentRadiusSqr < offset*offset)
            {
                heights[xx, yy] += (effectIncrement * Time.smoothDeltaTime);
            }                
        }
    }

но это не сработало. Я получаю сообщение об ошибке:

IndexOutOfRangeException: Index was outside the bounds of the array.
...