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性能不强,上述两种方法产生的碎块都是刚体性质,爆破过程中都会去利用物理引擎,所以对性能的耗费比较厉害,尤其是碎片比较多的情况下。适当的控制碎片的数目会比较好点
好的效果应该是多种效果的结合,比如破碎后马上生成粒子效果,不过要人感觉到自然,当然也需要好的机器性能来支撑这些大量的物理计算和渲染。公司的主机性能还是比较差,过多的物理计算和精细的渲染就会造成卡顿。不过说实话,好的游戏并不一定必须非常优秀的视觉效果
unity 实现物体破碎效果的一些方法 - 细雨淅淅的更多相关文章
- unity 实现物体破碎效果的一些方法
游戏越来越接近现实的感觉,如果有一个真是的 虚拟现实设备,可能我们真的会感觉是在真实世界.场景的逼真是在渲染效果.角色AI.游戏逻辑.物理效果等等一起导致的结果.现在游戏越来越大,除了渲染,物理估计是 ...
- Unity 实现物体破碎效果(转)
感谢网友分享,原文地址(How to Make an Object Shatter Into Smaller Fragments in Unity),中文翻译地址(Unity实现物体破碎效果) In ...
- Unity Shader 之 透明效果
透明效果 透明效果一般有两种实现方法: 第一种,使用透明度测试(Alpha Test) 第二种,使用透明度混合(Alpha Blending) 透明度测试和透明度混合机制: 透明度测试(Alpha T ...
- Unity Shader实现描边效果
http://gad.qq.com/article/detail/28346 描边效果是游戏里面非常常用的一种效果,一般是为了凸显游戏中的某个对象,会给对象增加一个描边效果.本篇文章和大家介绍下利用S ...
- Unity CommandBuffer物体轮廓
1.command buffer具有很高的灵活性,它的作用是预定义一些渲染指令,然后在我们想要执行的时候去执行这些指令(见图1),绿点表示可以在"Forward Rendering Path ...
- three.js使用卷积法实现物体描边效果
法线延展法 网上使用法线延展法实现物体描边效果的文章比较多,这里不再描述. 但是这种方法有个缺点:当两个面的法线夹角差别较大时,两个面的描边无法完美连接.如下图所示: 卷积法 这里使用另一种方法卷积法 ...
- IOS开发-UIView之动画效果的实现方法(合集)
http://www.cnblogs.com/GarveyCalvin/p/4193963.html 前言:在开发APP中,我们会经常使用到动画效果.使用动画可以让我们的APP更酷更炫,最重要的是优化 ...
- Unity 3D游戏开发学习路线(方法篇)
Unity 3D本来是由德国的一些苹果粉丝开发的一款游戏引擎,一直只能用于Mac平台,所以一直不被业外人士所知晓.但是后来也推出了2.5版,同时发布了PC版本,并将其发布方向拓展到手持移动设备.Uni ...
- Unity查找物体的子物体、孙物体
Unity查找物体下的所有物体 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...
随机推荐
- 微信扫码支付~官方DEMO的坑~参数不能自定义
返回目录 由于微信在校验参数时采用了“微信服务端”校验,它的参数是前期定义好的,所以用户不能自己添加自定义的参数,你可以把参数写在Attach字段时,作为它的附加参数. 参数和返回值定义如下: pub ...
- [moka同学摘录]SQL内联、外联的简单理解
(源自:http://blog.csdn.net/kkk9127/article/details/1487686) --查询分析器中执行:--建表table1,table2:create table ...
- #8.31课堂总结#JS基础
一.Javascript能做些什么? 表单数据合法性验证 网页特效:使用DOM和CSS可以实现网页特效 交互式菜单:创作具有动态效果的交互式菜单,完全能够与flash制作的导航菜单相媲美 动态页面:使 ...
- ae arcgis engine 关于面转线的方法和注意事项
代码很简单,如下 private void barButtonItem1_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs ...
- SharePoint 2013 状态机工作流之日常报销示例
简单介绍下状态机工作流,状态机工作流提供了一系列的状态.工作流从初始状态开始,到终止状态结束.两个状态之间定义行为进行过渡.通常情况下,状态机工作流对事件作出反应,事件的发生将会使状态发生改变. 1. ...
- Linux-HA实战(1)— Heartbeat安装
接触Heartbeat主要是因为之前项目中使用了TFS,最近想给nameserver做HA,因为TFS官方用的Heartbeat,所以刚好了解下,参考了网络上很多内容,这里简单记录下. 内容 环境和软 ...
- 项目实战工具类(一):PhoneUtil(手机信息相关)
可以使用的功能: 1.获取手机系统版本号 2.获取手机型号 3.获取手机宽度 4.获取手机高度 5.获取手机imei串号 ,GSM手机的 IMEI 和 CDMA手机的 MEID. 6.获取手机sim卡 ...
- Android Studio 运行出现 Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
转载请标明出处: http://www.cnblogs.com/why168888/p/5978381.html 本文出自:[Edwin博客园] 我引用compile 'com.squareup.re ...
- 【Swift 2.0】实现简单弹幕功能
前言 简单实现弹幕功能,表跟我谈效率,但也有用队列控制同时弹的数量. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯: http://over ...
- databtables 设置(显示)行号
var table = $('#priceStrategtyTable').DataTable({ "rowCallback": function( row, da ...