Unity物体破碎效果
程序员文章站
2022-03-21 23:50:00
...
物体破碎的效果在游戏中非常常见,在本文中将实现任意大小的长方体的敲击破碎,并为实现更复杂物体的破碎效果做好铺垫。
最终效果图如下:
为了实现这种破碎效果,我们必须生成碎片物体,在本例中将根据敲击点生成四个碎片物体。在Unity中,物体的形状是由MeshFilter组件中的Mesh对象决定的。也就是说,只要我们创建恰当的Mesh对象,我们就能够生成任意形状的物体。
从Mesh类的属性中,可以看出跟物体形状有关的属性为:
//Vector3数组,储存顶点的相对位置
public Vector3[] vertices { get; set; }
//int数组,每三个数字一个三角面的顶点信息,每一个数字都是vertices的索引
public int[] triangles { get; set; }
输出一个cube的vertices如下(部分):
输出一个cube的triangles如下(部分):
很显然,如果从零构造一个物体,是比较复杂的。不过只是生成碎片的话,我们其实只需要更改部分顶点位置。
利用这种思路,生成一个碎片:
//生成Mesh对象
private Mesh GenMesh(Mesh mesh, Vector3 hitPoint)
{
List<Vector3> mesh_vertices = new List<Vector3>();
List<Vector3> piece_vertices = new List<Vector3>();
int[] mesh_triangles = mesh.GetTriangles(0);
List<Vector3> piece_normals = new List<Vector3>();
mesh.GetVertices(mesh_vertices);
mesh.GetNormals(piece_normals);
foreach (Vector3 item in mesh_vertices)
{
piece_vertices.Add(item);
}
int i = 0;
foreach (Vector3 v in mesh_vertices)
{
if (v == new Vector3(0.5f, 0.5f, 0.5f) || v == new Vector3(0.5f, 0.5f, -0.5f))
{
piece_vertices[i] = new Vector3(hitPoint.x, hitPoint.y, v.z);
}
else
{
if (v.x == 0.5f)
{
piece_vertices[i] = new Vector3(0, v.y, v.z);
}
if (v.y == 0.5f)
{
piece_vertices[i] = new Vector3(v.x, 0, v.z);
}
}
i++;
}
Mesh piece = new Mesh();
piece.SetVertices(piece_vertices);
piece.SetTriangles(mesh_triangles,0);
//法线信息与光照相关
piece.SetNormals(piece_normals);
return piece;
}
//生成物体
private GameObject GenPiece(Mesh piece_mesh,MeshRenderer meshRender)
{
GameObject piece = new GameObject("piece");
piece.transform.position = transform.position;
piece.transform.localScale = transform.localScale;
MeshRenderer piece_render = piece.AddComponent<MeshRenderer>();
piece_render.material = meshRenderer.material;
piece.AddComponent<MeshFilter>().mesh = piece_mesh;
Rigidbody rig = piece.AddComponent<Rigidbody>();
piece.AddComponent<MeshCollider>().convex = true;
return piece;
}
//撞击点计算
//hit.transform.localScale为破碎目标缩放信息
Vector2 hitPoint = raycastHit.transform.position - raycastHit.point;
-new Vector2(hitPoint.x / hit.transform.localScale.x, hitPoint.y / hit.transform.localScale.y)
效果如图:
以上修改了cube的右上角顶点,以及与右上角x或y相同的顶点,以此生成了1/4的碎片。
只要分别修改4个顶点,就能生成四个碎片,再添加力,就可以实现炫酷了破碎效果了。
工程下载链接
更多个人原创博客,可前往我的个人网站哦!
传送门:暮雨ss
上一篇: 常见前端跨域解决方案分享
下一篇: 结构体内存对齐和大小端