我正在开发类似Minecraft的游戏并试图让块删除正常工作。我有一个函数返回块的正确坐标,然后调用DestroyBlock(下面),它在立方体的每个方向投射6条射线,并且应该摧毁它遇到的任何四边形。然后我有另一个函数,在块被销毁之后被调用,然后更新周围的块并呈现适当的面。我的问题是这个DestroyBlock函数并不总是有效。正如你在第一次点击的图像中看到的那样,一切正常,正确的面被破坏然后渲染,但是当我第二次点击时,它只会破坏新块的一个面......
void DestroyBlocks(int x, int y, int z) {
Vector3 origin = new Vector3(x, y, z);
Ray Up = new Ray(origin + Vector3.up, Vector3.down);
Ray Down = new Ray(origin + Vector3.down, Vector3.up);
Ray North = new Ray(origin + Vector3.forward, Vector3.back);
Ray East = new Ray(origin+ Vector3.right, Vector3.left);
Ray South = new Ray(origin + Vector3.back, Vector3.forward);
Ray West = new Ray(origin + Vector3.left, Vector3.right);
RaycastHit markedQuad;
if(Physics.Raycast(Up, out markedQuad, 1f)) {
Destroy(markedQuad.transform.gameObject);
Debug.Log("Destroyed Up");
}
if(Physics.Raycast(Down, out markedQuad, 1f)) {
Destroy(markedQuad.transform.gameObject);
Debug.Log("Destroyed Down");
}
if(Physics.Raycast(North, out markedQuad, 1f)) {
Destroy(markedQuad.transform.gameObject);
Debug.Log("Destroyed North");
}
if(Physics.Raycast(East, out markedQuad, 1f)) {
Destroy(markedQuad.transform.gameObject);
Debug.Log("Destroyed East");
}
if(Physics.Raycast(South, out markedQuad, 1f)) {
Destroy(markedQuad.transform.gameObject);
Debug.Log("Destroyed South");
}
if(Physics.Raycast(West, out markedQuad, 1f)) {
Destroy(markedQuad.transform.gameObject);
Debug.Log("Destroyed West");
}
}
而且我知道由于调试消息,光线投射正在击中四边形但是由于某种原因它实际上并没有在击中它们时摧毁所有边。任何帮助或建议将不胜感激。
答案 0 :(得分:1)
发现问题。当我更新我点击的那个旁边的相邻块时,我正在重新渲染相邻块的面,而没有先检查是否已存在四边形,有效地在完全相同的位置实例化两个面。这就是为什么光线投射和破坏工作的原因,只有那里只有两个四边形,所以它只是没有出现。谢谢你的帮助。
答案 1 :(得分:0)
看不到任何图片,并且没有真正理解为什么在第一次互动后它不起作用但我很好奇:
1:你为什么要控制每个脸而不是立方体/阻挡本身?
2:我现在正在思考我的飞行器,因为你提到它并且我会创建一个Destroyable接口,用于调用触发器或与任何“破坏工具”或其他东西碰撞的块......
也许如果您提供有关您的方法的更多信息以及采用您的方式的原因,可以更容易提供帮助......