分享

Unity实现物体破碎效果

 阿修罗之狮猿授 2015-09-25
本文由译林军_尹维雄翻译


在这篇教程中,我将向您展示如何在你的Unity游戏中创建一个简单的破碎效果。当游戏中的箱体(或者其他任何物体)被击中或者销毁时,之前我们都只是将其删除,而现在取而代之,我们可以对其应用一个破碎效果,使其变成很多小碎片。


要求


对于此教程,首先你需要一个最新版的Unity,当然还有使用Unity的基本经验。而后面更高级的效果,则有必要需要一个3D建模工具。如果你没有可用的建模工具或者你不想自己建模,你可以下载此教程的源代码(有关Unity的文件也包含其中)。


这种破碎效果的一个基本版本就是:一个立方体(物体)被销毁,然后破碎成一些碎片自然地跌落在地面。




稍后,我们将会用一个较为复杂的桶状模型来退换立方体,如下图:




这里你可以自己体验一下:



点击查看demo(也可以点击这里查看)。


基本设置


创建一个新的Unity项目并且打开一个新场景。接着创建一个平面作为地面,再创建一个立方体,此立方体将会作为被打碎的物体。当然,还要放置一个平行光,让物体变得可见。然后再创建两个材质,分别分配给地面与立方体,以便我们能很清楚的看出他们之间是分离开的,然后再移动摄像头到合适位置,以便能让任何物体可见。




销毁立方体


有很多方法可以用来销毁立方体,但目前,我们将用最简单的方法。


创建一个新的Javascript文件,命名为destructionController.js. 我们会把所有删除立方体与创建立方体碎片的功能都放在这个文件中。添加下面的代码:


  1. function Update()

  2.        {

  3.               if(Input.GetKey(Keycode.space))

  4.               {

  5.                      Destroy(gameObject);

  6.               }

  7.        }
复制代码


然后,拖动js文件到立方体上面,给立方体添加脚本控制。运行并测试游戏,如果你按下空格键,立方体应该会被删除。



立方体在被删除后,正如上面截图中看到的,层级窗口中的立方体也被删除。


创建碎片


创建8个小的立方体来充当之前大立方体的碎片。将8个小立方体设置相同的材质(不用担心立方体的样子,后面我们会让它看上去会很优美),它们看上去会是下面这样子:



将8个小立方体无重叠无交叉的组成一个大的立方体,如下图:



让每一个小立方体附加一个刚体,设置质量为22,使重力加速度对其有影响,设置其为运动状态。这些设置将会使碎片跌落地面并产生物理效应。如果你想,你可以调整这些值来产生更适合你游戏的效果。



现在,我们将这些小立方体组合为一个空的游戏对象,命名为remainsCube. 当原先的立方体被销毁时,它会退换为这样一个由小立方体组成的新对象。



拖动remainsCube对象到项目目录,创建一个预制件。一旦创建预制件完成,我们可以将其从主场景中删除。


让碎片显现出来


添加下面的高亮行代码到destructionController脚本:


  1. var remains: GameObject;      
  2. function Update()      
  3. {            
  4. if(Input.GetKey(Keycode.space))              
  5. {                    
  6. Instantiate(remains, transform.position,transform.rotation);                     
  7. Destroy(gameObject);              
  8. }      
  9. }
复制代码

上面的代码将会在原立方体的位置创建一个remains的副本,然后删除原立方体,这就给人一种假象,认为新立方体就是原来的立方体,且新立方体是可以破碎的。


为了让这能工作,你得手动设置remians到立方体上。点击原立方体,在Inspector窗口你将会看到Destruction Controller脚本,而Remains的位置应该是空的。拖动预制件remainsRemains的位置,Destruction Controller脚本在Inspector窗口看上去应该像下面这样的:



第一次优化


可以进行测试了!如果一切设置正确,那么当你按下空格键时,remains8个小立方体的组合对象)应该会替换原立方体。如果运气好,remains应该会跌落到地面上。


看,原立方体:



将会变成像下面这样子的:



不幸的我


悲剧的是,我们无法保证碎片能以一种很真实的破碎效果跌落到地面。幸运的是,我们有很多方法可以解决它。


创建一个新的gameObject对象,并且给它一个球形对撞机,但不是刚体。将remians拖到场景,以便我们可以编辑。将球形对撞机对象附加给remains,让其与remians中的立方体相交放置。



现在这些碎片(小立方体)会立即与球形物体碰撞,产生一个自然的破碎跌落的效果。





删除碎片


根据我们创建的游戏,在一个场景中,我们无法一次渲染太多的碎片。最简单直接的方法是立方体破碎后的几秒我们将碎片删除。为了实现我们的想法,新建一个Javascript文件,命名为selfDestruct.js。添加如下代码:


  1. function Start()      
  2. {            
  3. yield WaitForSeconds(4.0);              
  4. Destroy(gameObject);      
  5. }
复制代码

当对象被创建后,等待4秒然后自我删除。将上面的代码附加到remians对象。现在,如果你销毁原立方体,并且创建碎片,这些碎片(remains)将会在4秒后自我删除。


就是这样了!当物体被销毁时,现在你有了一个物体破碎成小碎片的一个基本的效果。你可以按原样使用这种效果,但是先让我们考虑更远一点,我们看看这种效果如何应用到更加复杂的对象上面。


用真实的物体替代立方体


有了基本的破碎效果,换上真实的物体,我们让它变得更加完美。



如果你擅长使用3D建模工具,你可以创建自己的物体。如果不擅长,或者你没有这样一个可用的物体来替换立方体,可以从这里下载我事先准备好的3D文件。


将文件拷贝到asset目录,3D模型会被自动导入。使用模型之前,在Asset Explorer窗口点击导入的3D文件,查看scalefactor的值,确保为1(而不是0.1或者0.001,这是唯一复杂一点的事情了)。



如果你点击导入的模型对象,在Inspector窗口中你可以看到一个meshfilter字段。如果你点击它,将会获取项目中可用的网格。好了,我们现在退换remians中的所有立方体为桶状物体的一部分。



一个完整的立方体变成了一个桶状的网格,更小的立方体碎片,需要很多barrel_fragment_01barrel_fragment_08的网格。这些网格被分配完成后,设置他们的位置为(0,0,0)。(因为它们的旋转点已经被设置了,因此通过这种方法可以很容易的设置他们的位置为0)。


换掉盒子碰撞机,网格碰撞机处理将会更加便利。删除所有碎片上的所有盒子碰撞机,取而代之的是网格碰撞机。检查每一个网格碰撞机,确保正确(barrel_fragment_01需要barrel_fragment_01,等等)的网格模型被应用到碎片上。



完成上面的操作后,将所有的网格碰撞机设置为convex(一个非convex的网格碰撞机无法与其他非convex网格碰撞机进行碰撞检测,这是一个程序问题),同样,删除所有我们前面给remains添加的球形碰撞机,因为这些可能不是必要的了。



如果一切设置正确,你将会看到一个桶状物体破碎成8块更小的碎片。


更多的细节


这种相同的系统亦可以应用于其他的效果,也同样对物体的销毁产生影响。为什么这么说呢?将这种效果添加到碎片!添加声音到一种自然的裂纹效果。还可以添加粒子效果,将会产生烟雾效果。


总结


此文中,我们展示了一种物体破碎为碎片的最直接简单的方法。现在,你知道了如何销毁一个对象,将其从游戏中删除;在物体被销毁之前,如何将其退换为更小的碎片;如何让那些小的碎片自我销毁。


这个系统可以被修改和改装以便适合其他特殊的目的。比如,射击一个箱体或者桶状物体使其粉碎,当击中时,我们可以运用此系统创建一个爆炸效果。或者让一只小船破裂为两片。尽情的发挥你的想象力吧!




原文链接:http://gamedevelopment./tutorials/how-to-make-an-object-shatter-into-smaller-fragments-in-unity--gamedev-11795


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多