unity3d 物体破碎
在某些项目中,我们可能需要让 Unity3D 中的物体实现破碎效果。接下来,我将详细介绍如何在 Unity 游戏里创建一个简单的物体破碎效果。当游戏中的箱体(或其他物体)被击中或销毁时,我们不再简单地将其删除,而是应用破碎效果,使其变成众多小碎片。
一、要求
要完成本教程,你首先需要安装最新版的 Unity,并且具备使用 Unity 的基本经验。如果要实现更高级的效果,还需要一个 3D 建模工具。若你没有可用的建模工具,或者不想自己建模,可下载本教程的源代码(其中包含有关 Unity 的文件)。
二、破碎效果概述
这种破碎效果的基本版本是:一个立方体(物体)被销毁后,破碎成一些碎片,自然地跌落在地面。稍后,我们会用一个较为复杂的桶状模型替换立方体。
三、基本设置
- 创建一个新的 Unity 项目,并打开一个新场景。
- 创建一个平面作为地面,再创建一个立方体,该立方体将作为被打碎的物体。
- 放置一个平行光,确保物体可见。
- 创建两个材质,分别分配给地面与立方体,以便清晰区分它们。
- 移动摄像头到合适位置,保证所有物体都能被看到。
四、销毁立方体
销毁立方体有多种方法,这里我们采用最简单的方式。
- 创建一个新的 JavaScript 文件,命名为
destructionController.js
。我们会把删除立方体与创建立方体碎片的功能都放在这个文件中。代码如下:function Update() { if (Input.GetKey(KeyCode.Space)) { Destroy(gameObject); } }
- 将该 JavaScript 文件拖动到立方体上,为立方体添加脚本控制。运行并测试游戏,按下空格键时,立方体应该会被删除。立方体被删除后,层级窗口中的立方体也会相应删除。
五、创建碎片
- 创建 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
的副本,然后删除原立方体,给人一种新立方体就是原来的立方体且可破碎的假象。为使该功能正常工作,需手动设置 remains
到立方体上。点击原立方体,在 Inspector 窗口中找到 Destruction Controller
脚本,将预制件 remains
拖动到 Remains
的位置。
七、第一次优化
进行测试!若一切设置正确,按下空格键时,remains
(8 个小立方体的组合对象)应会替换原立方体,并跌落到地面。但我们无法保证碎片能以真实的破碎效果跌落。解决方法如下:
- 创建一个新的
GameObject
对象,并为其添加一个球形对撞机,但不添加刚体。 - 将
remains
拖到场景中以便编辑,把球形对撞机对象附加给remains
,使其与remains
中的立方体相交放置。此时,碎片(小立方体)会立即与球形物体碰撞,产生自然的破碎跌落效果。
八、删除碎片
在一个场景中,我们无法同时渲染过多的碎片。最简单的方法是在立方体破碎后的几秒将碎片删除。具体操作如下:
- 新建一个 JavaScript 文件,命名为
selfDestruct.js
,添加如下代码:function Start() { yield WaitForSeconds(4.0); Destroy(gameObject); }
- 将上述代码附加到
remains
对象。当销毁原立方体并创建碎片后,这些碎片(remains
)会在 4 秒后自我删除。
九、用真实的物体替代立方体
有了基本的破碎效果后,我们可以用真实的物体替换立方体,让效果更加完美。
- 若你擅长使用 3D 建模工具,可创建自己的物体;若不擅长或没有可用的物体替换立方体,可从指定位置下载事先准备好的 3D 文件。
- 将文件拷贝到
asset
目录,3D 模型会自动导入。在Asset Explorer
窗口点击导入的 3D 文件,查看scalefactor
的值,确保其为 1。 - 点击导入的模型对象,在 Inspector 窗口中可看到
meshfilter
字段,点击它可获取项目中可用的网格。将remains
中的所有立方体替换为桶状物体的一部分。 - 用网格碰撞机替换盒子碰撞机,删除所有碎片上的盒子碰撞机,为其添加网格碰撞机。检查每个网格碰撞机,确保正确的网格模型(如
barrel_fragment_01
需要对应barrel_fragment_01
)被应用到碎片上。 - 将所有的网格碰撞机设置为
convex
(非convex
的网格碰撞机无法与其他非convex
网格碰撞机进行碰撞检测),同时删除之前给remains
添加的球形碰撞机。若一切设置正确,你将看到一个桶状物体破碎成 8 块更小的碎片。
十、更多的细节
这种系统不仅可以实现物体破碎效果,还能应用于其他效果,对物体的销毁产生影响。例如,为碎片添加声音,营造自然的裂纹效果;添加粒子效果,产生烟雾效果。
十一、总结
本文介绍了一种让物体破碎为碎片的简单直接的方法。你学会了如何销毁对象、在物体销毁前将其替换为更小的碎片,以及让小碎片自我销毁。该系统可根据特殊需求进行修改和改装,比如射击箱体或桶状物体使其粉碎,创建爆炸效果;让小船破裂为两片等。发挥你的想象力,创造出更多有趣的效果吧!