Physics Reference 2D--Rigidbody 2D

  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

Physics Reference 2D--Rigidbody 2D_第1张图片
Dynamic.png

  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: (使用物理材质的顺序)
  1. A Physics Material 2D specified on the Collider 2D itself.(优先使用collider上面的)
  2. 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不需要额外的时间和空间开销)

    Physics Reference 2D--Rigidbody 2D_第2张图片
    reason

  • 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

Physics Reference 2D--Rigidbody 2D_第3张图片
Kinematic.png

  与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.png

  如果有任何碰撞,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有互动性(变现得像一个具有无限质量的物体)
Physics Reference 2D--Rigidbody 2D_第4张图片
就是这样,我还会回来的!.png

你可能感兴趣的:(Physics Reference 2D--Rigidbody 2D)