我正在尝试使用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#
我决定将这样的东西用于积木。共享的数据将成为多维数据集网格,然后我将初始化将使用该数据的不同块。