【推荐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);

目录
相关文章
|
9月前
|
图形学
Unity 获取鼠标位置下的UGUI或3D物体
本文总结了两种检测方法,分别用于UGUI和3D物体的检测。第一种方法`GetOverUIobj`专门用于检测鼠标悬停的UGUI元素,通过`GraphicRaycaster`实现。第二种方法`GetOverWordGameObject`则同时适用于UI和3D物体检测,利用`PhysicsRaycaster`进行射线检测。两者均返回悬停对象或null。
|
9月前
|
图形学
unity 物体震动
在Unity中实现物体震动效果,主要通过改变物体的位置、旋转或缩放属性来模拟震动。以下是位置震动的实现原理及代码示例:通过随机生成微小偏移量并累加到物体位置上,在短时间内不断改变位置产生震动效果。生成随机偏移,并结合时间控制持续震动。
|
9月前
|
前端开发 图形学
unity UGUI跟随3D物体的坐标转换
在 Unity 中实现 UGUI 元素跟随 3D 物体,关键是将 3D 物体的世界坐标转换为屏幕或画布坐标。通过 Camera.WorldToScreenPoint 方法,可将 3D 物体位置映射到屏幕上,再更新 UGUI 元素的位置。代码示例展示了如何使用该方法,使 UGUI 图像跟随 3D 模型,并提供文字显示、图像和线条的显示/隐藏功能。
|
9月前
|
存储 图形学 索引
unity 使物体跟随路径点自动移动位置
在Unity中,物体沿路径点自动移动的核心原理是通过预设路径点,控制物体依次移动。路径点可用空对象或三维向量数组定义,并按顺序存储。移动时,计算当前位置与下一个路径点的向量差以确定方向,使用`Vector3.MoveTowards`逐步靠近目标点。代码实现包括路径点设置、移动控制及插值计算,确保物体平滑移动和旋转。
|
9月前
|
图形学
Unity 射线移动物体Ray
在Unity中,通过射线检测实现3D物体的拖拽和移动。射线由起点和方向组成,使用`Physics.Raycast`检测与物体的交点。点击物体时,记录位置偏移量,拖动过程中更新物体位置。代码包括基本拖拽和上下拖动功能,适用于正交摄像机场景。测试时为物体设置特定标签(如&quot;JQR&quot;)以便区分和操作。 示例代码展示了如何通过鼠标事件控制物体移动,并结合层级掩码优化射线检测。具体实现包括:点击选中物体、拖动更新位置、释放鼠标取消选择。此外,提供了上下拖动的额外功能,通过按键切换模式。
|
9月前
|
图形学 开发者
unity 从工具栏拖动生成物体
在 Unity 中实现从工具栏拖动生成物体的功能,基于编辑器扩展、事件系统和预制体实例化。通过自定义编辑器窗口、处理鼠标事件(按下、移动、释放)及使用 Instantiate 方法,可实现拖动并生成预制体物体。代码示例展示了如何检测鼠标事件并在指定位置实例化物体。
|
传感器 开发工具 vr&ar
ManoMotion⭐二、Unity手势识别插件简介,及效果录屏
ManoMotion⭐二、Unity手势识别插件简介,及效果录屏
|
前端开发 图形学
Unity精华☀️UI和物体可见性的判断方法
Unity精华☀️UI和物体可见性的判断方法
小功能⭐️获取Unity游戏物体上,所挂载组件的名称
小功能⭐️获取Unity游戏物体上,所挂载组件的名称
下一篇
开通oss服务