1.Rigidbody overview
刚体是可以让一个GameObject(以下简称游戏对象)表现出物理行为的主要组件,附加到游戏对象上之后可以立马给这个游戏对象施加一个重力。如果给这个游戏对象上增加了一个或者多个Collider组件的话,这个游戏对象可以通过其他的碰撞进行移动。
由于Rigidbody组件接管了游戏对象的运动,所以不应该试图在脚本里通过修改Transform组件里面的类似于position和rotation的属性来让游戏对象移动,而是应该通过施加改变forces(力)然后让物理引擎去计算游戏对象的移动结果。
在某些情况下,你可能会想要一个带刚体的游戏物体,但是这个游戏物体的移动不受物理引擎的控制。例如:你有时会想通过脚本代码控制你的角色方向,但是你的角色仍然可以被触发器检测到,这种由脚本产生的非物理移动被称为动力学运动。Rigidbody组件有个叫做IsKinematic 的属性,它将其从物理引擎的控制中移除,并且允许它从脚本中的运动学移动。对象的物理性质的开关可以通过脚本中的IsKinematic来改变,但这可能带来性能开销的增加,所以应该谨慎使用。
当一个刚体移动速度比定义好的minimum线性或者旋转速度,物理引擎假设这个对象已经停止,这时候这个游戏对象不可以移动直到它接受了一个力或者碰撞,并且同时设置了休眠模式。这个优化意味着处理器在这个游戏对象被再次唤醒之前不需要花费时间去处理更新。
大多数情况下,Rigidbody组件的唤醒和休眠的发生是透明的。然而如果通过修改组件的位置将静态对撞机移入其中或者远离它,则GameObject无法被唤醒。换一种说法就是当一个物体从下面移出(或者刚体组件从上面移出),会导致刚体对象悬挂在空中。在这种情况下可以通过使用WakeUp去显式的唤醒这个对象。获取更多关于Rigidbody和Rigidbody的信息
2.Colliders
Collider组件定义的物体的形状用于物理碰撞。一个不可见的碰撞器的形状不需要完全和对象的网格相同,事实上粗略的近似更加逼真而且在游戏中难以区分。
最简单的碰撞机(和处理器的密集程度)也是最原始的碰撞机。比如在3D中的Box Collider,Sphere Collider和Capsule Collider;在2D中的Box Collider 2D和Circle Collider 2D。可以将任意的碰撞机添加到同一个对象上面以创建复合碰撞机。
通过调整复合碰撞机的位置和尺寸,可以很好的接近对象的形状,同时保持处理器的开销。通过在子物体上增加碰撞机,可以进一步的获得灵活性(例如相对于父对象的局部旋转框)。创建这样的复合碰撞机的时候,应该有且只有一个Rigibody组件被添加到根物体上面。
原始对撞机无法在裁剪变换中正常工作-意味着如果在变换层次结构中使用旋转和非均匀缩放的组合会导致生成的形状不再和原始形状相匹配,原始碰撞机也就不会正确的表现(个人理解:在视觉上感觉不对劲)
在某些情况下,复合碰撞机也会表现得不准确。在3D中可以使用Mesh Collider去精确得匹配对象的网格形状。在2D中,Polygon Collider通常和精灵图形的形状精确的匹配,但可以重新调整碰撞机的形状以达到你喜欢的任何细节等级。以上的碰撞机消耗的处理器性能比原始碰撞机更高,因此需要谨慎的使用它们以保持良好的性能。另外网格碰撞体通常不会和其他的网格碰撞体发生碰撞(即,当他们接触时无法发生任何事情)。在某些情况下,你可以在Inspector中将网格碰撞机标记为“Convex”来解决这个问题。这将产生像“凸包”形状的碰撞机,其类似于原始网格,但填充了一些“undercuts ”。这样做的好处是凸网格对撞机可以与其他网格对撞机碰撞,因此您可以当你有一个具有合适形状的移动角色时使用此功能。然而,一个更好的一般规则是使用网格碰撞器用于,并使用复合原始碰撞器近似移动对象的形状。
可以将碰撞器添加到没有Rigidbody组件的对象中,以创建场景的地板,墙壁和其他静止元素。这些被称为静态对撞机。通常,您不应通过更改“Transform”的位置来重新定位静态对撞机,因为这会严重影响物理引擎的性能。具有刚体的物体上的碰撞器被称为动态碰撞器。静态碰撞器可以与动态碰撞器相互作用,但由于它们没有刚体,因此它们不会响应碰撞而移动。
3.Physics materials
当碰撞者相互作用时,他们的表面需要模拟他们应该代表的材料的属性。例如,一块冰将是光滑的,而橡胶球将提供大量的摩擦并且非常有弹性。虽然碰撞时碰撞器的形状不会变形,但可以使用物理材料配置它们的摩擦和弹跳。获得恰到好处的参数可能涉及一些试验和错误,但冰材料,例如将具有零(或非常低)的摩擦和具有高摩擦和近乎完美的弹性的橡胶材料。有关可用参数的更多详细信息,请参见物理材料和物理材料2D的参考页面。请注意,由于历史原因,3D资源实际上称为物理材质(没有S),但2D等效物称为物理材质2D(带有S)
4.Triggers
脚本可以检测何时发生碰撞并触发OnCollisionEnter函数。 但是,您也可以简单地使用物理引擎检测一个碰撞器何时进入另一个碰撞器的空间而不会产生碰撞。 配置为触发器的对撞机(使用Is Trigger属性)不会表现为实体对象,只会允许其他对撞机通过。 当对撞机进入其空间时,触发器将调用触发器对象脚本上的OnTriggerEnter函数。
5.Script actions taken on collision
发生碰撞时,物理引擎会在附加到所涉及对象的任何脚本上调用具有特定名称的函数。您可以在这些函数中放置您喜欢的任何代码来响应碰撞事件。例如,当汽车撞到障碍物时,您可能会发挥碰撞声音效果。
在检测到冲突的第一个物理更新中,调用OnCollisionEnter函数。在两个物体的碰撞器未分离的时候,调用OnCollisionStay;OnCollisionExit表示两个物体的碰撞器已经分离。触发器碰撞器调用类似的OnTriggerEnter,OnTriggerStay和OnTriggerExit函数。请注意,对于2D物理,有名称附加了2D的等效函数,例如OnCollisionEnter2D。对于正常的非触发碰撞,还有一个额外的细节,即所涉及的对象中至少有一个必须具有非运动刚体(即,必须关闭运动学)。如果两个对象都是运动学的刚体,则不会调用OnCollisionEnter等。对于触发器碰撞,此限制不适用,因此运动和非运动刚体都会在进入触发器对撞机时提示调用OnTriggerEnter。
6.Collider interactions
碰撞器彼此之间的交互方式具体取决于Rigidbody组件的配置方式。 三个重要配置是静态对撞机(即根本没有连接刚体),刚体碰撞器和运动刚体碰撞器。
(1)Static Collider
这是一个具有Collider但没有Rigidbody的GameObject。静态对撞机用于 level geometry ,它总是停留在同一个地方,永远不会四处移动。传入的刚体对象将与静态对撞机发生碰撞,但不会移动它。
物理引擎假定静态对撞机永远不会移动或改变,并且可以基于此假设进行有用的优化。因此,在游戏过程中不应对静态对撞机设置disabled/enabled,移动或缩放。如果您确实更改了静态对撞机,那么这将导致物理引擎进行额外的内部重新计算,从而导致性能大幅下降。更糟糕的是,这些变化有时会使对撞机处于未定义状态,从而产生错误的物理计算。例如,针对改变的静态对撞机的光线投射可能无法检测到它,或者在空间中的随机位置检测到它。此外,被移动的静态对撞机击中的刚体不一定会“被唤醒”,静态对撞机也不会施加任何摩擦力。由于这些原因,只应改变作为刚体的碰撞器。如果您想要一个不受传入刚体影响但仍然可以从脚本移动的对撞机对象,那么您应该将一个Kinematic Rigidbody组件附加到它而不是根本没有Rigidbody。
(2)Rigidbody Collider
这是一个带有碰撞器的游戏对象,附带一个普通的非运动刚体。 刚体碰撞器由物理引擎完全模拟,可以对脚本施加的碰撞和力作出反应。 它们可以与其他物体(包括静态对撞机)发生碰撞,是使用物理学的游戏中最常用的对撞机配置。
(3)Kinematic Rigidbody Collider(运动学刚体)
这是一个带有Collider和附加运动刚体的GameObject(即,启用了Rigidbody的IsKinematic属性)。您可以通过修改其Transform组件来从脚本中移动Kinematic Rigidbody对象,但它不会像非运动刚体那样响应碰撞和力。Kinematic Rigidbody应该用于可以偶尔移动或disabled/enabled 的碰撞器,否则它们应该像静态碰撞器一样运行。这方面的一个例子是滑动门,它通常应该作为一个不可移动的物理障碍物,但必要时可以打开。与静态对撞机不同,移动的运动刚体会对其他物体施加摩擦力,并在接触时“唤醒”其他刚体。
即使是不动的,运动刚体碰撞器也会对静态碰撞器产生不同的行为。例如,如果将对撞机设置为触发器,则还需要向其添加刚体以便在脚本中接收触发事件。如果您不希望触发器在重力作用下或受物理影响,那么您可以在其刚体上设置IsKinematic属性。
可以使用IsKinematic属性随时在正常和运动行为之间切换刚体组件。
一个常见的例子是“ragdoll”效果,其中角色通常在动画下移动,但是在爆炸或重碰撞时被物理抛出。 每个角色的肢体都可以被赋予自己的Rigidbody组件,默认情况下启用IsKinematic。 四肢将通过动画进行正常移动,直到所有这些肢体都关闭IsKinematic并且它们立即表现为物理对象。 在这一点上,碰撞或爆炸力将使角色飞行,其四肢以令人信服的方式投掷。
7.Collision action matrix
当两个对象发生碰撞时,可能会发生许多不同的脚本事件,具体取决于碰撞对象的刚体的配置。下面的图表提供了基于附加到对象的组件调用哪些事件函数的详细信息。某些组合仅导致两个对象中的一个受到碰撞的影响,但一般规则是物理将不会应用于未附加Rigidbody组件的对象。