Saya memiliki skrip yang saya tambahkan objek Terrain (saya seret dan lepas terrain di bidang Terrain publik).
Terrain sudah disiapkan di Unity untuk memiliki 2 PaintTextures: 1 adalah kotak (disiapkan dengan ukuran ubin sehingga membentuk pola kotak-kotak) dan yang ke-2 adalah gambar rumput:
Juga Kekuatan Target dari PaintTexture pertama diturunkan sehingga pola kotak-kotak juga mengungkapkan beberapa rumput di bawahnya.
Sekarang saya ingin, pada saat run time, untuk mengubah Ukuran Tile dari PaintTexture pertama, yaitu memiliki lebih atau kurang checker tergantung pada berbagai kondisi run time. Saya telah melihat dokumentasi Unity dan saya telah melihat Anda memiliki Terrain.terrainData.SplatPrototype
array yang memungkinkan Anda untuk mengubah ini. Juga ada RefreshPrototypes()
metode pada terrainData
objek dan Flush()
metode pada Terrain
objek. Jadi saya membuat skrip seperti ini:
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();
}
//...
Masalahnya adalah, tidak ada yang berubah, peta pemeriksa tidak disusun ulang. Keluaran konsol dengan benar memberi tahu saya bahwa saya mendapatkan objek Terrain dengan nama yang tepat, bahwa ia memiliki jumlah prototipe percikan yang tepat dan bahwa saya memodifikasi tileSize pada objek SplatPrototype yang sesuai dengan tekstur yang tepat. Ini juga memberitahu saya bahwa nilainya telah berubah. Tapi tidak ada yang diperbarui dalam tampilan grafis aktual.
Jadi tolong, apa yang saya lewatkan?
sumber
Jawaban:
Tampaknya Anda lupa untuk menetapkan kembali tekstur Splat kembali:
Yang omong-omong Anda bisa melakukannya dengan cara ini:
(Dan kemudian menyegarkan tapi saya bahkan tidak yakin itu diperlukan pada kondisi ini)
EDIT:
Ada beberapa parameter dalam objek yang tidak dapat direferensikan dan saya percaya
adalah salah satunya jadi jika Anda melakukannya:
maka aStarCellSplat adalah klon dari splatPrototypes [0] tetapi tidak merujuknya. kadang-kadang kloning untuk mendapatkan nilai awal dan beralih dari itu bagus terutama ketika Anda memodifikasi struktur yang kompleks, tetapi dalam hal ini panggilan parameter sederhana lebih mudah.
Dan tetap melacak klon Anda, jika Anda mengkloning jangan lupa untuk menetapkan kembali
sumber
untuk membuat garis biru melalui shader, Anda harus memiliki tekstur_uv di fungsi permukaan, atau di fungsi fraktur ...
untuk membuat garis kotak biru / abu-abu di shaderlab, Anda harus menambahkan total 4-5 garis ke shader, di dalam fungsi selancar:
xline = ceil (frac (uv.x * .1) -. 75); yline = sama untuk y
kisi = maks (xline, yline);
o.albedo.blueval = kisi.
maka Anda dapat mengubah ukuran kisi yoru menggunakan 1 panggilan ke shader, untuk mengubah nilai shader, .l membuat kisi 10 meter, mengubah nilai itu menjadi hanya kisi ukuran, .75 membuat kisi 3/4 dari area layar .
kemudian atur warna menambahkan matematika ke yang sama yang digunakan pada versi / splatmap sebelumnya.
sumber