Unity物体破碎效果

    物体破碎的效果在游戏中非常常见,在本文中将实现任意大小的长方体的敲击破碎,并为实现更复杂物体的破碎效果做好铺垫。
    最终效果图如下:
效果图
    为了实现这种破碎效果,我们必须生成碎片物体,在本例中将根据敲击点生成四个碎片物体。在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个顶点,就能生成四个碎片,再添加力,就可以实现炫酷了破碎效果了。


工程下载链接请关注公众号SFGame后(*^_^*)回复:物体破碎

更多个人原创博客,可关注公众号SFGame
在这里插入图片描述

  • 15
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值