Rigidbody 2D组件将对象置于物理引擎的控制之下。许多熟悉的概念从标准刚体组件(standard Rigidbody component)继承到Rigidbody 2D组件;不同之处在于在2D中,对象只能在XY平面上移动,只能在垂直于XY平面的轴(Z轴)上旋转。
Rigidbody 2D 是怎么工作的???
通常,Unity编辑器的Transform组件定义了游戏对象(及其子对象)在场景中的位置,旋转和缩放。当Transform发生改变时,它会去更新其他的组件来确保渲染的位置或者碰撞器的位置。
2D物理引擎能够移动碰撞器并使其相互作用,因此物理引擎需要一个方法将碰撞器的运动传递给Transform,这种移动和与碰撞器的连接是Rigidbody 2D组件的用途。
Rigidbody 2D组件会覆盖Transform并将其更新为Rigidbody 2D定义的位置/旋转。请注意,虽然您仍然可以通过自己修改Transform组件来覆盖Rigidbody 2D(因为Unity公开了所有组件上的所有属性),但这样做会导致GameObjects相互传递或相互进入等问题,以及不可预测的移动。
当Collider 2D附着在Rigidbody 2D上时,不应该使用Transform或any collider offset(任何碰撞器偏移)直接移动Collider 2D; 应该移动Rigidbody 2D。这确保最佳性能并确保正确碰撞检测。
Body Type
根据Body Type属性选择的不同,界面会有不同的属性呈现。
Body Type有三种选择; 每个定义一个共同的行为和属性。任何连接到Rigidbody 2D的Collider 2D都会继承Rigidbody 2D的Body Type。
- Dynamic
- Kinematic
- Static
注意:尽管Rigidbody 2Ds经常被描述为相互碰撞,但碰撞的每个物体都必须附有Collider 2D。没有碰撞器,刚体2D不会相互碰撞。(Rigidbody 2D只需要一方有就可以发生碰撞)
改变Rigidbody 2D的Body Type可能是一个棘手的过程。当“Body Type”发生变化时,会立即重新计算各种与质量相关的内部属性,并且需要在GameObject的下一个FixedUpdate中重新评估连接到Rigidbody 2D上的Collider 2Ds的所有现有接触点。根据与身体连接的接触点和Collider 2D的数量,改变Body Type会导致性能的变化。
Body Type: Dynamic
Dynamic 是模拟Rigidbody 2D在仿真环境下运动,拥有真实的属性:有限质量和阻力,受重力和外力影响。会与其他每个Body Type类型的GameObject相撞,最具有互动性。也是Rigidbody 2D默认的类型,是移动的场景类型,但也是性能消耗最大的类型。因为它具有动态性和与周围物体的互动性。此体型可以使用所有Rigidbody 2D属性。
不要使用“Transform”组件来设置Dynamic Rigidbody 2D 的位置或旋转。模拟根据其速度重新定位动态刚体2D; 您可以通过脚本应用的力直接更改,或通过碰撞和重力间接。
- Body type:设置Rigidbody 2D的Body类型,以便您可以操纵运动(位置和旋转)和Collider 2D交互行为。
- Material:物体材质;使用它为附加到特定父Rigidbody 2D上的所有Collider 2Ds指定一个公共材质。
说明:A Collider 2D uses the following order of priority to determine which Material setting to use: (使用物理材质的顺序)
- A Physics Material 2D specified on the Collider 2D itself.(优先使用collider上面的)
- A Physics Material 2D specified on the attached Rigidbody 2D.(如果collider上面不存在,再使用Rigidbody 2D上面的材质,如果没有使用None默认材质)
-
Simulated:启动物理模拟,gameobject收到重力和相关力作用,对Collider 2D和Joint 2D进行约束。
注意:当不需要模拟某个gameobject的物理行为时,取消模拟比Disable Rigidbody 2D组件要好,原因如下(原文档内容:大意是使用取消模拟相比于Disable Rigidbody 2D不需要额外的时间和空间开销)
Use Auto Mass:勾选后,Rigidbody 2D从其Collider 2D中自动检测GameObject的质量。
Mass:定义Rigidbody 2D的质量。如果选择了使用Use Auto Mass(自动质量),它将显示为灰色。
Linear Drag:线性阻力系数,影响线性运动的阻力系数
Angular Drag:角阻力系数,影响旋转运动的阻力系数
Gravity Scale:定义GameObject受重力影响程度
Collision Detection:定义如何检测Collider 2D之间的碰撞
1.Discrete:将碰撞检测设置为离散,如果物理更新过程中移动速度足够快,则具有Rigidbody 2D和Collider 2D的游戏对象可以重叠或相互穿过。碰撞触点仅在新位置生成。
2.Continuous:将碰撞检测设置为连续,具有Rigidbody 2D和Collider 2D的游戏对象在更新期间不会相互通过。相反,Unity会计算任何Collider 2D的第一个影响点,并将GameObject移动到那里。请注意,这比Discrete需要更多的CPU时间。Sleeping Mode:定义GameObject如何“休眠”以在处于静止状态时节省处理器时间。
1.Never Sleep:禁用睡眠(应尽可能避免选择Never Sleep,因为它可能会影响系统资源)。
2.Start Awake:GameObject最初是清醒的。
3.Start Asleep:GameObject最初是休眠的,但可以被碰撞唤醒。Interpolate:定义如何在物理更新之间插值GameObject(游戏物体)的运动(当运动趋于不稳定时很有用)。
1.None:没有插值运算
2.Interpolate:根据GameObject在先前帧中的位置对运动进行平滑处理。
3.Extrapolate:基于其在下一帧中的位置的估计来平滑运动。Constraints:定义Rigidbody 2D运动的任何限制。
1.Freeze Position:有选择地停止Rigidbody 2D在世界X和Y轴上的移动。
2.Freeze Rotation:选择性地停止围绕Z轴旋转的Rigidbody 2D。
Body Type: Kinematic
与Dynamic Rigidbody 2D 相比,Kinematic Rigidbody 2D不受重力和力的影响,对系统资源的需求很低。Kinematic Rigidbody 2D设计为通过Rigidbody2D.MovePosition或Rigidbody2D.MoveRotation显式重新定位。使用物理查询来检测碰撞,并使用脚本来确定Rigidbody 2D应该移动的位置和方式。
Kinematic Rigidbody 2D仍然通过速度运动,但速度不受力或重力的影响。Kinematic Rigidbody 2D不与其他Kinematic Rigidbody 2D碰撞,也不与Static Rigidbody 2D碰撞;它只与Dynamic Rigidbody 2D 碰撞。Kinematic Rigidbody 2D在碰撞过程中表现得像一个不可移动的物体(仿佛它有无限的质量)。与质量相关的属性在这种身体类型中是不可用的。
相比于Dynamic Rigidbody 2D ,Kinematic Rigidbody 2D有一个单独的属性:
- Use Full Kinematic Contacts:使用全运动触点,Kinematic Rigidbody 2D will collide with all Rigidbody 2D Body Types(Kinematic Rigidbody 2D与所有类型的Rigidbody 2D产生碰撞);但是发生碰撞时Kinematic Rigidbody 2D不会移动,这是一个具有无限质量的物体。
Body Type: Static
如果有任何碰撞,Static Rigidbody 2D的行为就像一个不可移动的物体(好像它有无限质量)。它也是使用资源最少的身体类型。
A Static body only collides with Dynamic Rigidbody 2Ds
一个Static Rigidbody 2D仅与Dynamic Rigidbody 2Ds发生碰撞。不支持两个Static Rigidbody 2D碰撞,因为它们不是为了移动而设计的。
有两种方法可将Rigidbody 2D标记为静态:
1.对于具有Collider 2D组件的GameObject,根本不具有Rigidbody 2D组件。所有这些Collider 2D都在内部被认为是附加到单个隐藏的Static Rigidbody 2D组件。
2.对于GameObject来说,要有一个Rigidbody 2D并且要将Rigidbody 2D设置为Static。
注意:Static Rigidbody 2Ds and Kinematic Rigidbody 2Ds will interact(交互) with each other if one of their Collider 2Ds is set to be a trigger. 这里会和Use Full Kinematic Contacts属性所说的有 “冲突”吗? 如果Kinematic Rigidbody 2D不勾选Use Full Kinematic Contacts属性,还可以和Static Rigidbody 2D交互吗?答案是肯定的,因为这里勾选Trigger走的是触发器规则(不是走的碰撞器规则),不会发生冲突脚本回调(OnCollisionEnter,OnCollisionStay,OnCollisionExit)。
总结:
- Dynamic Rigidbody 2D :受重力和力的作用,最消耗资源,具有互动性
- Kinematic Rigidbody 2D:不受重力和力的作用,相对节约资源,仅仅只和Dynamic Rigidbody 2D有互动性(变现得像一个具有无限质量的物体)。(勾选Trigger或勾选Use Full Kinematic Contacts是两回事,别弄混了)
- Static Rigidbody 2D:消耗资源最少,仅和Dynamic Rigidbody 2D有互动性(变现得像一个具有无限质量的物体)