欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unity物体破碎效果

程序员文章站 2022-03-21 23:50:00
...

    物体破碎的效果在游戏中非常常见,在本文中将实现任意大小的长方体的敲击破碎,并为实现更复杂物体的破碎效果做好铺垫。
    最终效果图如下:
Unity物体破碎效果
    为了实现这种破碎效果,我们必须生成碎片物体,在本例中将根据敲击点生成四个碎片物体。在Unity中,物体的形状是由MeshFilter组件中的Mesh对象决定的。也就是说,只要我们创建恰当的Mesh对象,我们就能够生成任意形状的物体。
    从Mesh类的属性中,可以看出跟物体形状有关的属性为:

//Vector3数组,储存顶点的相对位置
public Vector3[] vertices { get; set; }
//int数组,每三个数字一个三角面的顶点信息,每一个数字都是vertices的索引
public int[] triangles { get; set; }

    输出一个cube的vertices如下(部分):
Unity物体破碎效果
    输出一个cube的triangles如下(部分):
Unity物体破碎效果
    很显然,如果从零构造一个物体,是比较复杂的。不过只是生成碎片的话,我们其实只需要更改部分顶点位置。

利用这种思路,生成一个碎片:

//生成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)

    效果如图:
Unity物体破碎效果
以上修改了cube的右上角顶点,以及与右上角x或y相同的顶点,以此生成了1/4的碎片。

只要分别修改4个顶点,就能生成四个碎片,再添加力,就可以实现炫酷了破碎效果了。

工程下载链接

更多个人原创博客,可前往我的个人网站哦!
传送门:暮雨ss

相关标签: unity