【推荐100个unity插件之4】OpenFracture插件实现unity3d物体破裂和切割

简介: 【推荐100个unity插件之4】OpenFracture插件实现unity3d物体破裂和切割

插件地址

github地址:

https://github.com/Mustenaka/OpenFracture

百度网盘地址(上传日期:2023/12/18)

有小伙伴反映打不开github,所以我又加了个网盘地址,但是后来的小伙伴最好是去github下载,因为可能作者会更新:

链接:https://pan.baidu.com/s/1-7dc9D0CHtvfLHBUXBS4Dg?pwd=7gsf

提取码:7gsf

image.png

使用注意事项

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

2.网格必须是非相交和封闭的。否则,重新三角测量将失败。

上面描绘的是凳子的线框模型。注意横杆如何与凳子腿相交。相交几何图形将导致三角测量算法(填充新切割的面)失败,并导致如下所示的伪影。我实现的三角测量算法不处理自相交多边形。检测自相交几何是一个不平凡的问题,作者并不打算添加。

3.优化性能

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

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

1.减少片段数量

2.禁用或减少折射间隔次数

3.编辑器中的预断裂模型,而不是运行时的破裂

4.将您的模型引入 Blender 等 3D 建模程序,并使用抽取工具简化网格几何体

Fracture

断裂,在运行时将网格分解成多个部分

1.先决条件

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

  • MeshFilter
  • MeshRenderer
  • RigidBody
  • Collider(任何类型)

2.给想要破坏的物体添加Fracture脚本

3.参数说明

Trigger Options(触发选项)

  • Trigger Type(触发类型)
  • Collision(碰撞):基于物理碰撞的触发
  • Minimum Collision Force(最小碰撞力触发断裂所需的最小碰撞力):如果碰撞力等于或大于此值,则将触发断裂。要忽略此设置,请将最小力设置为 0。
  • Limit collisions to selected tags(将冲突限制为选定标签):通过启用此选项,您可以限制哪些对象标签将触发冲突。检测到冲突时,碰撞对象的标记将与包含的标记列表进行比较。如果它包含在该列表中(并且满足其他冲突条件),则将触发断开。
  • Included 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 回调选项

  • OnComplete():当破裂完成时,将触发此回调。使用它来播放声音、打开灯或您需要的任何其他游戏内逻辑。

Prefracture

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

该脚本允许在编辑器中断开网格。预断开网格时,片段将添加到场景中,并将原始对象设置为非活动状态。每个碎片都有一个被冻结的刚体。片段可以根据几种触发条件(如下所列)解冻。当满足触发条件时,片段解冻。或者,如果满足单个片段的触发条件,则可以解冻所有片段。这允许预断裂的网格一次分解一块或一次全部破碎

1.先决条件

跟Fracture 一样

2.给想要破坏的物体添加Prefracture脚本

3.参数说明

其他参数跟前面的Fracture 一样

Prefracture Options预断裂选项

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

Slice

切片,网格的运行时切片

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

1.先决条件

跟Fracture 一样

2.给想要破坏的物体添加Slice脚本

3.参数说明

Slice Options切片选项

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

Callback Options回调选项

  • OnCompleted():当切片完成时触发此回调。使用它来播放声音、打开灯或您需要的任何其他游戏内逻辑。

4.刀片脚本

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

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

public GameObject obj;//切割物体
var slicer = obj.GetComponent<Slice>();
var sliceNormal = Vector3.up;
var sliceOrigin = obj.transform.position; 
slicer.ComputeSlice(sliceNormal, sliceOrigin);

目录
相关文章
|
5月前
|
图形学
小功能⭐️Unity获取场景中所有物体
小功能⭐️Unity获取场景中所有物体
小功能⭐️Unity获取场景中所有物体
|
5月前
|
传感器 开发工具 vr&ar
ManoMotion⭐二、Unity手势识别插件简介,及效果录屏
ManoMotion⭐二、Unity手势识别插件简介,及效果录屏
|
5月前
|
前端开发 图形学
Unity精华☀️UI和物体可见性的判断方法
Unity精华☀️UI和物体可见性的判断方法
|
5月前
|
图形学
小功能⭐️获取Unity游戏物体上,所挂载组件的名称
小功能⭐️获取Unity游戏物体上,所挂载组件的名称
|
5月前
|
图形学
小功能⭐️解决Unity无法对一个物体上的所有材质球进行更改
小功能⭐️解决Unity无法对一个物体上的所有材质球进行更改
|
4月前
|
图形学 C++ C#
Unity插件开发全攻略:从零起步教你用C++扩展游戏功能,解锁Unity新玩法的详细步骤与实战技巧大公开
【8月更文挑战第31天】Unity 是一款功能强大的游戏开发引擎,支持多平台发布并拥有丰富的插件生态系统。本文介绍 Unity 插件开发基础,帮助读者从零开始编写自定义插件以扩展其功能。插件通常用 C++ 编写,通过 Mono C# 运行时调用,需在不同平台上编译。文中详细讲解了开发环境搭建、简单插件编写及在 Unity 中调用的方法,包括创建 C# 封装脚本和处理跨平台问题,助力开发者提升游戏开发效率。
409 0
|
5月前
|
C# 图形学 C语言
Unity3D学习笔记3——Unity Shader的初步使用
Unity3D学习笔记3——Unity Shader的初步使用
55 0
|
5月前
|
数据可视化 图形学
小功能⭐️Unity2018 Shader Graph——全息影像、物体消融
小功能⭐️Unity2018 Shader Graph——全息影像、物体消融
|
5月前
|
图形学
小功能⭐️Unity中利用材质自发光实现物体闪烁效果
小功能⭐️Unity中利用材质自发光实现物体闪烁效果
|
5月前
|
图形学
小功能⭐️Unity 如何判断物体是否在摄像机视野内或外
小功能⭐️Unity 如何判断物体是否在摄像机视野内或外