对于Unity 3D用户来说,这是一个简单但有趣的问题。我的目标是一个应用程序,我可以在其中进行交互(f.e.选择6个表面中的1个)与一个立方体的表面,而不创建6个游戏对象,并将它们组合到一个立方体。有没有人有主意或线索?
发布于 2020-11-10 22:40:11
最简单的方法可能就像你描述的那样:用多个独立的对象和碰撞器等构建你的立方体
作为另一种选择,我会自己创建立方体网格,因为这样你就可以确定哪个三角形属于哪个边。(当然,您也可以使用默认的多维数据集和试错,直到您知道哪个三角形索引属于哪一方)
private MeshCollider _collider;
private void Start()
{
var mesh = new Mesh();
var verts = new Vector3[]
{
new Vector3 (-0.5f; -0.5f; -0.5f), // index 0
new Vector3 (-0.5f; 0.5f; -0.5f), // index 1
new Vector3 (0.5f; 0.5f; -0.5f),. // index 2
new Vector3 (0.5f; -0.5f; -0.5f), // index 3
new Vector3 (-0.5f; -0.5f; 0.5f), // index 4
new Vector3 (-0.5f; 0.5f; 0.5f), // index 5
new Vector3 (0.5f; 0.5f; 0.5f), // index 6
new Vector3 (0.5f; -0.5f; 0.5f) // index 7
};
var tris = new int[]
{
// Front
0, 2, 1, // index 0
0, 3, 2, // index 1
// Back
5, 6, 4, // index 2
5, 7, 6, // index 3
// Top
3, 6, 2, // index 4
3, 7, 6, // index 5
// Bottom
4, 1, 5 // index 6
4, 0, 1, // index 7
// Left
4, 3, 0, // index 8
4, 7, 3 // index 8
// Righ
1, 6, 5, // index 10
1, 2, 6 // index 11
};
mesh.vertices = verts;
mesh.triangles = tris;
mesh.RecalculateNormals();
mesh.RecalculateBounds();
var obj = new GameObject ("Cube", typeof(MeshFilter), typeof (MeshRenderer));
obj.GetComponent<MeshRenderer>().material = new Material(Shader.Find("Specular"));
obj.GetComponent<MeshFilter>().mesh = mesh;
_collider = obj.AddComponent<MeshCollider>();
_collider.mesh = mesh;
obj.transform.position = Camera.main.position + Vector3.forward * 7;
obj.transform.rotation = Quaternion.Euler(45, 45, 45);
}然后简单地使用RaycastHit.triangleIndex来确定你正在命中哪个三角形,你可以通过将索引映射到相应的边来知道这一边,例如->。
enum Side
{
Front,
Back,
Top,
Bottom,
Left,
Right
}
Dictionary<int,Side> triangleIdxToSide = new Dictionary<int,Side>
{
{0, Side.Front},
{1, Side.Front},
{2, Side.Back},
{3, Side.Back},
{4, Side.Top},
{5, Side.Top},
{6, Side.Bottom},
{7, Side.Bottom},
{8, Side.Left},
{9, Side.Left},
{10, Side.Right},
{11, Side.Right}
}
void Update ()
{
var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if(_collider.Raycast(ray, out var hit))
{
Debug.Log($"Currently pointing on {triangleIdxToSide[hit.triangleIndex]} of the cube", this);
}
}注意:在智能手机上输入,但我希望这个想法变得清晰
https://stackoverflow.com/questions/64766211
复制相似问题