如何在Unity中的3D点绘制球体或点?

时间:2017-10-04 16:11:17

标签: c# unity3d unity3d-2dtools

我喜欢在3D点阵列上绘制具有一定小半径的小球体或点。我在Prefabs中使用了Sphere GameObject,并在需要绘制时实例化它。由于我策划了很多,系统无法处理。

我需要绘制的方式是

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的新手。感谢。

1 个答案:

答案 0 :(得分:1)

首先,让我们看看第一种方法 这里的主要问题,以及系统无法处理计算的原因(我认为它需要太长时间和统一冻结),是因为你使用Instantiate / Destroy(FindWithTag,你最好只是在Start中保存引用) ,并在大量迭代中直接读取。

为了优化这一点,你可以事先创建所有游戏对象(实例化它们)(编辑模式或开始),而不是改变它们的位置。如果你只是改变它们的位置,并且在框架中每次停止使用Instantiate / Destroy,这应该会给你带来狡猾的结果,它们是你在第一种方法中的主要问题。

至于第二个,这个代码是创建一个网格,定义它的顶点,但它们只是点,如果你想要它们显示你必须为它们定义trianlges和法线。如果你想使用这种方法,请阅读有关网格的更多信息,但我不认为这会给你你想要的东西。