Установить ландшафт на определенную высоту во время выполнения? - PullRequest
0 голосов
/ 04 января 2019

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

Я не слишком старался, потому что я не знаю, как это работает слишком хорошо ..

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

public class test : MonoBehaviour {

    public Terrain terr; // terrain to modify
    int hmWidth; // heightmap width
    int hmHeight; // heightmap height

    int posXInTerrain; // position of the game object in terrain width (x axis)
    int posYInTerrain; // position of the game object in terrain height (z axis)

    int size = 5; // the diameter of terrain portion that will raise under the game object
    float desiredHeight = 2; // the height we want that portion of terrain to be

    void Start()
    {

        terr = Terrain.activeTerrain;
        hmWidth = terr.terrainData.heightmapWidth;
        hmHeight = terr.terrainData.heightmapHeight;

    }

    void Update()
    {

        // get the normalized position of this game object relative to the terrain
        Vector3 tempCoord = (transform.position - terr.gameObject.transform.position);
        Vector3 coord;
        coord.x = tempCoord.x / terr.terrainData.size.x;
        coord.y = tempCoord.y / terr.terrainData.size.y;
        coord.z = tempCoord.z / terr.terrainData.size.z;

        // get the position of the terrain heightmap where this game object is
        posXInTerrain = (int)(coord.x * hmWidth);
        posYInTerrain = (int)(coord.z * hmHeight);

        // we set an offset so that all the raising terrain is under this game object
        int offset = size / 2;

        // get the heights of the terrain under this game object
        float[,] heights = terr.terrainData.GetHeights(posXInTerrain - offset, posYInTerrain - offset, size, size);

        // we set each sample of the terrain in the size to the desired height
        for (int i = 0; i < size; i++)
            for (int j = 0; j < size; j++)
                heights[i, j] = desiredHeight;


        // set the new height
        terr.terrainData.SetHeights(posXInTerrain - offset, posYInTerrain - offset, heights);

    }

}

Я ожидаю, что будет вход и высота будет установлена ​​на введенную высоту.

Пример: input = 10 terrain под объектом переходит к 10

фактический результат: input - 10 terrain подобъект идет до 600

1 Ответ

0 голосов
/ 31 июля 2019

Высота, которую вы передаете методу SetHeights, должна быть между 0 и 1. 0 означает 0, 1 означает максимальную высоту ландшафта.

var heightScale = 1.0f / terr.terrainData.size.y;
for (int i = 0; i < size; i++)
    for (int j = 0; j < size; j++)
       heights[i, j] = desiredHeight * heigthScale;
...