2015-04-17 4 views
2

Итак, я пытаюсь создать ландшафт с использованием кода, и я столкнулся с проблемой. Когда я назначаю heightmapResolution, размер моего ландшафта увеличивается в разной степени в два раза.Почему присвоение heightmapResolution увеличивает размер моей местности?

Например, если мой heightmapResolution является 513, то мои местности размер увеличивается на коэффициент 16. Если мой heightmapResolution является 257, то мои местности размер увеличивается на коэффициент 8.

Как я понимаю (и я тоже это прочитал), heightmapResolution не должен влиять на размер местности.

Я должен подчеркнуть, что увеличение размера происходит только по оси X и Z. Высота остается неизменной.

 /// <summary> 
     /// Gets the terrain data either from memory if its loaded, from disk if it isnt, or generates a new one of neither of those are available. 
     /// </summary> 
     /// <value>The terrain data.</value> 
     public static TerrainData terrainData { 
      get { 
       TerrainData terrainData = new TerrainData(); 
       if(isTerrainLoaded){ 
        //Debug.Log("terrainData is already loaded, returning it!"); 
        return(loadedTerrainData); 
       } 
       else if(Resources.Load("terrainData") != null && !generateNewTerrain){ 
        terrainData = Resources.Load("terrainData") as TerrainData; 
        Debug.Log("Read terrainData from disk!"); 
       } 
       else{ 
        Debug.Log("No terrainData found on disk, generating a new random one..."); 

        terrainData.size = new Vector3(width, height - sandBaseHeight, length); 
        Debug.Log ("Original terrain size: " + terrainData.size); 
        terrainData.heightmapResolution = heightmapResolution; 
        Debug.Log ("Bigger terrain size: " + terrainData.size); 
        terrainData.baseMapResolution = baseMapResolution; 

        terrainData.SetDetailResolution((int)detailResolution.x, (int)detailResolution.y); //(int) because data is stored in a Vector2 which is float 
        terrainData.alphamapResolution = aplhaMapResolution; 

        float[,] heights = new float[terrainData.heightmapWidth,terrainData.heightmapHeight]; 
        Vector2 randomLocation; //for perlin noise 
        randomLocation.x = Random.Range(-10000,10000); //that is hopefully enough 
        randomLocation.y = Random.Range(-10000,10000); 

        for (int x = 0; x < terrainData.heightmapWidth; x++) { 
         for (int z = 0; z < terrainData.heightmapWidth; z++) { 
          heights[x,z] = Mathf.PerlinNoise(randomLocation.x + (float)x/scale, randomLocation.y + (float)z/scale); 
         } 
        } 
        terrainData.SetHeights (0, 0, heights); 
        terrainData.splatPrototypes = splatTextures; 

        AssetDatabase.CreateAsset(terrainData,"Assets/Resources/terrainData.asset"); 
       } 
       loadedTerrainData = terrainData; 
       return(terrainData); 
      } 
     } 

Таким образом, это блок, который генерирует мою рельефную область. Изменение размера ландшафта уже видно в Debug.Log («Большой размер местности:» + terrainData.size); сразу после присвоения heightmapResolution.

Любые идеи относительно того, почему это происходит?

+0

Вы использовали отладчик? – Varaquilex

+0

Я понял это и разместил свой ответ ниже. Я использовал отладчик и просто пробовал разные вещи, пока это не сработало. – Pizmovc

+0

Я предполагаю, что это происходит, потому что Unity пытается изменить масштаб местности при настройке heightmapResolution, чтобы сохранить фактическое разрешение вывода? (Просто мысль) – vatbub

ответ

1

Я понял.

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

terrainData.heightmapResolution = heightmapResolution; 
terrainData.size = new Vector3(width, height - sandBaseHeight, length); 
terrainData.baseMapResolution = baseMapResolution; 
terrainData.SetDetailResolution((int)detailResolution.x, (int)detailResolution.y); 
terrainData.alphamapResolution = aplhaMapResolution; 

Debug.Log ("Terrain size: " + terrainData.size); //Correct terrain size 

Надеюсь, это тоже поможет кому-то еще!