Unity2D

Physics Reference 2D--Rigidbody

2018-12-12  本文已影响19人  夜行水寒

  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。

  注意:尽管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.png

  Dynamic 是模拟Rigidbody 2D在仿真环境下运动,拥有真实的属性:有限质量和阻力,受重力和外力影响。会与其他每个Body Type类型的GameObject相撞,最具有互动性。也是Rigidbody 2D默认的类型,是移动的场景类型,但也是性能消耗最大的类型。因为它具有动态性和与周围物体的互动性。此体型可以使用所有Rigidbody 2D属性。

  不要使用“Transform”组件来设置Dynamic Rigidbody 2D 的位置或旋转。模拟根据其速度重新定位动态刚体2D; 您可以通过脚本应用的力直接更改,或通过碰撞和重力间接。

  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默认材质)

Body Type: Kinematic

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有一个单独的属性:

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走的是触发器规则(不是走的碰撞器规则),不会发生冲突脚本回调(OnCollisionEnterOnCollisionStayOnCollisionExit)。

总结:

就是这样,我还会回来的!.png
上一篇 下一篇

猜你喜欢

热点阅读