# 碰撞体 Collider

碰撞体组件用来描述一个物体在物理世界中的形状。

碰撞体组件可以和刚体配合使用,来描述这个刚体的形状。
也可以单独使用,这时候视为碰撞体附着在一个完全静止的刚体上。

# 不同的碰撞体类型

  • 基础碰撞体
    • 长方体碰撞体
    • 球体碰撞体
    • 胶囊体碰撞体 - 由圆柱体加上两端的球体组成
  • 三维网格碰撞体 - 可以手动指定三维网格模型

# 重要属性和事件

属性名 描述
isTrigger 是否为Trigger。*详见Trigger
material 物理材质。

添加物理事件有两种方式:

  1. (推荐)脚本中使用collider.onCollisionEnter从碰撞体上取到事件的Delegate,然后可以用以下方法来添加事件回调:
    collider.onCollisionEnter.add(collision => {
        // handle collision
    });
    
  2. 在用户脚本里,直接实现onCollisionEnter函数,并把用户脚本挂载在碰撞体所在的节点上。
    export default class MyScript extends engine.Script {
        public onCollisionEnter(collision: engine.Collision) {
            // handle collision
        }
    }
    

*注意:如果你在碰撞回调里写了entity.destroy()这样的语句,有可能会导致崩溃,这时候请异步地销毁节点或组件:setTimeout(() => entity.destroy, 0)。该问题将于下个版本修复。

# Trigger

如果isTrigger属性为true,会标记该碰撞体为Trigger。

Trigger碰撞体不会在物理模拟阶段与其他碰撞体发生碰撞,不会因为碰撞而改变两者的运动状态,也不会生成onCollisionXX系列的事件。

物理模拟阶段,如果 Trigger 碰撞体与其他 Trigger 发生了相交,并不会生成onTriggerXX系列的事件。

# 使用多个碰撞体来模拟物体形状

有时候使用单个碰撞体无法满足需要,而三维网格碰撞体又太消耗性能,可以考虑在同一个物体上创建多个不同的碰撞体,来近似模拟形状。

# 物理材质

可以使用额外的物理材质资源来描述碰撞体表面的物理性质。

# ▌物理材质的属性

属性名 描述
bounciness 物体表面的弹性,0 <= bounciness <= 1。
dynamicFriction 物体表面的动摩擦系数,0 <= dynamicFriction <= 1。
staticFriction 物体表面的静摩擦系数,0 <= staticFriction <= 1。

# 不同类型碰撞体之间的关系

# ▌哪些碰撞体之间可以发生碰撞

静态碰撞体 刚体碰撞体 运动学刚体碰撞体
静态碰撞体 × ×
刚体碰撞体
运动学刚体碰撞体 × ×

# ▌哪些碰撞体之间可以触发 Trigger 事件

静态碰撞体 刚体碰撞体 运动学刚体碰撞体
静态碰撞体 ×
刚体碰撞体
运动学刚体碰撞体

*两个 Trigger 之间无法触发 onTriggerXXX 事件,需要一个Trigger+一个 NonTrigger 才能触发 onTriggerXXX 事件。