我应该在哪里存储网格数据;在静态变量中,它是自己的类,还是一个类中的所有网格类型?

时间:2018-08-15 07:47:12

标签: c# unity3d voxel

我正在尝试使用Unity制作体素,而我想不遵循教程就这样做。作为一个简单的例子,考虑到Minecraft,我应该在哪里存储不同的网格数据?例如,一个污垢块将具有一个立方体网格,而楼梯将具有一个不同的网格。非静态块类中是否应该是其他静态变量?例如:

public class Block
{
    static Vector3[] cubeVertices = new Vector3[]{input cube verts here}
    static Vector3[] stairsVertices = new Vector3[]{input stairs verts here}

    //Block data such as textures, type, etc...
    public string blockName;
    public BlockType blockType;
    public Texture blockTexture;
}

然后,当我生成网格时,只需执行blockInstance.cubeVertices或.stairsvertices。

我想做的第二种方法是为每种网格类型创建单独的类。例如:

public class CubeMeshData
{
    //insert vert and tri data here
}

我的困境是,我不确定每次生成块时如何在不迭代if语句或开关的情况下选择要使用的网格数据。因此,当我放置一个污垢块时,请反复进行迭代以选择cubeMesh。我觉得迭代很昂贵。我的最后选择有同样的问题。一个类,其中包含所有网格数据,并带有一个选择开关。这是我的第一次尝试,因此我实际上有以下代码:

public static class MeshTypes
{
    public static void ChooseMeshType(BlockType blockType, Mesh mesh)
    {
        mesh.Clear();
        switch(blockType)
        {
            case BlockType.Cube:
                mesh.vertices = new Vector3[]
                {
                    new Vector3(-1, 1, 1),
                    new Vector3(1, 1, 1),
                    new Vector3(1, 1, -1),
                    new Vector3(-1, 1, -1),
                    new Vector3(-1, -1, -1),
                    new Vector3(1, -1, -1),
                    new Vector3(1, -1, 1),
                    new Vector3(-1, -1, 1)
                };
                mesh.triangles = new int[] 
                {
                    0, 1, 2, 0, 2, 3,
                    4, 5, 6, 4, 6, 7,
                    1, 0, 7, 1, 7, 6,
                    2, 1, 6, 2, 6, 5,
                    3, 2, 5, 3, 5, 4,
                    0, 3, 4, 0, 4, 7
                };
                mesh.RecalculateNormals();
                break;
        }
    }
}

这是到目前为止可以调用这些代码的代码:

[RequireComponent(typeof(MeshFilter))]
public class DrawMeshes : MonoBehaviour 
{
    Mesh mesh;

    Vector3[] verts;
    int[] tris;

    private void Awake()
    {
        mesh = GetComponent<MeshFilter>().mesh;
    }

    void Start ()
    {
        MeshTypes.ChooseMeshType(BlockType.Cube, mesh);

        //CreateMesh();
    }

    private void CreateMesh()
    {
        mesh.Clear();
        mesh.vertices = CubeMesh.cubeVerts;
        mesh.triangles = CubeMesh.cubeTris;
        mesh.RecalculateNormals();
    }
}

如果我使用MeshTypes类,那么我将使用MeshType.ChooseMesh进行实验;如果使用单独的类,则将使用CreateMesh。这就是为什么他们都在那里。我从来没有做过任何需要优化的事情,因此我不了解通过开关的价格如何。在此先感谢您,希望我的帖子合适。

编辑更新8/15/18:因此,我一直在研究Dictionary。我对运行时间不是很熟悉,但是与开关的线性迭代相比,字典对数运行。根据我的阅读,这几乎具有恒定的运行速度。我相信这样做会更好,因为我将来会添加许多不同的类型:立方体,楼梯,平板,围栏等……非常类似于Minecraft。现在,我只需要找出实现它的最佳方法。我将尝试使该帖子保持最新状态,以便任何偶然发现它的人都能得到答案。

编辑更新8/18/18:我发现了这个问题:How to share one value among multiple objects? C#

我决定将这样的东西用于积木。共享的数据将成为多维数据集网格,然后我将初始化将使用该数据的不同块。

0 个答案:

没有答案