2017-10-04 414 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