请添加图片描述

请添加图片描述


前言

  • 游戏开发和VR应用中,真实的物体破碎效果能显著提升用户体验。无论是玻璃碎裂、建筑倒塌还是物体切割,都需要强大的网格处理能力。
  • OpenFracture这款专为Unity设计的开源网格破碎工具,为开发者提供了完整的解决方案。
  • 本文会介绍OpenFracture的破碎效果、使用方法和注意事项。

【Unity 实用工具篇】 | Unity物体破碎效果 OpenFracture

一、物体破碎效果:OpenFracture

1.1 介绍

Unity中的OpenFracture是一个强大的运行时网格破碎插件,它允许开发者在游戏运行过程中动态地将3D模型分裂成多个碎片,从而创建逼真的物体破坏效果。

该插件基于Voronoi图算法生成自然的断裂模式,支持递归破碎(碎片可再次破碎)、切片破碎和预破碎等多种模式,并且与Unity的物理系统和Jobs/Burst编译器深度集成,能够高效利用多线程处理复杂破碎计算而不造成性能瓶颈。

通过简单的组件配置,开发者可以快速为任何网格物体添加可破碎属性,定义碎片数量、断裂力、触发条件等参数,同时支持自定义碎片材质、碰撞检测和音频特效,非常适合用于创建可破坏的环境、射击游戏的物体交互、爆炸效果以及解谜游戏中的物体分裂机制,极大地增强了游戏的交互真实感和视觉冲击力。

✨ 核心技术

  1. 运行时网格断裂:通过高效的算法,插件能够在游戏运行时动态地将物体分解成多个部分,实现逼真的破碎效果。
  2. 编辑器预处理断裂:为了提高运行时性能,插件允许开发者在Unity编辑器中预先处理断裂效果,减少运行时的计算负担。
  3. 动态切割:插件提供了动态切割功能,能够在游戏过程中实时切割物体,为游戏增添更多的互动性和趣味性。
  4. 性能优化:通过减少片段数量、禁用或减少折射间隔次数等方式,插件能够有效优化性能,确保在复杂场景中也能流畅运行。
  5. 模型准备:插件支持导入自定义网格,并提供详细的模型准备指导,帮助开发者快速上手。

🎯 插件特点

  • 灵活性:插件提供了多种功能,包括运行时断裂、预处理断裂和动态切割,开发者可以根据需求灵活选择和组合这些功能。
  • 易用性:插件的使用方法简单直观,开发者只需导入插件、添加脚本并调整参数,即可快速实现物体破碎和切割效果。
  • 性能优化:插件内置了多种性能优化手段,确保在复杂场景中也能保持流畅的运行效果。
  • 自定义支持:插件支持导入自定义网格,并提供详细的模型准备指导,帮助开发者快速上手并实现个性化的效果。

1.2 效果展示

类型 效果
破碎效果 请添加图片描述
切片效果 请添加图片描述

1.3 使用说明及下载


二、功能介绍

该工具主要有三个组件:Fracture(运行时破碎)Prefracture(预破碎)Slice(切片)

利用这三个组件可以在不同场景下实现破碎效果,下面来看下组件的具体参数和相关使用方法。

2.1 Fracture 运行时破碎

Fracture 在运行时将网格分解成多个部分,在GameObject上挂载该组件即可生效。

一个对象应该添加以下组件。前三个是脚本必需的组件(即它们是自动添加的),而Collider不是必需的组件,因为可以使用任何类型的Collider。

  • MeshFilter
  • MeshRenderer
  • RigidBody
  • Collider(任何类型)
    在这里插入图片描述
Trigger Options(触发选项) 参数介绍
Trigger Type(触发类型)
Collision (碰撞)基于碰撞器的触发
Minimum Collision Force (最小碰撞力触发断裂所需的最小碰撞力)如果碰撞力等于或大于此值,则将触发断裂。要忽略此设置,请将最小力设置为 0。
Limit collisions to selected tags (将冲突限制为选定标签)通过启用此选项,您可以限制哪些对象标签将触发冲突。检测到冲突时,碰撞对象的标记将与包含的标记列表进行比较。如果它包含在该列表中(并且满足其他冲突条件),则将触发断开。
Trigger (触发器)基于触发器的触发
Filter Collisions By Tag (按标签过滤碰撞)如果为true,则只使用带有“Allowed tags”标签的对象列表将触发冲突。
Trigger Allowed Tags (触发允许的标签)如果“Filter Collisions By Tag”设置为true,只有带有此列表中标记的对象将触发骨折。
Keyboard (键盘)用户按下某个键触发
Trigger Key (触发键)按下时触发断裂的键。
Fracture Options 断裂选项 参数介绍
Fragment Count (片段计数):要将对象分解为的片段数。注意:如果“检测浮动片段”设置为 true,则最终的片段数可能高于“片段计数”。这是因为浮动碎片检测是在压裂阶段完成后进行的。
Asynchronous (异步)如果启用,网格将通过使用协程异步断开。骨折步骤分布在许多框架上,而不是一个框架上,以防止卡顿。如果碎片计数很大,则触发裂缝和实际发生压裂之间的延迟可能很大。如果性能是一个问题,建议在编辑器而不是运行时中断开网格。
Detect Floating Fragments (检测浮动片段)如果启用,将在执行断裂算法后对生成的片段进行传递,以确定是否有任何片段包含未连接的几何图形。在压裂非凸网格时,可能会发生这种情况。由于必须搜索每个片段的几何形状以识别这些不相连的顶点/面集,因此此选项将显着降低压裂的性能。同样,如果性能问题,建议您使用该脚本
Fracture Along X/Y/Z Plane (沿 X/Y/Z 平面的断裂)每条断裂线都可以由一个向量指定。对于某些对象,最好将此向量锁定到特定平面。例如,假设您有一个玻璃窗格模型,其宽度沿 X 轴,高度沿 Y 轴,厚度沿 Z 轴。断裂线应约束在玻璃的表面(X-Y 平面),而不是沿其厚度分割玻璃。在这种情况下,您可以将“沿 X 平面的断裂”和“沿 Y 平面的断裂”设置为 true,将“沿 Z 平面的断裂”设置为 false。
Inside Material (内部材料)用于新断裂面的材料
Texture Scale (纹理比例) 应用于断裂面的 UV 坐标的比例因子
Texture Offset (纹理偏移) 应用于断裂面的 UV 坐标的常量偏移。
Refracture Options重裂选项 参数介绍
Enabled (已启用) 设置为 true 以启用片段折射。
Invoke Callbacks (调用回调)如果启用,折射片段也会触发回调。如果只想在对象首次断开时触发操作,而不要在片段重新断开时触发操作(在这种情况下,应将此选项设置为 false),则此选项非常有用。
Max # of Refractures (最大 # 个重新断开)一个片段可以重新断开的最大次数。警告:折射会导致碎片呈指数增长。如果启用折射,建议保持较低的片段计数。
callvack options 回调选项 参数介绍
OnFracture () 破碎时,将触发此回调。重裂时也会触发该回调。
OnComplete() 当破碎完成时,将触发此回调。使用它来播放声音、打开灯或您需要的任何其他游戏内逻辑。

2.2 Prefracture 预破碎

Prefracture 预断裂,用于编辑器中的预断裂网格。生成的片段可以直接保存在场景中,也可以保存到磁盘(如果要创建预制件)。在GameObject上挂载该组件即可生效。

预破碎脚本允许在编辑器中对网格进行破碎。当网格被预破碎时,碎片会被添加到场景中,而原始对象会被设置为非活动状态。

每个碎片都附有一个刚体,该刚体处于冻结状态。碎片可以根据几种触发条件(如下所列)解除冻结。
当满足触发条件时,碎片就会解除冻结片段。或者如果单个碎片的触发条件得到满足,所有碎片都可以解除冻结。

这使得预破碎的网格可以一次破碎一块,也可以一次性全部破碎。
在这里插入图片描述
其他参数跟前面的Fracture 一样。

Prefracture Options预断裂选项 参数介绍
Unfreeze All (全部解冻)如果触发了一个片段,请解冻所有片段。
Save Fragments to Disk (将片段保存到磁盘)将片段网格保存到磁盘。如果预制件中将使用预断开网格,则为必需。如果预断开网格不会用作预制件并将嵌入到场景中,则可选。
Save Location (保存位置)将片段保存到相对于项目根目录的位置。
Prefracture Mesh (预断裂)此按钮将断开网格并生成碎片。生成片段后,包含基础网格体的对象将设置为非活动状态,但仍保留在场景中。

2.3 Slice 切片

Slice 切片,网格的运行时切片。

该脚本允许在运行时将网格切成两部分。如果需要,片段可以重新切片为较小的片段
在这里插入图片描述

Prefracture Options预断裂选项 参数介绍
Slice Options 切片选项
Enable Reslicing (启用重新切片):设置为 true 以启用片段重新切片。
Max Reslice Count (最大重新切片计数):片段可以重新切片的最大次数。
Detect Floating Fragments (检测浮动片段):如果启用,将在切片算法执行后对生成的片段进行传递,以确定是否有任何片段包含未连接的几何图形。切片非凸网格时可能会发生这种情况。由于必须搜索每个片段的几何形状以识别这些断开连接的顶点/面集,因此此选项将显着降低切片的性能。
Inside MaterialI (内部材质):用于新切片面的材质。
Texture Scale (纹理比例):应用于切片面的 UV 坐标的比例因子。
Texture Offset (纹理偏移):应用于切片面的 UV 坐标的常量偏移。
Invoke Callbacks (调用回调):如果启用,切片片段也会触发回调函数。如果只想在第一次切片对象时触发操作,而不要在重新切片片段时触发操作(在这种情况下,将此选项设置为 false),则此选项非常有用。
Callback Options回调选项
OnFracture () 切片时,将触发此回调。
OnCompleted() 当切片完成时触发此回调。使用它来播放声音、打开灯或您需要的任何其他游戏内逻辑。

与 Fracture和Prefracture不同,Slice需要编写脚本,因为必须在运行时传入切片平面的法线和原点。

如果是要切片的对象,执行以下代码将切片为两个片段。 sliceNormal和 sliceOrigin分别是切片平面在世界坐标中的法线和原点。

    void OnClickComputeSlice()
    {
        Slice slicer = obj.GetComponent<Slice>();
        Vector3 sliceNormal = Vector3.up;
        Vector3 sliceOrigin = obj.transform.position;
        slicer.ComputeSlice(sliceNormal, sliceOrigin);
    }

2.4 注意事项

1.如果要导入自定义网格,则必须在导入设置中将“启用读/写”设置为 true,否则将收到错误。
在这里插入图片描述

2.网格必须是不相交和封闭的。否则,重新三角定位将失败。
在这里插入图片描述
上面描绘的是凳子的线框模型。注意横杆如何与凳子腿相交。相交几何图形将导致三角测量算法(填充新切割的面)失败,并导致如下所示的伪影。我实现的三角测量算法不处理自相交多边形。检测自相交几何是一个不平凡的问题,作者并不打算添加。

3.优化性能
压裂过程是一个计算密集型过程。简单的模型(几百个顶点)可以毫不费力地分成几十个部分。在运行时对包含数千个顶点的复杂模型进行压裂的性能在较旧的、功能较差的计算机上可能会非常慢。

以下是优化性能的一些提示

  • 减少片段数量
  • 禁用或减少折射间隔次数
  • 编辑器中的预断裂模型,而不是运行时的破碎
  • 将您的模型引入 Blender 等 3D 建模程序,并使用抽取工具简化网格几何体

三、快速上手使用

在场景中添加测试使用的游戏对象GameObject,然后在上面添加破碎组件,如下所示:

在这里插入图片描述

游戏对象上面直接挂载相关组件即可。
在这里插入图片描述

然后写一个可以发射炮弹的脚本用于测试,测试代码如下:

using UnityEngine;
public class playerController : MonoBehaviour
{
    [Header("移动速度")]
    public float movespeed = 5f;
    [Header("转身速度")]
    public float turnspeed = 2f;
    [Header("炮弹预设体")]
    public GameObject bulletPrefab;
    [Header("炮弹生成位置")]
    public Transform firePoint;
    [Header("炮弹冲击力")]
    public float firePointForce = 20;

    private float hor, ver;
    private GameObject crtBlt;
    private Rigidbody rbBlt;

    void Update()
    {
        hor = Input.GetAxis("Horizontal");
        ver = Input.GetAxis("Vertical");
        transform.position += ver * transform.forward * Time.deltaTime * movespeed;
        transform.eulerAngles += hor * Vector3.up * turnspeed;

        //鼠标左键按下
        if (Input.GetMouseButtonDown(0))
        {
            crtBlt = Instantiate(bulletPrefab, firePoint.position, Quaternion.identity);
            rbBlt = crtBlt.GetComponent<Rigidbody>();
            //施加一个力
            rbBlt.AddForce(transform.forward * firePointForce, ForceMode.Impulse);
        }
    }
}

测试效果如下:
请添加图片描述

注意点:

  • 炮弹需要设置Tag为Projectile(Fracture组件中添加指定Tag),否则碰撞后不会触发破碎。
  • 破碎组件可以添加材质,默认为丢失材质的状态。
  • 破碎分解的片段数可以根据实际需求自行设置。重裂功能若是开启,可能会导致碎片呈指数增长。如果启用重裂功能,建议保持较低的片段计数。
    在这里插入图片描述

总结

  • 通过合理配置和优化,OpenFracture能够为各种类型的Unity项目提供强大的网格破碎与切割能力,帮助开发者创造更加生动和真实的交互体验。
  • 如果正在寻找一款能够实现逼真物理破坏效果的工具,OpenFracture插件绝对值得一试!

  • 🎬 博客主页:https://xiaoy.blog.csdn.net

  • 🎥 本文由 呆呆敲代码的小Y 原创 🙉

  • 🎄 学习专栏推荐:Unity系统学习专栏

  • 🌲 游戏制作专栏推荐:游戏制作

  • 🌲Unity实战100例专栏推荐:Unity 实战100例 教程

  • 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

  • 📆 未来很长,值得我们全力奔赴更美好的生活✨

  • ------------------❤️分割线❤️-------------------------

请添加图片描述请添加图片描述请添加图片描述

请添加图片描述

资料白嫖,技术互助

学习路线指引(点击解锁) 知识定位 人群定位
🧡 Unity系统学习专栏 入门级 本专栏从Unity入门开始学习,快速达到Unity的入门水平
💛 Unity实战类项目 进阶级 计划制作Unity的 100个实战案例!助你进入Unity世界,争取做最全的Unity原创博客大全。
❤️ 游戏制作专栏 难度偏高 分享学习一些Unity成品的游戏Demo和其他语言的小游戏!
💚 游戏爱好者万人社区 互助/吹水 数万人游戏爱好者社区,聊天互助,白嫖奖品
💙 Unity100个实用技能 Unity查漏补缺 针对一些Unity中经常用到的一些小知识和技能进行学习介绍,核心目的就是让我们能够快速学习Unity的知识以达到查漏补缺

请添加图片描述

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐