Unity: làm thế nào để áp dụng các thay đổi theo chương trình cho Terrain SplatPrototype?


8

Tôi có một tập lệnh mà tôi thêm một đối tượng Địa hình (Tôi kéo và thả địa hình trong trường Địa hình công cộng).

Địa hình đã được thiết lập trong Unity để có 2 PaintTextures: 1 là Hình vuông (được thiết lập với kích thước ô sao cho hình thành mô hình rô) và hình thứ hai là hình ảnh cỏ:

Ảnh chụp màn hình đoàn kết

Ngoài ra, Sức mạnh mục tiêu của PaintTexture đầu tiên được hạ xuống để mô hình rô cũng lộ ra một số cỏ bên dưới.

Bây giờ tôi muốn, trong thời gian chạy, để thay đổi Kích thước Ngói của PaintTexture đầu tiên, tức là có nhiều trình kiểm tra tùy thuộc vào các điều kiện thời gian chạy khác nhau. Tôi đã xem qua tài liệu của Unity và tôi thấy bạn có Terrain.terrainData.SplatPrototypemảng cho phép bạn thay đổi điều này. Ngoài ra có một RefreshPrototypes()phương thức trên terrainDatađối tượng và một Flush()phương thức trên Terrainđối tượng. Vì vậy, tôi đã thực hiện một kịch bản như thế này:

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();
    }

//...

Vấn đề là, không có gì được thay đổi, bản đồ kiểm tra không được lát lại. Bảng điều khiển xuất ra một cách chính xác cho tôi biết rằng tôi đã có đối tượng Địa hình với đúng tên, rằng nó có đúng số nguyên mẫu splat và tôi đang sửa đổi kích thước ô trên đối tượng SplatPrototype tương ứng với kết cấu bên phải. Nó cũng cho tôi biết giá trị đã thay đổi. Nhưng không có gì được cập nhật trong chế độ xem đồ họa thực tế.

Vì vậy, xin vui lòng, tôi đang thiếu gì?


nếu bạn có một shader cusom và bạn muốn tạo các đường kẻ màu xanh trên bản đồ với các giá trị khác nhau, cách rẻ nhất là làm điều đó trong shader ... các đường màu xanh là: round (frac (x * .1) ... quái gì đặt nó trong một câu trả lời
com.p Hiểu được

Câu trả lời:


1

Có vẻ như bạn đã quên gán lại kết cấu Splat:

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();
}

//...

Bằng cách này, bạn có thể đã làm theo cách này:

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

(Và sau đó làm mới nhưng tôi thậm chí không chắc là nó cần thiết ở trạng thái này)

BIÊN TẬP :

Có một số tham số trong các đối tượng không thể được tham chiếu và tôi tin

splatPrototype.tileSize

là một trong số đó vì vậy nếu bạn làm:

SplatPrototype aStarCellSplat = splatPrototypes[0];

sau đó aStarCellSplat là một bản sao của splatPrototypes [0] nhưng không tham chiếu nó. đôi khi nhân bản để lấy giá trị ban đầu và lặp lại từ nó là tốt đặc biệt là khi bạn sửa đổi cấu trúc phức tạp, nhưng trong trường hợp này, một cuộc gọi tham số đơn giản sẽ dễ dàng hơn.

Và theo dõi các bản sao của bạn, nếu bạn nhân bản đừng quên gán lại


-1

để tạo các đường màu xanh thông qua shader, bạn cần phải có texture_uv trong hàm bề mặt hoặc trong hàm fract ...

để tạo các đường lưới màu xanh / xám trong shaderlab, bạn phải thêm tổng cộng 4-5 dòng vào trình đổ bóng, bên trong chức năng lướt:

xline = trần (frac (uv.x * .1) -. 75); yline = tương tự cho y

lưới = max (xline, yline);

o.albedo.blueval = lưới.

sau đó, bạn có thể thay đổi kích thước lưới yoru bằng cách sử dụng 1 cuộc gọi đến trình đổ bóng, để thay đổi giá trị của trình đổ bóng, .l tạo lưới 10 mét, thay đổi giá trị đó thành kích thước lưới không chính xác, .75 tạo một lưới 3/4 diện tích của màn hình .

sau đó điều chỉnh màu sắc thêm toán học vào cùng màu đã được sử dụng trên phiên bản / splatmap trước đó.


Trong khi cung cấp một số thông tin hữu ích, điều này không thực sự trả lời câu hỏi được hỏi trực tiếp. Nếu OP thực sự muốn biết làm thế nào để làm điều này thông qua shader, anh ta sẽ hỏi.
Pip
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.