unity 实现物体破碎效果的一些方法 - 细雨淅淅

简介:

游戏越来越接近现实的感觉,如果有一个真是的 虚拟现实设备,可能我们真的会感觉是在真实世界。场景的逼真是在渲染效果、角色AI、游戏逻辑、物理效果等等一起导致的结果。现在游戏越来越大,除了渲染,物理估计是最好性能的一部分。在动作游戏中,物体的毁灭和破碎效果,让战斗更加的逼真和酣畅淋漓的感觉,这篇文章主要从自己应用的角度来简单介绍破碎效果的实现。

1 简单实现

使用maya等3D工具制作碎块组成的物体,游戏中在物体被打碎的时候,首先销毁原先的物体,然后再用碎片组成的pretab替换,形成的效果则是每个碎块的加力方式不同,需要通过调整来实现。可以参考: http://www.cnblogs.com/zsb517/p/3986278.html

注意一下几个函数的使用:

Rigidbody.AddExplosionForce : 添加爆炸力,力的大小按距离减小

Physics.OverlapSphere : 检测范围内的碰撞体列表

下面的代码测试效果:

void FixedUpdate()

{

if(Input.GetKeyDown(KeyCode.Space))

{

RaycastHit hit;

if (Physics.Raycast(Camera.mainCamera.ScreenPointToRay(Input.mousePosition), out hit))

{

Debug.Log("AddExplosionForce");

Collider[] hits;

hits = Physics.OverlapSphere(hit.point,raduis);

foreach(Collider t in hits)

{

if(t != null && t.attachedRigidbody!=null)

t.attachedRigidbody.AddExplosionForce(force,t.attachedRigidbody.position,raduis,ups);

//t.attachedRigidbody.AddForce(new Vector3(0f,0f,1f) * 500.0f);

}

}

}分割

}

2 mesh实时分割

使用插件Shatter Toolkit 1.41,实现类似切水果中的效果,可以以点为中心对物体分割成几个部分或者直接使用平面对物体进行分割,这种方法需要耗费CPU的运算功能,切割时首先根据给的平面方程将物体分割成上两部分,对处于边界线上的三角面片需要对顶点,法线,纹理,颜色,切线等进行插值计算,产生新的信息。插件实现了基本的要求,但是如果实现个人具体的效果还是需要对切割前后的事件进行处理和扩展。

使用说明:

当你需要破碎或者分裂物体的时候。你需要在物体上附加一个shattertool脚本实例对象和一个uvmap实例对象,切割之后,物体的碎片将会被实例化为原物体的克隆。

破碎工具脚本需要物体本省含有MeshFilter组件,MeshCollider和Rigidbody组件也是需要的

注意点1:如果你是用meshCollision和刚体组件,需要打开MeshCollider Convex选项,进而避免分裂后组件的质量更新问题

注意点2:如果ShatterTool.FillCut选项被打开,则网格的每个边属于两个三角面片,也就是说网格是封闭的

关于使用:

1 附件 ShatterOnCollision脚本到物体上,通过触发碰撞来触发

2 附件鼠标事件到物体上,包括点击、滑动以及拖拉

3 发送带有“Shatter”、被分割位置的世界坐标点,触发shattle tool中的Shatter事件

4 发送"Split"消息,带有一个世界坐标系中的面序列。触发shattle tool中的Split事件

5 使用ShatterScheduler事件管理机制,通过添加task的方法发送消息,进而可以控制更多的事件根本

关于鼠标:

1 鼠标点击后的破碎效果

2 鼠标划线方式切割

3 鼠标拖动效果

关于层级:

HierarchyHandler 脚本可以帮助实现切割中的层析管理

关于效果:

没做太多处理,可以通过切割前后的消息事件进行处理,类似HierarchyHandler的管理方法,处理切割前和切割后的效果

技术实现:

(1)计算切面

Plane splitPlane = new Plane(Vector3.Normalize(Vector3.Cross(line, ray.direction)), hit.point);

line为世界坐标系中的直线向量--Vector3 line = mainCamera.ScreenToWorldPoint(new Vector3(end.x, end.y, near)) - mainCamera.ScreenToWorldPoint(new Vector3(start.x, start.y, near));

ray.direction为屏幕到切割点的向量--》Ray ray = mainCamera.ScreenPointToRay(Vector3.Lerp(start, end, (float)i / raycastCount));

上面二者叉乘后的结果就是需要平面的法向量,再加上切割垫就可以确定切割平面

(2)单点切割方案:

利用vector生成几个随机的面向量,结合切割点形成几个平面

类似的unity插件:Shatter Toolkit 1.41 ,下载地址: http://www.unitymanual.com/thread-19781-1-1.html

3 爆破效果(Fracture 最大50块的分割)

使用插件:Fracturing__Destruction_1.11,这个插件稍微复杂点, 其实基本原理和第一种类似,牛逼的地方在于不需要美术参与碎块的破裂,插件会首先根据你的设置将物体打碎,生成另外一堆碎块,并且对碎块之间的连接关系进行记录,方便后面实现破碎时的处理。插件的完成性非常好,基本上已经可以像使用粒子一同一样,通过设置就可以实现一些很好的破碎效果。因为不需要实时的计算碎片,使用中的效果还是可以的,如果需要prefab, 则需要占用点资源罢了。使用前请仔细阅读的设置面板~~实在太多参数了。具体的使用可以 参考这里

4 粒子效果

总结,主机性能不好的情况下,尤其是GPU性能不强,上述两种方法产生的碎块都是刚体性质,爆破过程中都会去利用物理引擎,所以对性能的耗费比较厉害,尤其是碎片比较多的情况下。适当的控制碎片的数目会比较好点

好的效果应该是多种效果的结合,比如破碎后马上生成粒子效果,不过要人感觉到自然,当然也需要好的机器性能来支撑这些大量的物理计算和渲染。公司的主机性能还是比较差,过多的物理计算和精细的渲染就会造成卡顿。不过说实话,好的游戏并不一定必
本文转自jiahuafu博客园博客,原文链接http://www.cnblogs.com/jiahuafu/p/6122577.html如需转载请自行联系原作者

jiahuafu

相关文章
|
10天前
|
图形学
Unity 获取鼠标位置下的UGUI或3D物体
本文总结了两种检测方法,分别用于UGUI和3D物体的检测。第一种方法`GetOverUIobj`专门用于检测鼠标悬停的UGUI元素,通过`GraphicRaycaster`实现。第二种方法`GetOverWordGameObject`则同时适用于UI和3D物体检测,利用`PhysicsRaycaster`进行射线检测。两者均返回悬停对象或null。
|
10天前
|
图形学
unity 物体震动
在Unity中实现物体震动效果,主要通过改变物体的位置、旋转或缩放属性来模拟震动。以下是位置震动的实现原理及代码示例:通过随机生成微小偏移量并累加到物体位置上,在短时间内不断改变位置产生震动效果。生成随机偏移,并结合时间控制持续震动。
|
10天前
|
前端开发 图形学
unity UGUI跟随3D物体的坐标转换
在 Unity 中实现 UGUI 元素跟随 3D 物体,关键是将 3D 物体的世界坐标转换为屏幕或画布坐标。通过 Camera.WorldToScreenPoint 方法,可将 3D 物体位置映射到屏幕上,再更新 UGUI 元素的位置。代码示例展示了如何使用该方法,使 UGUI 图像跟随 3D 模型,并提供文字显示、图像和线条的显示/隐藏功能。
|
10天前
|
存储 图形学 索引
unity 使物体跟随路径点自动移动位置
在Unity中,物体沿路径点自动移动的核心原理是通过预设路径点,控制物体依次移动。路径点可用空对象或三维向量数组定义,并按顺序存储。移动时,计算当前位置与下一个路径点的向量差以确定方向,使用`Vector3.MoveTowards`逐步靠近目标点。代码实现包括路径点设置、移动控制及插值计算,确保物体平滑移动和旋转。
|
10天前
|
图形学
Unity 射线移动物体Ray
在Unity中,通过射线检测实现3D物体的拖拽和移动。射线由起点和方向组成,使用`Physics.Raycast`检测与物体的交点。点击物体时,记录位置偏移量,拖动过程中更新物体位置。代码包括基本拖拽和上下拖动功能,适用于正交摄像机场景。测试时为物体设置特定标签(如"JQR")以便区分和操作。 示例代码展示了如何通过鼠标事件控制物体移动,并结合层级掩码优化射线检测。具体实现包括:点击选中物体、拖动更新位置、释放鼠标取消选择。此外,提供了上下拖动的额外功能,通过按键切换模式。
|
10天前
|
图形学 开发者
unity 从工具栏拖动生成物体
在 Unity 中实现从工具栏拖动生成物体的功能,基于编辑器扩展、事件系统和预制体实例化。通过自定义编辑器窗口、处理鼠标事件(按下、移动、释放)及使用 Instantiate 方法,可实现拖动并生成预制体物体。代码示例展示了如何检测鼠标事件并在指定位置实例化物体。
|
6月前
|
语音技术 开发工具 图形学
Unity与IOS⭐一、百度语音IOS版Demo调试方法
Unity与IOS⭐一、百度语音IOS版Demo调试方法
|
6月前
|
前端开发 图形学
Unity精华☀️UI和物体可见性的判断方法
Unity精华☀️UI和物体可见性的判断方法
|
6月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
199 0
|
6月前
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️反射的用法:变量、属性、方法、重载,反射在DLL中的使用方法
Unity数据加密☀️反射的用法:变量、属性、方法、重载,反射在DLL中的使用方法