kshmilyhui 发表于 2020-11-24 09:20

[专栏精选]Unity刚体详解

本文节选自洪流学堂公众号专栏《郑洪智的Unity2018课》,未经允许不可转载。洪流学堂公众号回复专栏,查看更多专栏文章。
洪流学堂,让你快人几步。你好,我是郑洪智。
从这节课开始,我会尝试用一种新的写作风格,也希望大家能够多提意见。背景补充

小新今年数学专业马上大三了,却一直没有找到自己的职业方向,不知道以后要干什么,唯一的爱好就是玩游戏,特别想自己能开发一款成功的游戏。小新趁着暑假去找各种实习兼职,一个偶然的机会收到了一个游戏公司的面试通知。小新欣喜若狂,前去面试,聊到游戏时,小新能滔滔不绝聊出很多东西,但是问到开发游戏的时候,却哑口无言,无法回答面试官的问题。面试官问了很多游戏开发、Unity引擎的问题,小新就下定决心,一定要好好学习一下游戏开发,特别是Unity引擎。小新找到了自己的师兄大智,这位师兄有8年Unity开发经验,想向师兄请教一下学习的方向。没想到师兄特别热情,是一个技术布道者,喜欢研究传播技术,从此小新跟着大智开启了他的Unity学习之旅。
大智告诉小新,叫我“大智”就好了,以后不要叫师兄了哈。Rigidbody 刚体

“大智,昨天我学习了物理系统,知道了碰撞体,那物理系统里面还有别的东西么?”
“你呀,太天真了,Collider只是物理系统的一部分。你看昨天学的Collider,他们都只是一个静态的碰撞体。我们昨天学习过物理系统很重要的是模拟物体的受力情况,物体根据物理规则运动呀。”
“那通过代码修改物体的位置不就能运动起来了么?”
“通过代码直接修改物体的位置并没有通过受力的方式改变物体,所以这种方式并没有应用到物理系统,要想让物体通过受力运动,我们首先要了解一下Rigidbody组件。物体只有添加了Rigidbody组件,才会对受力作出反应。小新,你现在先去看看Unity的文档,看看Rigidbody组件到底是什么吧!”
“收到,我马上就去看!”
小新马上打开Unity文档,找到了Rigidbody的介绍文档https://docs.unity3d.com/Manual/RigidbodiesOverview.html。
Rigidbody组件可以让一个物体受到物理影响。比如添加Rigidbody组建后,物体会立马对重力作出反应。如果物体上还添加了Collider,物体在受到碰撞时也会移动。
“大智,我知道了!Rigidbody可以让物体对受力做出反应,但是我有点和Collider搞不清楚了。”
“这两个是初学者不太容易搞清楚的概念。Collider只是给物体加上了碰撞,让物体拥有了实体,而不是一个可以穿过去‘全息投影’。而Rigidbody是让物体拥有了动态受力的功能。所以我们一般称只有Collider没有Rigidbody的物体叫静态Collider。一般刚体物体上也会有Collider,因为需要和别的物体发生碰撞。如果没有Collider,即使刚体也不会和其他物体碰撞。”
“那是不是不应该给场景里所有的物体添加Rigidbody组件?”
“非常对,场景里有一些物体是基本不会动的,比如说一栋大楼,一块大石头等等,他们只需要阻挡别的物体别穿过他们就行了,所以它们只需要添加Collider就行。因为添加了Rigidbody组件后会带来很多的物理计算,所以只需要给会移动的物体添加Rigidbody就行。”
“我明白了!我说呢怎么给所有物体添加了Rigidbody后卡的跑不起来呢,我去把我的吃鸡场景重新设置一下,嘿嘿!”
“你呀你呀,真是个急性子!顺便好好看一下刚体组件的各个参数!”
“知道啦!”
Rigidbody组件

小新认真看了Rigidbody组件的文档,并做了笔记:




Mass 刚体的质量,单位是千克(kg)Drag 空气阻力,0代表没有空气阻力,无限大的值代表物体会立即停下来(惯性消失)。Angular Drag 物体受到一个扭力旋转时的阻力,0代表没有阻力,但是需要注意的是无限大的值并不能让物体立即停止旋转。Use Gravity 是否受重力影响Is Kinematic 选中时,物体不会受到物理物理引擎的影响,只能通过修改Transform移动物体。Interpolate 插值,如果发现刚体移动有卡顿,可以尝试选择此选项。
None 不使用插值Interpolate 根据上一帧的Transform进行平滑Extrapolate 根据估算的下一帧的Transform进行平滑



Collision Detection 碰撞检测的方式,当你的刚体快速运动时,可能会出现穿透的现象,可以设置这个选项。
Discrete 离散检测,性能较高,默认值Continuous 连续检测。使用此选项时,物体与其他动态Collider(刚体)使用离散检测;与其他静态Collider使用连续检测。如果其他刚体设置为了Continuous Dynamic,会使用连续检测和这个刚体进行碰撞检测。这个选项非常影响性能,如果没有快速运动物体的碰撞检测问题,保持Discrete设置



Continuous Dynamic 动态连续检测。如果其他物体是Continuous或Continuous Dynamic,与这个物体碰撞时会使用连续检测。也会和静态Collider使用连续检测。对于其他的collider(标记为Discrete的Rigidbody)使用离散检测。。用于快速移动的物体。Constraints 约束刚体的运动
Freeze Position 选中后刚体不会在对应的轴上移动



Freeze Rotation 选中后刚体不会在对应的轴上旋转
小新看完之后,还是有一些地方不太清楚,又来骚扰大智。
“大智,刚体的Is Kinematic我明白了是什么,这个有什么用呢?加上刚体不就是为了受力么,为什么还要提供一个这个属性,关掉受力呢?”
“有些情况,我们不想让物体受力,但是仍然能够和其他物体发生碰撞,影响其他物体。比如这个物体上有动画,在播放动画的时候,我们想让动画来控制物体的位置。”
“明白了,但是感觉还是需要用到的时候再去理解。那这个Collision Detection该什么时候设置呢?是不是类似子弹这种情况?”
“说的很对,Collision Detection就是针对快速移动的小物体,比如说子弹,但是通常游戏射击并不用实体的子弹,因为子弹多的时候性能太差了,我可以给你推荐一个文章来看看:https://zhuanlan.zhihu.com/p/22105641”
“谢谢智哥,我也发现了用刚体的话性能太差了,我去看看”
碰撞汇总

“大智,我发现有些情况两个物体发生了碰撞,但是并没有调用脚本中的代码,这是怎么回事?”
“哈哈,这时候我就要祭出大招了,给你两个表格,对照着看看是否会发生碰撞哈。”



OnCollision消息



OnTrigger消息
“太好了,有了这两个表格,能不能获取到消息就很清晰了!”
总结

“我来简单总结一下,今天这个Rigidbody组件是物理系统中非常重要的组件,运动的物体都靠它,遇到问题多去查Unity的文档,里面解释的很清楚。”
“好,我已经掌握的差不多了,下一步就是在我的吃鸡游戏里运用一下,嘿嘿”
今日思考题

“既然你说到了运用,我要给你布置一个小作业,用代码控制一个刚体在不平整的地形上运动,试试看!”
“收到!我去也!”
“收获别忘了分享出来!也别忘了分享给你学Unity的朋友,也许能够帮到他。”
洪流学堂公众号回复专栏,查看更多专栏文章。
页: [1]
查看完整版本: [专栏精选]Unity刚体详解