unity碰撞器概述
碰撞器组件为物理碰撞定义对象的形状。一个不可见的碰撞器,不需要与物体的网格完全相同的形状,事实上,粗略的近似往往在游戏中更有效和难以区分。
最简单的(处理器最不密集的)碰撞器是所谓的基本碰撞器类型。在3D中,这些是盒子碰撞器,球体碰撞器和胶囊碰撞器。在2D中,你可以使用Box Collider 2D和Circle Collider 2D。可以将任意数量的这些元素添加到单个对象中以创建复合碰撞器。
通过仔细地定位和调整大小,复合碰撞器通常可以很好地近似对象的形状,同时保持较低的处理器开销。在子对象上增加额外的碰撞器可以获得更大的灵活性(例如,盒子可以相对于父对象的本地轴进行旋转)。当创建像这样的复合碰撞器时,应该只有一个Rigidbody组件,放在层次结构中的根对象上。
注意,原始对撞机将不会正常工作与剪切变换——这意味着如果你使用一个旋转和水谷层次结构中的非均匀尺度,这样产生的形状将不再匹配原始形状,原始对撞机将无法正确地表示它。
碰撞器可以被添加到没有刚体组件的对象上,以创建地板、墙壁和场景的其他静止元素。这些被称为静态碰撞器。通常,您不应该通过改变转换位置来重新定位静态碰撞器,因为这将严重影响物理引擎的性能。具有刚体的对象上的碰撞器称为动态碰撞器。静态碰撞器可以与动态碰撞器相互作用,但由于它们没有刚体,它们不会在碰撞时移动。
当对撞机相互作用时,它们的表面需要模拟它们所代表的材料的特性。例如,一层冰会很滑,而一个橡皮球会有很大的摩擦力,很有弹性。虽然对撞机的形状在碰撞过程中没有变形,但它们的摩擦和弹跳可以用物理材料来配置。获得正确的参数可能需要一些尝试和错误,但冰材料,例如将有零(或非常低)摩擦和橡胶材料具有高摩擦和近乎完美的弹性。
脚本系统可以检测冲突何时发生,并使用OnCollisionEnter函数启动操作。但是,您也可以使用物理引擎简单地检测一个碰撞器何时进入另一个碰撞器的空间而不产生碰撞。一个被配置为触发器的碰撞器(使用Is触发器属性)并不像一个实体对象那样运行,它只允许其他碰撞器通过。当碰撞器进入其空间时,触发器将在触发器对象的脚本上调用OnTriggerEnter函数。
当发生碰撞时,物理引擎会调用与所涉及的对象相关联的任何脚本上的特定名称的函数。您可以在这些函数中放置任何代码来响应冲突事件。例如,当汽车撞上障碍物时,您可能会播放碰撞声效果。
在检测到碰撞的第一个物理更新时,将调用OnCollisionEnter函数。在维护联系人的更新期间,将调用OnCollisionStay,最后,OnCollisionExit表明联系人已被破坏。触发器碰撞器调用类似的OnTriggerEnter、OnTriggerStay和OnTriggerExit函数。注意,对于2D物理,在名称后面附加了2D的等价函数,例如OnCollisionEnter2D。
对于正常的、非触发碰撞,还有一个额外的细节,即至少有一个涉及的物体必须有一个非运动学刚体(即,是运动学必须关闭)。如果两个对象都是运动学刚体,那么OnCollisionEnter等将不会被调用。对于触发器碰撞,这个限制并不适用,因此运动学刚体和非运动学刚体在进入触发器碰撞器时都会触发对OnTriggerEnter的调用。
当两个对象发生碰撞时,可以根据碰撞对象刚体的配置发生许多不同的脚本事件。下面的图表给出了根据附加到对象的组件调用哪些事件函数的详细信息。一些组合只会导致两个对象中的一个受到碰撞的影响,但一般的规则是物理不会应用于没有附加刚体组件的对象。