¿Se podría solucionar este bug con la creaccción de curvas y montañas en mi terreno en unity 3D?
using UnityEngine;
using System.Collections;
public class InfiniteTerrain : MonoBehaviour
{
public GameObject PlayerObject;
public Material material1;
private Terrain[,] _terrainGrid = new Terrain[3,3];
void Start ()
{
Terrain linkedTerrain = gameObject.GetComponent<Terrain>();
for(int x=0;x<3;x++){
for(int z=0;z<3;z++){
_terrainGrid[x,z] = Terrain.CreateTerrainGameObject(linkedTerrain.terrainData).GetComponent<Terrain>();
}
}
UpdateTerrainPositionsAndNeighbors();
}
private void UpdateTerrainPositionsAndNeighbors()
{
_terrainGrid[0,0].transform.position = new Vector3(
_terrainGrid[1,1].transform.position.x - _terrainGrid[1,1].terrainData.size.x,
_terrainGrid[1,1].transform.position.y,
_terrainGrid[1,1].transform.position.z + _terrainGrid[1,1].terrainData.size.z);
_terrainGrid[0,1].transform.position = new Vector3(
_terrainGrid[1,1].transform.position.x - _terrainGrid[1,1].terrainData.size.x,
_terrainGrid[1,1].transform.position.y,
_terrainGrid[1,1].transform.position.z);
_terrainGrid[0,2].transform.position = new Vector3(
_terrainGrid[1,1].transform.position.x - _terrainGrid[1,1].terrainData.size.x,
_terrainGrid[1,1].transform.position.y,
_terrainGrid[1,1].transform.position.z - _terrainGrid[1,1].terrainData.size.z);
_terrainGrid[1,0].transform.position = new Vector3(
_terrainGrid[1,1].transform.position.x,
_terrainGrid[1,1].transform.position.y,
_terrainGrid[1,1].transform.position.z + _terrainGrid[1,1].terrainData.size.z);
_terrainGrid[1,2].transform.position = new Vector3(
_terrainGrid[1,1].transform.position.x,
_terrainGrid[1,1].transform.position.y,
_terrainGrid[1,1].transform.position.z - _terrainGrid[1,1].terrainData.size.z);
_terrainGrid[2,0].transform.position = new Vector3(
_terrainGrid[1,1].transform.position.x + _terrainGrid[1,1].terrainData.size.x,
_terrainGrid[1,1].transform.position.y,
_terrainGrid[1,1].transform.position.z + _terrainGrid[1,1].terrainData.size.z);
_terrainGrid[2,1].transform.position = new Vector3(
_terrainGrid[1,1].transform.position.x + _terrainGrid[1,1].terrainData.size.x,
_terrainGrid[1,1].transform.position.y,
_terrainGrid[1,1].transform.position.z);
_terrainGrid[2,2].transform.position = new Vector3(
_terrainGrid[1,1].transform.position.x + _terrainGrid[1,1].terrainData.size.x,
_terrainGrid[1,1].transform.position.y,
_terrainGrid[1,1].transform.position.z - _terrainGrid[1,1].terrainData.size.z);
for(int x=0;x<3;x++){
for(int z=0;z<3;z++){
_terrainGrid[x,z].materialTemplate=material1;
GenerateMountainsAndValleys(_terrainGrid[x,z], 0.1f, 10000000000000000f);
}
}
}
void Update ()
{
Vector3 playerPosition = new Vector3(PlayerObject.transform.position.x, PlayerObject.transform.position.y, PlayerObject.transform.position.z);
Terrain playerTerrain = null;
int xOffset = 0;
int yOffset = 0;
for (int x = 0; x < 3; x++)
{
for (int y = 0; y < 3; y++)
{
if ((playerPosition.x >= _terrainGrid[x,y].transform.position.x) &&
(playerPosition.x <= (_terrainGrid[x,y].transform.position.x + _terrainGrid[x,y].terrainData.size.x)) &&
(playerPosition.z >= _terrainGrid[x,y].transform.position.z) &&
(playerPosition.z <= (_terrainGrid[x,y].transform.position.z + _terrainGrid[x,y].terrainData.size.z)))
{
playerTerrain = _terrainGrid[x,y];
xOffset = 1 - x;
yOffset = 1 - y;
break;
}
}
if (playerTerrain != null)
break;
}
if (playerTerrain != _terrainGrid[1,1])
{
Terrain[,] newTerrainGrid = new Terrain[3,3];
for (int x = 0; x < 3; x++)
for (int y = 0; y < 3; y++)
{
int newX = x + xOffset;
if (newX < 0)
newX = 2;
else if (newX > 2)
newX = 0;
int newY = y + yOffset;
if (newY < 0)
newY = 2;
else if (newY > 2)
newY = 0;
newTerrainGrid[newX, newY] = _terrainGrid[x,y];
}
_terrainGrid = newTerrainGrid;
UpdateTerrainPositionsAndNeighbors();
}
}
void GenerateMountainsAndValleys(Terrain terrain, float scale, float heightScale){
TerrainData terrainData = terrain.terrainData;
int heightmapWidth = terrainData.heightmapResolution;
int heightmapHeight = terrainData.heightmapResolution;
float[,] heights = new float[heightmapWidth, heightmapHeight];
for (int i = 0; i < heightmapWidth; i++){
for (int j = 0; j < heightmapHeight; j++){
float xCoord = (float)i / heightmapWidth * scale;
float yCoord = (float)j / heightmapHeight * scale;
heights[i, j] = Mathf.PerlinNoise(xCoord, yCoord) * heightScale;
}
}
terrainData.SetHeights(0, 0, heights);
}
}
Previamente a que en ese terreno se añadieran curvas o montañas el terreno no tenía textura, pero se la agregué, pero a pesar de eso soy incapaz de modificar el alto de determinadas áreas del terreno en Unity3D. ¿Puede ser por algún problema del código o que el ‘terrain’ y/o la versión de ‘unity’ impidan hacerlo? Gracias de antemano.