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


前言
- 游戏开发和VR应用中,真实的物体破碎效果能显著提升用户体验。无论是玻璃碎裂、建筑倒塌还是物体切割,都需要强大的网格处理能力。
OpenFracture这款专为Unity设计的开源网格破碎工具,为开发者提供了完整的解决方案。- 本文会介绍OpenFracture的破碎效果、使用方法和注意事项。
【Unity 实用工具篇】 | Unity物体破碎效果 OpenFracture
一、物体破碎效果:OpenFracture
1.1 介绍
Unity中的OpenFracture是一个强大的运行时网格破碎插件,它允许开发者在游戏运行过程中动态地将3D模型分裂成多个碎片,从而创建逼真的物体破坏效果。
该插件基于Voronoi图算法生成自然的断裂模式,支持递归破碎(碎片可再次破碎)、切片破碎和预破碎等多种模式,并且与Unity的物理系统和Jobs/Burst编译器深度集成,能够高效利用多线程处理复杂破碎计算而不造成性能瓶颈。
通过简单的组件配置,开发者可以快速为任何网格物体添加可破碎属性,定义碎片数量、断裂力、触发条件等参数,同时支持自定义碎片材质、碰撞检测和音频特效,非常适合用于创建可破坏的环境、射击游戏的物体交互、爆炸效果以及解谜游戏中的物体分裂机制,极大地增强了游戏的交互真实感和视觉冲击力。
✨ 核心技术
- 运行时网格断裂:通过高效的算法,插件能够在游戏运行时动态地将物体分解成多个部分,实现逼真的破碎效果。
- 编辑器预处理断裂:为了提高运行时性能,插件允许开发者在Unity编辑器中预先处理断裂效果,减少运行时的计算负担。
- 动态切割:插件提供了动态切割功能,能够在游戏过程中实时切割物体,为游戏增添更多的互动性和趣味性。
- 性能优化:通过减少片段数量、禁用或减少折射间隔次数等方式,插件能够有效优化性能,确保在复杂场景中也能流畅运行。
- 模型准备:插件支持导入自定义网格,并提供详细的模型准备指导,帮助开发者快速上手。
🎯 插件特点
- 灵活性:插件提供了多种功能,包括运行时断裂、预处理断裂和动态切割,开发者可以根据需求灵活选择和组合这些功能。
- 易用性:插件的使用方法简单直观,开发者只需导入插件、添加脚本并调整参数,即可快速实现物体破碎和切割效果。
- 性能优化:插件内置了多种性能优化手段,确保在复杂场景中也能保持流畅的运行效果。
- 自定义支持:插件支持导入自定义网格,并提供详细的模型准备指导,帮助开发者快速上手并实现个性化的效果。
1.2 效果展示
| 类型 | 效果 |
|---|---|
| 破碎效果 | ![]() |
| 切片效果 | ![]() |
1.3 使用说明及下载
- GitHub下载地址:https://github.com/Mustenaka/OpenFracturet
- CSDN下载地址:破碎效果插件
- 白嫖地址:VX搜我名字,回复【素材资源】
二、功能介绍
该工具主要有三个组件: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的知识以达到查漏补缺 |

更多推荐




所有评论(0)