Tengo un script al que agrego un objeto Terrain (arrastro y suelto el terreno en el campo público Terrain).
El terreno ya está configurado en Unity para tener 2 PaintTextures: 1 es un cuadrado (configurado con un tamaño de mosaico para que forme un patrón a cuadros) y el segundo es una imagen de hierba:
También se reduce la fuerza objetivo de la primera PaintTexture para que el patrón a cuadros también revele algo de la hierba debajo.
Ahora quiero, en tiempo de ejecución, cambiar el tamaño de mosaico de la primera PaintTexture, es decir, tener más o menos correctores dependiendo de varias condiciones de tiempo de ejecución. He revisado la documentación de Unity y he visto que tienes la Terrain.terrainData.SplatPrototype
matriz que te permite cambiar esto. También hay un RefreshPrototypes()
método en el terrainData
objeto y un Flush()
método en el Terrain
objeto. Entonces hice un guión como este:
public class AStarTerrain : MonoBehaviour {
public int aStarCellColumns, aStarCellRows;
public GameObject aStarCellHighlightPrefab;
public GameObject aStarPathMarkerPrefab;
public GameObject utilityRobotPrefab;
public Terrain aStarTerrain;
void Start () {
//I've also tried NOT drag and dropping the Terrain on the public field
//and instead just using the commented line below, but I get the same results
//aStarTerrain = this.GetComponents<Terrain>()[0];
Debug.Log ("Got terrain "+aStarTerrain.name);
SplatPrototype[] splatPrototypes = aStarTerrain.terrainData.splatPrototypes;
Debug.Log("Terrain has "+splatPrototypes.Length+" splat prototypes");
SplatPrototype aStarCellSplat = splatPrototypes[0];
Debug.Log("Re-tyling splat prototype "+aStarCellSplat.texture.name);
aStarCellSplat.tileSize = new Vector2(2000,2000);
Debug.Log("Tyling is now "+aStarCellSplat.tileSize.x+"/"+aStarCellSplat.tileSize.y);
aStarTerrain.terrainData.RefreshPrototypes();
aStarTerrain.Flush();
}
//...
El problema es que nada cambia, el mapa del corrector no se vuelve a colocar en mosaico. Las salidas de la consola me dicen correctamente que tengo el objeto Terrain con el nombre correcto, que tiene el número correcto de prototipos splat y que estoy modificando el tileSize en el objeto SplatPrototype correspondiente a la textura correcta. También me dice que el valor ha cambiado. Pero nada se actualiza en la vista gráfica real.
Entonces, ¿qué me estoy perdiendo?