テレインオブジェクトを追加するスクリプトがあります(パブリックテレインフィールドにテレインをドラッグアンドドロップします)。
テレインはすでにUnityで2つのPaintTexturesが設定されています。1は正方形(タイルサイズで設定され、市松模様のパターンを形成する)で、2つ目は草の画像です。
また、最初のPaintTextureのターゲット強度が低下しているため、市松模様のパターンによって下にある草の一部も表示されます。
ここで、実行時に、最初のPaintTextureのタイルサイズを変更します。つまり、さまざまな実行時の条件に応じて、チェッカーを増減します。Unityのドキュメントを調べたところ、Terrain.terrainData.SplatPrototype
これを変更できる配列があることがわかりました。またRefreshPrototypes()
、terrainData
オブジェクトのFlush()
メソッドとオブジェクトのメソッドがありTerrain
ます。だから私はこのようなスクリプトを作りました:
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();
}
//...
問題は、何も変更されず、チェッカーマップが再タイル化されないことです。コンソール出力は、正しい名前のTerrainオブジェクトがあり、適切な数のスプラットプロトタイプがあり、正しいテクスチャに対応するSplatPrototypeオブジェクトのtileSizeを変更していることを正しく通知します。また、値が変更されたことがわかります。しかし、実際のグラフィック表示では何も更新されません。
では、何が欠けているのですか?