在这篇教程中,我将向您展示如何在你的Unity游戏中创建一个简单的破碎效果。当游戏中的箱体(或者其他任何物体)被击中或者销毁时,之前我们都只是将其删除,而现在取而代之,我们可以对其应用一个破碎效果,使其变成很多小碎片。
要求
对于此教程,首先你需要一个最新版的Unity,当然还有使用Unity的基本经验。而后面更高级的效果,则有必要需要一个3D建模工具。如果你没有可用的建模工具或者你不想自己建模,你可以下载此教程的源代码(有关Unity的文件也包含其中)。
这种破碎效果的一个基本版本就是:一个立方体(物体)被销毁,然后破碎成一些碎片自然地跌落在地面。
稍后,我们将会用一个较为复杂的桶状模型来退换立方体,如下图:
这里你可以自己体验一下:
创建一个新的Unity项目并且打开一个新场景。接着创建一个平面作为地面,再创建一个立方体,此立方体将会作为被打碎的物体。当然,还要放置一个平行光,让物体变得可见。然后再创建两个材质,分别分配给地面与立方体,以便我们能很清楚的看出他们之间是分离开的,然后再移动摄像头到合适位置,以便能让任何物体可见。
有很多方法可以用来销毁立方体,但目前,我们将用最简单的方法。
创建一个新的Javascript文件,命名为destructionController.js. 我们会把所有删除
立方体与创建立方体碎片的功能都放在这个文件中。添加下面的代码:
function Update(){
if(Input.GetKey(Keycode.space))
{
Destroy(gameObject);
}
}
然后,拖动js文件到立方体上面,给立方体添加脚本控制。运行并测试游戏,如果你按下空格键,立方体应该会被删除。
创建碎片
创建8个小的立方体来充当之前大立方体的碎片。将8个小立方体设置相同的材质(不用担心立方体的样子,后面我们会让它看上去会很优美),它们看上去会是下面这样子:
将8个小立方体无重叠无交叉的组成一个大的立方体,如下图:
让每一个小立方体附加一个刚体,设置质量为22,使重力加速度对其有影响,设置其为运动状态。这些设置将会使碎片跌落地面并产生物理效应。如果你想,你可以调整这些值来产生更适合你游戏的效果。
现在,我们将这些小立方体组合为一个空的游戏对象,命名为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秒后自我删除。
就是这样了!当物体被销毁时,现在你有了一个物体破碎成小碎片的一个基本的效果。你可以按原样使用这种效果,但是先让我们考虑更远一点,我们看看这种效果如何应用到更加复杂的对象上面。
用真实的物体替代立方体
有了基本的破碎效果,换上真实的物体,我们让它变得更加完美。
将文件拷贝到asset目录,3D模型会被自动导入。使用模型之前,在Asset Explorer窗口点击导入的3D文件,查看scalefactor的值,确保为1(而不是0.1或者0.001,这是唯一复杂一点的事情了)。
如果你点击导入的模型对象,在Inspector窗口中你可以看到一个meshfilter字段。如果你点击它,将会获取项目中可用的网格。好了,我们现在退换remians中的所有立方体为桶状物体的一部分。
换掉盒子碰撞机,网格碰撞机处理将会更加便利。删除所有碎片上的所有盒子碰撞机,取而代之的是网格碰撞机。检查每一个网格碰撞机,确保正确(barrel_fragment_01需要barrel_fragment_01,等等)的网格模型被应用到碎片上。
如果一切设置正确,你将会看到一个桶状物体破碎成8块更小的碎片。
更多的细节
这种相同的系统亦可以应用于其他的效果,也同样对物体的销毁产生影响。为什么这么说呢?将这种效果添加到碎片!添加声音到一种自然的裂纹效果。还可以添加粒子效果,将会产生烟雾效果。
总结
此文中,我们展示了一种物体破碎为碎片的最直接简单的方法。现在,你知道了如何销毁一个对象,将其从游戏中删除;在物体被销毁之前,如何将其退换为更小的碎片;如何让那些小的碎片自我销毁。
这个系统可以被修改和改装以便适合其他特殊的目的。比如,射击一个箱体或者桶状物体使其粉碎,当击中时,我们可以运用此系统创建一个爆炸效果。或者让一只小船破裂为两片。尽情的发挥你的想象力吧!