查看原文
其他

改变Rigidbody组件中IsKinematic属性的实验

日本网友 Unity官方平台 2022-05-07

本文由日本一位Unity资深技术专家写作,旨在帮助Unity初学者快速学习Unity相关技术。在今天的文章里,作者通过一系列的实验,详细介绍了Rigidbody组件里的IsKinematic属性及其用途。


Rigidbody组件里,IsKinematic对于初学者来说是一个特别难以理解的属性。


本文围绕IsKinematic设定选项展开一系列实验,并对其进行解释说明。


文章内容将分为以下几个部分:





1、测试环境


2、关于Rigidbody


3、关于IsKinematic


4、 IsKinematic的优点


5、实验


      (1) 当球体滚动时的IsKinematic设定


      (2)当球体被抛出去时的IsKinematic设定


      (3)自由落体时的情况


      (4)动态切换IsKinematic值


6、 总结




1、测试环境


macOS 10.13 High Sierra

Unity2018.1.0f2

 

2、关于Rigidbody


概括来说,Rigidbody是Unity开发引擎中控制物理系统的必要组件。


Rigidbody参数 


3、关于IsKinematic

 


当我第一次看到这些设定选项时,老实说我并不明白其中涵义。 


true和false,到底哪一个设定会受到物理系统的影响呢?


后来我发现:如果为true,则不会受到物理系统的影响。如果为false,发生Rigidbody运动时则会受到物理系统的影响。


4、IsKinematic的优点


在Unity操作手册中,「Rigidbody概述」这一部分写的是「使用Rigidbody时不要更改Transform值」。

 

既然如此,那么,还有设定IsKinematic的必要吗?后来,在Unity操作手册英文版里,我看到一段这样的描写「如果想以一种非物理的方式进行表现,在这种情况下,请勾选IsKinematic」。


对此,我的疑问不减反增:如果不是物理系统的行为,为什么还需要设定Rigidbody呢?


作为初学者的我即使这样想,但我明白它们也有一定的好处,不但能够在Collider中检测碰撞,还能动态改变IsKinematic值。


在Unity操作手册英文版里,有个滑动门的案例,能够很好的说明这个问题。



通常,当门关上的时候,已经开启碰撞体的角色会被挡在门外。

 

当角色开门的时候,通过设定脚本将门滑动到指定位置,角色即可顺利通过。相反,如果对物理系统行为设置不当的话,有时候门会被吹飞,再恢复到原来的位置则相对不那么容易。


另外,开门和关门的时候,只需切换IsKinematic状态。例如开门时,IsKinematic会控制位置,但如果用武器攻打门的话,因为Rigidbody设定的缘故,门可能会被打飞。


鉴于这些问题,与其用Rigidbody处理门的问题,不如直接控制人物。


下面我将进行一些实验来展示修改IsKinematic属性值所产生的不同。


5、实验


(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则会出现如图所示的奇怪现象。


多数情况下,通过脚本来控制对象的移动,或许也是不错的选择。 


6、总结


Rigidbody的IsKinematic使用方法,对初学者来说的确有些难以理解。

 

一开始可能很难使用,但借助脚本来控制对象的移动,总体上来说还是很简便的。

 

希望本文的介绍对你有所帮助。


推荐阅读

Made with Unity | 3D的瑞克和莫蒂:就是要有趣

Made with Unity | 中国元素海外开花,打造西游新玩法

在Unity中程序化生成的地牢环境

Unite Shanghai 2020正式启动,暖冬特惠票热销中

使用Unity着色器实现精灵(Sprite)涂鸦效果

Unity博主营地|建议收藏!游戏开发素材资源渠道合集



官方活动


Unite Shanghai 2020正式启动,暖冬特惠票热销中,购票即可获得多款Asset Store特定精品资源5折优惠码。[了解详情......



AR应用创作大赛
Unity与商汤科技强强联手举办AR应用创作大赛,帮助开发者了解使用商汤AR SDK进行开发的方法,高效的进行AR内容创作,推进AR应用创新与落地。[了解详情...



喜欢本文,请点“在看”



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存