改变Rigidbody组件中IsKinematic属性的实验
本文由日本一位Unity资深技术专家写作,旨在帮助Unity初学者快速学习Unity相关技术。在今天的文章里,作者通过一系列的实验,详细介绍了Rigidbody组件里的IsKinematic属性及其用途。
Rigidbody组件里,IsKinematic对于初学者来说是一个特别难以理解的属性。
本文围绕IsKinematic设定选项展开一系列实验,并对其进行解释说明。
文章内容将分为以下几个部分:
1、测试环境
2、关于Rigidbody
3、关于IsKinematic
4、 IsKinematic的优点
5、实验
(1) 当球体滚动时的IsKinematic设定
(2)当球体被抛出去时的IsKinematic设定
(3)自由落体时的情况
(4)动态切换IsKinematic值
6、 总结
macOS 10.13 High Sierra
Unity2018.1.0f2
概括来说,Rigidbody是Unity开发引擎中控制物理系统的必要组件。
Rigidbody参数
当我第一次看到这些设定选项时,老实说我并不明白其中涵义。
true和false,到底哪一个设定会受到物理系统的影响呢?
后来我发现:如果为true,则不会受到物理系统的影响。如果为false,发生Rigidbody运动时则会受到物理系统的影响。
在Unity操作手册中,「Rigidbody概述」这一部分写的是「使用Rigidbody时不要更改Transform值」。
既然如此,那么,还有设定IsKinematic的必要吗?后来,在Unity操作手册英文版里,我看到一段这样的描写「如果想以一种非物理的方式进行表现,在这种情况下,请勾选IsKinematic」。
对此,我的疑问不减反增:如果不是物理系统的行为,为什么还需要设定Rigidbody呢?
作为初学者的我即使这样想,但我明白它们也有一定的好处,不但能够在Collider中检测碰撞,还能动态改变IsKinematic值。
在Unity操作手册英文版里,有个滑动门的案例,能够很好的说明这个问题。
通常,当门关上的时候,已经开启碰撞体的角色会被挡在门外。
当角色开门的时候,通过设定脚本将门滑动到指定位置,角色即可顺利通过。相反,如果对物理系统行为设置不当的话,有时候门会被吹飞,再恢复到原来的位置则相对不那么容易。
另外,开门和关门的时候,只需切换IsKinematic状态。例如开门时,IsKinematic会控制位置,但如果用武器攻打门的话,因为Rigidbody设定的缘故,门可能会被打飞。
鉴于这些问题,与其用Rigidbody处理门的问题,不如直接控制人物。
下面我将进行一些实验来展示修改IsKinematic属性值所产生的不同。
(1)当球体滚动时的IsKinematic
现在,改变数值,我们观察一下运动发生的状态。
开始掷球。
准备的球有两种不同的isKinematic值,如下:
isKinematic : true
isKinematic : false
同时对两个球施加力的时候,观察一下运动状态。
当ForceMode为Impulse时,下图的左上角数值表示施加力的大小。
两种不同IsKinematic值的球的滚动情况
因为它不受物理系统的影响,如果IsKinematic为ture时,根本不起作用。
(2)当球体被抛出去时的IsKinematic
证实一下球体被抛出去的状态。
两种不同IsKinematic值的球的被抛出去情况
和滚动的一样,当IsKinematic为ture时,就算用AddForce,白球也不会动。
(3)自由落体的情况
虽然结果已经显而易见了,但仍确认一下自由落体时的情况。
两种不同IsKinematic值的球的自由落体情况
当IsKinematic为ture时,不受重力的影响。
以左边物体的Rigidbody为例,当UseGravity为true时,IsKinematic具有优先性。
所以,动态切换IsKinematic的时候,别忘了取消勾选UseGravity。
(4)动态改变IsKinematic值
以动态切换IsKinematic为例,实现以下功能:击中球1秒后,通过脚本来改变运动。
有了Rigidbody,当IsKinematic为false时发生碰撞。由于Mass的差异,球飞出去的方式也有所不同。
球的反击
粉红色的球从屏幕右侧滚出,一秒钟后,白球和黄球将IsKinematic自动设置为true,并开始往复运动。该状态可直接在脚本的Transform中进行设置。
从上图可以看到,画面前方的粉红色球被质量较大的黄球碰撞,向相反方向滚动,并越过往复运动范围。后侧粉红色的球被击中多次,但其被白球碰撞后并没有滚动到图片最右边。
下一步借助Cube来进行碰撞。
Cube的反击
可以发现,有了IsKinematic之后,为粉红色的球提供了一个力。
由此延伸至游戏开发实操中,Cube可以作为地牢里的移动壁垒装置,用于将设定的角色打落到地下室底部。
同时需要注意的是,在体积上,移动壁垒最好比角色大一些。如「球的反击」一图所示,如果碰撞的球大小相同,Rigidbody则会出现如图所示的奇怪现象。
多数情况下,通过脚本来控制对象的移动,或许也是不错的选择。
Rigidbody的IsKinematic使用方法,对初学者来说的确有些难以理解。
一开始可能很难使用,但借助脚本来控制对象的移动,总体上来说还是很简便的。
希望本文的介绍对你有所帮助。
推荐阅读
Made with Unity | 3D的瑞克和莫蒂:就是要有趣
Made with Unity | 中国元素海外开花,打造西游新玩法
官方活动
喜欢本文,请点“在看”