# 碰撞体 Collider
碰撞体组件用来描述一个物体在物理世界中的形状。
碰撞体组件可以和刚体配合使用,来描述这个刚体的形状。
也可以单独使用,这时候视为碰撞体附着在一个完全静止的刚体上。
# 不同的碰撞体类型
- 基础碰撞体
- 长方体碰撞体
- 球体碰撞体
- 胶囊体碰撞体 - 由圆柱体加上两端的球体组成
- 三维网格碰撞体 - 可以手动指定三维网格模型
# 重要属性和事件
属性名 | 描述 |
---|---|
isTrigger | 是否为Trigger。*详见Trigger。 |
material | 物理材质。 |
事件名 | 事件对象 |
---|---|
onCollisionEnter | Collision |
onCollisionStay | Collision |
onCollisionExit | Collision |
onTriggerEnter | TriggerCollision |
onTriggerStay | TriggerCollision |
onTriggerExit | TriggerCollision |
添加物理事件有两种方式:
- (推荐)脚本中使用
collider.onCollisionEnter
从碰撞体上取到事件的Delegate
,然后可以用以下方法来添加事件回调:collider.onCollisionEnter.add(collision => { // handle collision });
- 在用户脚本里,直接实现
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事件。