接上回 Rounded Cube 4.本章主题如下:

  • Combine primitive colliders. 合并原始网格

此为本人阅读笔记不作为转载处理,详细还请参看原文. 原文地址

圆滑的立方体碰撞并不是圆滑的,所以就有了本章节来解决这个问题。添加如下方法:

1
2
3
4
5
6
7
8
9
10
private void Generate () {
GetComponent<MeshFilter>().mesh = mesh = new Mesh();
mesh.name = "Procedural Cube";
CreateVertices();
CreateTriangles();
CreateColliders();
}
private void CreateColliders () {
}

第一步添加一个cube碰撞器

1
2
3
private void CreateColliders () {
gameObject.AddComponent<BoxCollider>();
}

单个盒子碰撞器

事实证明,Unity足够智能的定位和缩放碰撞器,使其与我们网格的边界框匹配。 现在,我们必须缩放碰撞器,使其与两个相对面的平坦侧面相匹配。 由于这三个面对都需要完成,我们最终得到三个相交的块。

1
2
3
4
5
6
7
8
9
10
private void CreateColliders () {
AddBoxCollider(xSize, ySize - roundness * 2, zSize - roundness * 2);
AddBoxCollider(xSize - roundness * 2, ySize, zSize - roundness * 2);
AddBoxCollider(xSize - roundness * 2, ySize - roundness * 2, zSize);
}
private void AddBoxCollider (float x, float y, float z) {
BoxCollider c = gameObject.AddComponent<BoxCollider>();
c.size = new Vector3(x, y, z);
}

平坦区域的盒子碰撞

我们可以用胶囊来填充棱角。我们需要给他们正确的方向,把他们定位在每一个边缘的中心。

1
2
3
4
5
6
7
private void AddCapsuleCollider (int direction, float x, float y, float z) {
CapsuleCollider c = gameObject.AddComponent<CapsuleCollider>();
c.center = new Vector3(x, y, z);
c.direction = direction;
c.radius = roundness;
c.height = c.center[direction] * 2f;
}

我们每边需要一个胶囊,总共有十二个胶囊。 我创建了最小,最大和最大的矢量,以使放置更容易。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private void CreateColliders () {
AddBoxCollider(xSize, ySize - roundness * 2, zSize - roundness * 2);
AddBoxCollider(xSize - roundness * 2, ySize, zSize - roundness * 2);
AddBoxCollider(xSize - roundness * 2, ySize - roundness * 2, zSize);
Vector3 min = Vector3.one * roundness;
Vector3 half = new Vector3(xSize, ySize, zSize) * 0.5f;
Vector3 max = new Vector3(xSize, ySize, zSize) - min;
AddCapsuleCollider(0, half.x, min.y, min.z);
AddCapsuleCollider(0, half.x, min.y, max.z);
AddCapsuleCollider(0, half.x, max.y, min.z);
AddCapsuleCollider(0, half.x, max.y, max.z);
AddCapsuleCollider(1, min.x, half.y, min.z);
AddCapsuleCollider(1, min.x, half.y, max.z);
AddCapsuleCollider(1, max.x, half.y, min.z);
AddCapsuleCollider(1, max.x, half.y, max.z);
AddCapsuleCollider(2, min.x, min.y, half.z);
AddCapsuleCollider(2, min.x, max.y, half.z);
AddCapsuleCollider(2, max.x, min.y, half.z);
AddCapsuleCollider(2, max.x, max.y, half.z);
}

为接下来的动作做准备

剩下要做的就是在圆角立方体上加一个刚体,恭喜你,看完了本章教程。