怎样实现unity3d 物体破碎,由于某些原因需要用到相关知识,所以就找到了相关教程,下面我们就来学习如何实现unity3d 物体破碎吧。
       在这篇教程中,我将向您展示如何在你的Unity游戏中创建一个简单的破碎效果。当游戏中的箱体(或者其他任何物体)被击中或者销毁时,之前我们都只是将其删除,而现在取而代之,我们可以对其应用一个破碎效果,使其变成很多小碎片。
 要求
       对于此教程,首先你需要一个最新版的Unity,当然还有使用Unity的基本经验。而后面更高级的效果,则有必要需要一个3D建模工具。如果你没有可用的建模工具或者你不想自己建模,你可以下载此教程的源代码(有关Unity的文件也包含其中)。

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



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



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


 基本设置

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


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

创建一个新的Javascript文件,命名为destructionController.js. 我们会把所有删除

立方体与创建立方体碎片的功能都放在这个文件中。添加下面的代码:

function Update()
{
if(Input.GetKey(Keycode.space))
{
Destroy(gameObject);
}
}

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


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

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


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


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


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


       拖动remainsCube对象到项目目录,创建一个预制件。一旦创建预制件完成,我们可以将其从主场景中删除。
 让碎片显现出来
  添加下面的高亮行代码到destructionController脚本:
var remains: GameObject;
function Update()
{
if(Input.GetKey(Keycode.space))
{
Instantiate(remains, transform.position,transform.rotation);
Destroy(gameObject);
}
}
       上面的代码将会在原立方体的位置创建一个remains的副本,然后删除原立方体,这就给人一种假象,认为新立方体就是原来的立方体,且新立方体是可以破碎的。

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


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

看,原立方体:


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



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

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


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



 删除碎片
       根据我们创建的游戏,在一个场景中,我们无法一次渲染太多的碎片。最简单直接的方法是立方体破碎后的几秒我们将碎片删除。为了实现我们的想法,新建一个Javascript文件,命名为selfDestruct.js。添加如下代码:
function Start()
{
yield WaitForSeconds(4.0);
Destroy(gameObject);
}
       当对象被创建后,等待4秒然后自我删除。将上面的代码附加到remians对象。现在,如果你销毁原立方体,并且创建碎片,这些碎片(remains)将会在4秒后自我删除。
       就是这样了!当物体被销毁时,现在你有了一个物体破碎成小碎片的一个基本的效果。你可以按原样使用这种效果,但是先让我们考虑更远一点,我们看看这种效果如何应用到更加复杂的对象上面。
 用真实的物体替代立方体

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


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

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


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


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

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


       完成上面的操作后,将所有的网格碰撞机设置为convex(一个非convex的网格碰撞机无法与其他非convex网格碰撞机进行碰撞检测,这是一个程序问题),同样,删除所有我们前面给remains添加的球形碰撞机,因为这些可能不是必要的了。
       如果一切设置正确,你将会看到一个桶状物体破碎成8块更小的碎片。
 更多的细节
       这种相同的系统亦可以应用于其他的效果,也同样对物体的销毁产生影响。为什么这么说呢?将这种效果添加到碎片!添加声音到一种自然的裂纹效果。还可以添加粒子效果,将会产生烟雾效果。
 总结
       此文中,我们展示了一种物体破碎为碎片的最直接简单的方法。现在,你知道了如何销毁一个对象,将其从游戏中删除;在物体被销毁之前,如何将其退换为更小的碎片;如何让那些小的碎片自我销毁。

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