[教程] 在Unity中制作物体破碎效果

这篇教程将教大家如何在Unity中制作一个简单的碎片效果。当物体撞击或销毁时,我们将物体分裂为更小的碎片来取代之前的仅仅直接“删除”物体。
需求
这篇教程需要最新版本的Unity,已经一些基础的Unity经验。为了稍后教程中更高级的效果,还需要一个3D模型工具。如果没有可用的模型,或者不想自己创建模型,我们在这里为大家提供了可下载资源。

在特效的基础版本中,当启动时一个立方体将会被销毁,只留下一些碎片真实的掉到地面上:
 
 
之后,我们将立方体换为更复杂的管状模型:
 
 
你可以自己试一下:
 
基础设置
创建一个新的Unity工程并打开一个新的场景。创建一个平面来作为地面,创建一个立方体来作为可被破坏的物体。然后放置一个方向光让物体更加明显,创建两个新材质并将它们分配给地面和立方体,这样我们就能区分来它们了。然后移动摄像机以便看到所有物体:
 
销毁立方体
有很多种方法来“销毁”立方体。现在,我们将采用最简单的的方法。

创建一个新的JavaScript脚本并命名为destructionController.js。我们将所有移除立方体和创建碎片的方法都放在这里。在里边添加以下代码:

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

现在,将脚本添加给立方体。开始游戏进行一次测试运行,立方体将会被 销毁。
 
被移除后,就像在截图中看到的一样,立方体在层级面板中也不存在了。
创建碎片

现在创建八个小的立方体;这些将作为当前大立方体的“碎片”。给这些小立方体添加和大立方体一样的材质。(先不要担心他们的样子,稍后会让它们看起来超级赞)他们看起来是这样的:
 
将八个立方体堆砌成一个单个的大立方体,注意它们之间不能有交叉:
 
给每个立方体一个刚体组件,将它们的质量(mass)设置为22,激活使用重力(use gravity)并禁用动力学(is kinematic)。这会使碎片使用物理特性落下。如果你想的话可以稍后自己改变这些值来做出更加适合你游戏的效果。
 
现在将小立方体打组到一个新的空游戏对象上,并将它命名为remainCube。当原来的立方体销毁时,将会被这个由小立方体组成的物体取代。
 
将remainCube物体拖到工程文件夹中来创建一个预制。创建好之后,从场景中将它删掉,这样它就可以被使用了。
使残片出现

将之前代码完善为如下:

var remains: GameObject;
function Update()
{
    if(Input.GetKey(Keycode.space))
    {
        Instantiate(remains, transform.position, transform.rotation);
        Destroy(gameObject);
    }
}

这将会在原来立方体的位置创建一个残片。之后,原来的立方体会被移除,这会给人一种新生成的立方体还是原来立方体的错觉,但是这个立方体“坏掉了”。
为了能让它工作起来,我们不得不手动为立方体分配残片。点击它,在检视面板会看到DestructionController脚本。有一个被叫做Remains的位置,并且现在应该是空的。从工程文件夹中将remainsCube预制拖到这个位置。

现在检视面板中的Destruction Controller脚本看起来应该是这样的:
 
首次优化
来一次测试运行吧!如果所有东西设置都正确,当按下空格时,残片就会取代立方体。幸运的话它们应该会滚落到地面上。

这就是基础的立方体:
 
应该转换成类似于这种:
 
真不幸
不幸的是,它没有保证碎片以一个好的方式滚落。幸运的是,有办法来解决这个问题

创建一个新的空物体并给它一个球体碰撞器,但是不要添加刚体。将残片拖到场景中,这样就可以编辑他们了。将球体碰撞器添加给残片,这样它就和一些立方体有了交叉:
 
现在,碎片会马上碰到球体,出现一个滚落效果:
 
 
移除碎片

根据现在创建的游戏,我们不能在场景中一次提供太多的“碎片”。最直接的方法是在几秒钟之后删除它们。为了这样做,创建一个新的JavaScript文件并命名为selfDestruct.js。加入以下代码:

function Start()
{
    yield WaitForSeconds(4.0);
    Destroy(gameObject);
}

当物体被创建后,它将会等四秒钟,然后销毁自身。将这个脚本添加给remainCube物体。如果现在销毁立方体并创建残片,那么残片将会在四秒钟后销毁它们自己。

这就对了!现在就有了一个当物体销毁时,可以有效的使物体破碎成更小碎片的基础。现在就可以按照这个样子来使用这个特效了,不过让我们进一步来看看在更复杂的物体中怎么使用它。
使用真实的物体来取代立方体

现在我们已经有了一个基础的系统,我们可以通过将立方体替换为实际物体来使效果更漂亮。
 
如果你擅长使用3D建模工具,那么你就可以创建自己的物体了。如果不擅长,或者手头没有可用的资源,可以在这里下载准备好的3D文件。

将文件复制到资源文件夹中,3D模型会自动被导入以供使用。在用它们之前,点击资源浏览器( AssetExplorer)中的文件以便确保资源文件是按照缩放比例为1正确导入的(不是0.1或0.001;不然制作会变的复杂)。
 
观察物体,在检视面板可以看到一个被称作meshfilter 的区域。点击它,会在工程面板得到可用网格的列表。现在用这个管状模型替换那些立方体。
 
完整的模型使用barrel网格;小的立方体碎片需要用名字为barrel_fragment_01到barrel_fragment_08的网格。这些分配好之后,将它们的位置坐标设置为(0,0,0)。(它们的轴心点已经设置好了,这样它们位置就很容易被归零了)。
用一个网格碰撞器来取代之前的立方体碰撞器。移除碎片上所有的立方体碰撞器,并且全部用网格碰撞器来取代。检查每一个网格碰撞器并确保每一个都添加了正确的网格(即barrel_fragment_01需要barrel_fragment_01网格等等)。
 

上边的步骤做完之后,将所有的碰撞器设置为convex。(一个非凸网格碰撞器不能和其他非凸网格碰撞器发生碰撞。这是unity程序的问题。)还有,要移除添加到残迹上边的球体碰撞器,这个现在已经不需要了。
如果以上步骤全部设置正确,将会得到一个可以碎成8部分的管状模型。
进一步的细节
同样这个系统可以用于添加其他的毁坏效果。你有爆炸效果吗?将它添加到残迹当中!添加一个破裂的声音。在里边添加一个粒子效果,创建一个蓬松的烟雾特效。
总结
这篇教程中向大家展示了最简单直接的制作物体破碎的效果的方式。现在知道了怎么毁坏一个物体,从游戏中移除物体;在破碎之前用更小的碎片替换物体;还有就是后来碎片何如完成自身销毁。

这个系统现在可以被修改或适应很多特殊的需求。当射击的时候可以放置板条箱或管状模型的碎片。当飞机坠毁时可以创建一个爆炸。或者可以创建一个船分裂成两半的事故效果。尽情玩耍吧!

转自:http://www.manew.com/thread-99529-1-1.html

猜你喜欢

转载自blog.csdn.net/abcd5711664321/article/details/68946104