Ich habe ein Skript, zu dem ich ein Terrain-Objekt hinzufüge (ich ziehe das Terrain per Drag & Drop in das öffentliche Terrain-Feld).
Das Terrain ist bereits in Unity für 2 PaintTextures eingerichtet: 1 ist ein Quadrat (so eingerichtet, dass es ein Schachbrettmuster bildet) und das zweite ist ein Grasbild:
Außerdem wird die Zielstärke der ersten PaintTexture verringert, sodass das Schachbrettmuster auch einen Teil des darunter liegenden Grases freigibt.
Jetzt möchte ich zur Laufzeit die Kachelgröße der ersten PaintTexture ändern, dh je nach Laufzeitbedingungen mehr oder weniger Prüfer haben. Ich habe die Dokumentation von Unity durchgesehen und festgestellt, dass Sie über das Terrain.terrainData.SplatPrototype
Array verfügen, mit dem Sie dies ändern können. Es gibt auch eine RefreshPrototypes()
Methode für das terrainData
Objekt und eine Flush()
Methode für das Terrain
Objekt. Also habe ich ein Skript wie dieses erstellt:
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();
}
//...
Das Problem ist, dass nichts geändert wird und die Checker-Map nicht neu gekachelt wird. Die Konsolenausgaben sagen mir korrekt, dass ich das Terrain-Objekt mit dem richtigen Namen habe, dass es die richtige Anzahl von Splat-Prototypen hat und dass ich die tileSize für das SplatPrototype-Objekt entsprechend der richtigen Textur ändere. Es sagt mir auch, dass sich der Wert geändert hat. In der tatsächlichen grafischen Ansicht wird jedoch nichts aktualisiert.
Also bitte, was fehlt mir?