2017-10-04 413 views
0

我喜歡在3D點陣列上繪製具有特定小半徑的小球體或點。我在Prefabs中使用了Sphere GameObject,並在需要繪製時實例化它。由於我繪製了很多,系統無法處理。如何在Unity中的3D點繪製球體或點?

我需要繪製的方法是

for (int i = 1; i < 200; i++) 
{ 
    for (int j = 0; j < i; j++) 
    { 
     Instantiate(dot, start[j], new Quaternion(0,0,0,0)); 
     GameObject.Destroy(GameObject.FindWithTag("dot"), 0.01f); 
    } 
} 

因爲它是從1到200變化,因此係統不能處理它,甚至我消滅他們。

所以我改變

for (int i = 1; i < 200; i++) 
{ 
    for (int j = 0; j < i; j++) 
    { 
     //Here devicePlots.Count is same as i 
     Mesh mesh = new Mesh(); 
     mesh.vertices = devicePlots.ToArray(); 
     Color[] colors = new Color[devicePlots.Count]; 
     int[] indices = new int[devicePlots.Count]; 
     for (int j = 0; j < devicePlots.Count; j++) 
     { 
      indices[j] = j; 
      colors[j] = Color.red; 
     } 
    } 
} 

但沒有出來。

我的查詢是 (1)如果使用Instantiating GameObject的第一種方法是正確的做法,那麼該如何讓系統可以處理。 (2)如果第二種方法合適,爲什麼我看不到點? 我是Unity新手。謝謝。

+0

當你說系統無法處理它時,你是什麼意思?怎麼了? – Programmer

+0

程序變得非常慢,鼠標不能移動等。 – batuman

回答

1

首先,讓我們看看第一種方法 這裏的主要問題以及系統無法處理計算的原因(我認爲它需要太長的時間和統一凍結),是因爲你使用了Instantiate/Destroy(FindWithTag) ,你最好在Start中保存參考,並直接從中讀取)。

爲了優化這個,你可以事先創建所有的gameobjects(實例化它們)(editorMode或in start),而不是改變它們的位置。如果你只是改變他們的位置,並且停止在框架中使用Instantiate/Destroy EVERY時間,這會給你帶來不穩定的結果,它們是你在第一種方法中的主要問題。對於第二個,這段代碼創建了一個網格,定義了它的頂點,但它們幾乎都只是點,如果你想讓它們顯示出來,你必須爲它們定義trianlges和法線。如果你想使用這種方法,閱讀更多關於網格的知識,但我不認爲這會給你想要的。

+0

謝謝阿爾曼。我做了一些點和SetActive(false);然後我做了SetActive(true);逐個。 – batuman