问题描述
我正在尝试存储有关由不同游戏对象中的 6 个独立面构建的立方体的信息。所以我可以有这个立方体的多个版本,每个版本都有不同的参数,比如颜色、大小、每个面的分辨率等。重要的是,最后我有一个具有完全不同值的对象的 n 个版本或副本。 面作为子对象生成,仅包含网格渲染器和网格过滤器组件。
我的第一次尝试是用现有的立方体对象制作一个预制件,然后在其他地方实例化这个预制件(比如在不同场景中的占位符变换)。 当我用现有的立方体创建一个预制件时,每个面的 MeshFilter 都是空的/空的。
另一个尝试是考虑以某种方式保存所有参数,然后将它们应用到另一个立方体。但我不确定如何以正确的方式做到这一点?也许让整个事情成为一个可编写脚本的对象,或者我不知道。
另一个核心问题是,如果我复制多维数据集,然后更改其中一个的值,所有多维数据集都会因生成多维数据集的方式而改变。任何如何解决这个问题的建议都会有很大帮助!
FACES.cs:
private Mesh mesh;
private int resolution;
private Vector3 localUp;
private Vector3 axisA,axisB;
public Face(Mesh mesh,int resolution,Vector3 localUp)
{
this.mesh = mesh;
this.resolution = resolution;
this.localUp = localUp;
axisA = new Vector3(localUp.y,localUp.z,localUp.x);
axisB = Vector3.Cross(localUp,axisA);
}
public void ConstructMesh()
{
Vector3[] vertices = new Vector3[resolution * resolution];
// getting nb of vertices; nmb of faces = (r-1)^2; *2 for triangles; *3 to get all vertices for every triangle
int[] triangles = new int[(resolution - 1) * (resolution - 1) * 6];
int triangleIndex = 0;
for (int y = 0; y < resolution; y++)
{
for (int x = 0; x < resolution; x++)
{
// index of vertices
int i = x + y * resolution;
Vector2 percent = new Vector2(x,y) / (resolution - 1);
Vector3 pointOnUnitCube = localUp + (percent.x - 0.5f) * 2 * axisA + (percent.y - 0.5f) * 2 * axisB;
// get vertices same distance to center of cube
Vector3 pointOnUnitSphere = pointOnUnitCube.normalized;
// calculate elevation and set them to the vertices
vertices[i] = pointOnUnitSphere;
// check if index is not outside the face
if (x != resolution - 1 && y != resolution - 1)
{
// first triangle,clockwise
triangles[triangleIndex] = i;
triangles[triangleIndex + 1] = i + resolution + 1;
triangles[triangleIndex + 2] = i + resolution;
// second triangle,clockwise
triangles[triangleIndex + 3] = i;
triangles[triangleIndex + 4] = i + 1;
triangles[triangleIndex + 5] = i + resolution + 1;
// update triangleIndex by 6 because we created 6 triangle
triangleIndex += 6;
}
}
}
mesh.Clear();
mesh.vertices = vertices;
mesh.triangles = triangles;
mesh.RecalculateNormals();
}
CUBE.CS:
public int resolution = 5;
[SerializeField,HideInInspector]
private MeshFilter[] meshFilters;
private Face[] faces;
void Initialize()
{
if (meshFilters == null || meshFilters.Length == 0)
{
meshFilters = new MeshFilter[6];
}
faces = new Face[6];
// all cardinal directions
Vector3[] directions = { Vector3.up,Vector3.down,Vector3.left,Vector3.right,Vector3.forward,Vector3.back };
for (int i = 0; i < 6; i++)
{
if(meshFilters[i] == null)
{
GameObject meshObj = new GameObject("mesh");
meshObj.transform.parent = transform;
meshObj.AddComponent<MeshRenderer>().sharedMaterial = new Material(Shader.Find("Universal Render Pipeline/Lit"));
meshFilters[i] = meshObj.AddComponent<MeshFilter>();
meshFilters[i].sharedMesh = new Mesh();
}
// generate Faces
faces[i] = new Face(meshFilters[i].sharedMesh,resolution,directions[i]);
}
}
void GenerateMesh()
{
foreach (Face face in faces)
{
face.ConstructMesh();
}
}
private void OnValidate()
{
Initialize();
GenerateMesh();
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)