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
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity中的图片破碎效果是通过使用碎片化工具和碎片化系统来实现的。首先,开发者可以使用一些专门的插件或工具将原始图片进行碎片化处理。这些工具可以根据不同的需求,将图片分成不同形状和大小的碎片,并赋予每个碎片不同的物理属性。 在Unity中,开发者可以通过创建碎片化系统来模拟图片的破碎效果。碎片化系统主要由两部分组成:碰撞器和物理效果。通过给每个碎片添加碰撞器,可以实现碎片之间的碰撞和触发效果。同时,开发者还可以为每个碎片添加刚体组件,以实现真实的物理特性,例如重力、弹性等。 当图片破碎效果触发时,开发者可以通过脚本控制碎片的生成和运动。通过使用碰撞检测,可以实现碎片之间的碰撞反应,例如碎片之间的碰撞产生更小的碎片,或者碎片与其他物体的碰撞产生反弹效果等。同时,开发者还可以根据需要调整碎片的形状、大小和贴图,以达到更真实的破碎效果。 除了基本的破碎效果外,开发者还可以添加额外的特效来增强图片破碎效果。例如,在碎片破碎时添加粒子效果,可以使破碎效果更加生动。此外,还可以使用声音效果来增加破碎效果的沉浸感。 总之,Unity中的图片破碎效果可以通过使用碎片化工具和碎片化系统来实现。开发者可以根据需要,对图片进行碎片化处理,并为每个碎片设置物理属性和碰撞器。通过脚本控制碎片的生成和运动,并添加额外的特效,可以实现更加真实和生动的破碎效果

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值