Ho una sceneggiatura a cui aggiungo un oggetto Terreno (trascino il terreno nel campo Terreno pubblico).
Il terreno è già configurato in Unity per avere 2 PaintTextures: 1 è un quadrato (impostato con una dimensione delle tessere in modo che formi un motivo a scacchi) e il secondo è un'immagine di erba:
Inoltre, la forza target del primo PaintTexture viene abbassata in modo tale che il motivo a scacchi riveli anche parte dell'erba sottostante.
Ora voglio, in fase di esecuzione, modificare la dimensione delle tessere del primo PaintTexture, ovvero avere più o meno pedine a seconda delle varie condizioni del tempo di esecuzione. Ho esaminato la documentazione di Unity e ho visto che hai l' Terrain.terrainData.SplatPrototype
array che ti consente di cambiarlo. Inoltre c'è un RefreshPrototypes()
metodo terrainData
sull'oggetto e un Flush()
metodo Terrain
sull'oggetto. Quindi ho realizzato una sceneggiatura come questa:
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();
}
//...
Il problema è che non viene modificato nulla, la mappa del checker non viene ricostruita. Gli output della console mi dicono correttamente che ho l'oggetto Terrain con il nome giusto, che ha il giusto numero di prototipi splat e che sto modificando il tileSize sull'oggetto SplatPrototype corrispondente alla trama giusta. Mi dice anche che il valore è cambiato. Nulla viene aggiornato nella vista grafica effettiva.
Quindi per favore, cosa mi sto perdendo?