Unity: bagaimana cara menerapkan perubahan program pada Terrain SplatPrototype?

8

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:

Tangkapan layar kesatuan

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.SplatPrototypearray yang memungkinkan Anda untuk mengubah ini. Juga ada RefreshPrototypes()metode pada terrainDataobjek dan Flush()metode pada Terrainobjek. 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?

Shivan Dragon
sumber
jika Anda memiliki cusom shader dan Anda ingin membuat garis kotak biru pada peta dengan nilai yang berbeda, cara termurah adalah melakukannya di shader ... garis biru adalah: bulat (frac (x * .1) ... heck sakit taruh dalam jawaban
com.pr

Jawaban:

1

Tampaknya Anda lupa untuk menetapkan kembali tekstur Splat kembali:

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);
    splatPrototypes[0] = aStarCellSplat; // <- here
    Debug.Log("Tyling is now "+aStarCellSplat.tileSize.x+"/"+aStarCellSplat.tileSize.y);
    aStarTerrain.terrainData.RefreshPrototypes();
    aStarTerrain.Flush();
}

//...

Yang omong-omong Anda bisa melakukannya dengan cara ini:

splatPrototypes[0].tileSize = new Vector2(2000,2000); //No referencing issue this way

(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

splatPrototype.tileSize

adalah salah satunya jadi jika Anda melakukannya:

SplatPrototype aStarCellSplat = splatPrototypes[0];

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

Géry Arduino
sumber
-1

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.

com. dimengerti
sumber
Meskipun memberikan beberapa informasi yang bermanfaat, ini sebenarnya tidak menjawab pertanyaan yang diajukan secara langsung. Jika OP benar-benar ingin tahu bagaimana melakukan ini melalui shader, dia akan bertanya.
Pip