2016-02-04 32 views
1

我一直在爲Unity構建一個程序生成器,它需要噪聲並使用它來構建高度圖。在Unity中創建程序化網格生成器時的大小問題

到目前爲止,只要我將網格的大小限制在250x250左右,所有東西都可以工作。如果我嘗試製作更大的網格,則腳本將不會計算它。

令人困惑的是我沒有記憶錯誤或任何性質的東西。我已經實現了一個Regenerate按鈕,它允許我在Unity中生成一個新的網格,只要我保持在250x250或更小的範圍內,它就可以正常工作。如果我選擇一個更大的值,網格保持不變。

如何計算網:

using UnityEngine; 
using System.Collections; 
using UnityEditor; 
using System.IO; 

[ExecuteInEditMode] 
[RequireComponent(typeof(MeshFilter))] 
[RequireComponent(typeof(Noise))] 
public class CustomTerrain : MonoBehaviour { 
    //Note: sizeX*sizeZ determines mesh size. 
    public int sizeX = 4; //These values are public so they can be 
    public int sizeZ = 4; //modified in the Unity Editor. 
    public float noiseSize = 1.0f; 
    public float cellSize = 1.0f; 
    private string mPath = "Assets/Generated/"; 
    Noise noise; 

    void Start() { 
     noise = GetComponent<Noise>(); 
     this.LoadMesh(); 
     if (!GetComponent<MeshFilter>().sharedMesh) { 
      this.Regenerate(); 
     } 
    } 
    public void LoadMesh() { 
     Mesh mesh = Instantiate(AssetDatabase.LoadMainAssetAtPath(mPath + gameObject.name + ".asset") as Mesh); 
     if (mesh) { 
      GetComponent<MeshFilter>().mesh = mesh; 
     } 
     recalculateMeshCollider(mesh); 
    } 

    Vector3[] GenVertices() { 
     float x, z; 
     int w = (sizeX+1); 
     int l = (sizeZ+1); 
     Vector3[] vertices = new Vector3[w*l]; 
     for (int gx = 0; gx < w; gx++) { 
      for (int gz = 0; gz < l; gz++) { 
       x = gx*cellSize; 
       z = gz*cellSize; 
       float height = (noiseSize * noise.Get(x,z)); 
       vertices[gx*l+gz] = new Vector3(x, height, z); 
      } 
     } 
     return vertices; 
    } 

    int[] GenTriangles() { 
     int vertciesPerTriangle = 3; 
     int trianglesPerCell = 2; 
     int numberCells = sizeX * sizeZ; 
     int[] triangles = new int[vertciesPerTriangle * trianglesPerCell * numberCells]; 

     int tIndeX = 0; 
     for (int cX = 0; cX < sizeX; cX++) { 
      for (int cZ = 0; cZ < sizeZ; cZ++) { 
       int n = cX*(sizeZ+1)+cZ; 

       triangles[tIndeX] = n; 
       triangles[tIndeX+1] = n+1; 
       triangles[tIndeX+2] = n+sizeZ+2; 
       triangles[tIndeX+3] = n; 
       triangles[tIndeX+4] = n+sizeZ+2; 
       triangles[tIndeX+5] = n+sizeZ+1; 
       tIndeX +=6; 
      } 
     } 
     return triangles; 
    } 

    Vector2[] GenUVs() { 
     int w = (sizeX + 1); 
     int l = (sizeZ + 1); 
     Vector2[] uvs = new Vector2[w * l]; 

     for (int uX = 0; uX < w; uX++) { 
      for (int uZ = 0; uZ < l; uZ++) { 
       uvs[uX*l+uZ] = new Vector2((float)uX/sizeX, (float)uZ/sizeZ); 
      } 
     } 
     return uvs; 
    } 
} 

我重新生成功能:

public void Regenerate() { 
    noise.Init(); 
    Mesh mesh = GetComponent<MeshFilter>().sharedMesh; 
    if(!mesh) { 
     mesh = new Mesh(); 
     GetComponent<MeshFilter>().sharedMesh = mesh; 
    } 
    mesh.vertices = GenVertices(); 
    mesh.triangles = GenTriangles(); 
    mesh.uv = GenUVs(); 
    mesh.RecalculateNormals(); 
    recalculateMeshCollider(mesh); 
} 

public void recalculateMeshCollider(Mesh mesh) { 
    if (GetComponent<MeshCollider>()) { 
     DestroyImmediate(GetComponent<MeshCollider>()); 
    } 
    transform.gameObject.AddComponent<MeshCollider>(); 
    transform.GetComponent<MeshCollider>().sharedMesh = mesh; 
} 
+0

只是順便說一句,來Unity的許多工程師開始切割網格,然後開始寫一個美麗的遮擋......然後才意識到,Unity實際上有很棒的內置選擇!這全是自動的,用你的判斷來選擇一個好的塊大小。 – Fattie

回答

2

通過 「250×」 你的意思是有62.400三角形?

Unity擁有65535個點的頂點限制 - 只需使用多個網格,沒有問題。

+0

這當然可以解釋爲什麼我不能製作更大的網格。我擔心我的代碼有問題,所以我問了。 謝謝你通知我這件事。 –

+0

對,對不起,「沒有幫助!」 :)是的,這是一個討厭的限制。順便說一下,任何新的Unity探險家googling到這裏,在http://answers.unity3d.com/questions/263302/vertices-array-in-mesh-vertices.html http://答案一些關於網格的一般性聊天。 unity3d.com/questions/423569/meshvertices-is-too-small.html http://answers.unity3d.com/questions/266972/detecting-mesh-orientation.html !!! – Fattie

+0

同樣對於任何新讀者,當你寫作時,請注意Unity中經典的Gotchya。翻譯版本**爲副本製作副本**。查看http://answers.unity3d.com/answers/417487/view.html上的許多帖子!!! – Fattie