这是一个基础教程,介绍如何在 Unity 项目中使用 Rigid Body 和 Physics Materials,让物体下落并产生反弹效果。
本教程不提供中文配音。您可以在下方观看英语配音的视频,并选择中文、英文或其他语言的字幕。视频下方提供了翻译成中文的文字稿。
视频文字稿
大家好!
这是一个基础教程,介绍如何在 Unity 项目中使用 Rigid Body 和 Physics Materials,让物体下落并产生反弹效果。
Unity 提供了一个物理模拟引擎,但要使用这些功能,需要添加一些组件,例如 Rigid Body 和 Colliders,以及其他相关元素。
这是因为物理模拟在计算上开销较大,因此默认情况下,对象不会参与物理模拟。是否以及如何让对象参与物理行为,需要由我们来指定。
好了,我们开始吧。
我在 Unity 中创建了一个简单场景,使用一个 Cube 作为地面,以及一个篮球模型。

我们立刻注意到,Cube 是 Unity 的原生对象,已经自带了一个 Box Collider 组件,而我从外部文件导入的 3D 模型则没有任何类型的 Collider 组件。我们稍后会处理这个问题。

我将篮球模型放在 Cube 上方一定距离的位置,但当我按下 Play 按钮时,立刻发现篮球并没有下落。
要让篮球参与场景的物理模拟,只需为它添加一个 Rigid Body 组件,这可以在对象的 Inspector 中轻松完成。

在该组件的选项中,我们可以看到一些有趣的属性,例如 mass,在本例中我们可以保持默认值,还有 Use Gravity 复选框,它默认是勾选的。因此这一次启动游戏后,我们可以看到篮球确实下落了。

但是它却穿过了下方的 Cube,掉进了虚空。
你可能会想到,也给下方的 Cube 添加一个 Rigid Body 组件,甚至取消重力,让两个对象都参与物理模拟。不过我们很快就会发现,这样并不能解决问题。所以请从 Cube 上移除 Rigid Body,以免产生混淆。
简单来说,篮球穿过了 Cube。虽然 Cube 有 Box Collider,理论上应该检测到碰撞。
问题在于篮球模型本身没有任何 Collider,因此我们需要在 Inspector 中为它添加一个。由于篮球是球形,我们为它选择 Sphere Collider。

现在启动模拟,我们会看到篮球落到 Cube 上,并停在上面。

因此请记住,即使是 Cube,或者任何会与篮球发生交互的场景对象,都必须拥有自己的 Collider。
总结一下:如果两个场景对象想要彼此交互,它们都必须拥有 Collider,否则就会像幽灵一样彼此穿透。另外,如果一个对象需要参与物理模拟,也就是受到重力和其他力的影响,它还必须拥有 Rigid Body 组件。
不过,目前的结果还不够理想。篮球下落并撞击 Cube,但并没有反弹。
对象的材质属性并不是设置在 Rigid Body 上,而是设置在 Collider 上。这些属性适用于任何场景对象,而不仅仅是参与物理模拟的对象。因此,我们需要在 Collider 的选项中进行设置。
在该选项中,我们会看到一个名为 Material 的字段,默认值为 None,提示我们需要为其分配一个 Physic Material 对象。

因此我们在 Project 面板中创建一个 Physic Material。请注意,是 Physic Material,而不是普通的 Material,后者仅影响对象的视觉外观。
接着,将这个新的 Physic Material 分配给篮球的 Sphere Collider,按下 Play 后我们会发现篮球仍然没有反弹。
这是因为默认情况下,新建的 Physic Material 的 Bounciness 值为 0。选择该对象后,在 Inspector 中可以看到它的相关属性。


Physic Material 主要有两个属性:Bounciness 和 Friction。通过调整它们,可以创建更真实或更夸张的反弹效果。例如,提高 Bounciness 可以增强反弹力度,而增加 Friction 可以减少每次反弹后滚动的距离。
现在我们将 Bounciness 设置为 1,这是该字段的最大值,然后启动游戏。这次,篮球会反弹几次后停止。

这种行为已经比较真实,但如何让篮球弹得更高或弹得更多次呢?
我们可以调整 Friction 参数,尤其是两个 Combine 参数。这些参数决定了当两个对象接触时,如何组合它们各自的物理属性。
默认情况下,Bounce Combine 的值是 Average。也就是说,它会对篮球的 Bounciness 值 1 和下方 Cube 的值进行平均。由于 Cube 没有 Physics Material,Unity 会将其视为 0,因此最终的 Bounce 值实际上是 0.5。
如果我们将 Bounce Combine 改为 Maximum,那么实际使用的 Bounciness 就是 1,篮球会弹得更高。
不过现在又出现了另一个问题,它会一直反弹下去。
这种行为看起来有些奇怪。似乎要保持持续而稳定的反弹,Bounciness 的值需要设置为 0.965。至于原因,我也说不清。


当然,在模拟反弹时,表面材质同样很重要。因此我们也需要为 Cube 添加一个 Physic Material。地面、墙壁以及其他不同材质的对象也都应根据其物理特性进行设置,并为它们分配合适的 Bounciness。
具体的组合方式就留给大家自行尝试。请测试不同的 Bounciness、Friction 和 Combine 数值组合。
本教程到此结束。下次再见!