碰撞事件是物理系统的重要组成部分,允许脚本响应物体之间的物理交互。Galacean 物理系统提供了两种类型的事件:碰撞事件和触发器事件。
碰撞事件在两个处于碰撞器模式的碰撞器物理交互时触发。这些事件提供了关于碰撞的信息,如接触点、法线和涉及的另一个碰撞器。
触发器事件在碰撞器进入、停留或离开触发区域时触发。触发器是将 isTrigger
属性设置为 true 的碰撞形状。它们检测重叠而不引起物理反应。
碰撞器和触发器之间的详细事件触发关系如下图所示:
模式 | 描述 | 使用场景 |
---|---|---|
碰撞器模式 | 触发碰撞器事件,具有实际的物理碰撞效果 | 需要真实物理交互的物体 |
触发器模式 | 仅触发事件回调,不产生物理碰撞 | 检测区域、触发机关等 |
碰撞器模式和触发器模式是碰撞形状的属性,一个碰撞器可以包含多个碰撞形状,每个形状都可以独立设置是否为触发器。这意味着: 一个碰撞器可以同时具备两种模式,可以添加多个碰撞形状,有的设为碰撞器模式,有的设为触发器模式,这样可以同时实现物理碰撞和区域检测的功能
当两个碰撞器发生碰撞或触发器重叠时,会触发碰撞器所属实体上挂载的脚本中的回调函数。
事件名 | 触发时机 |
---|---|
onCollisionEnter | 开始碰撞时触发 |
onCollisionExit | 结束碰撞时触发 |
onCollisionStay | 碰撞持续时触发 |
事件名 | 触发时机 |
---|---|
onTriggerEnter | 进入触发器时触发 |
onTriggerExit | 离开触发器时触发 |
onTriggerStay | 在触发器内时持续触发 |
class EventHandler extends Script {
// 碰撞器事件
onCollisionEnter(other: Collider) {
console.log("碰撞开始,对象:", other.entity.name);
}
onCollisionStay(other: Collider) {
console.log("碰撞持续中,对象:", other.entity.name);
}
onCollisionExit(other: Collider) {
console.log("碰撞结束,对象:", other.entity.name);
}
// 触发器事件
onTriggerEnter(other: Collider) {
console.log("触发器开始,对象:", other.entity.name);
}
onTriggerStay(other: Collider) {
console.log("触发器持续中,对象:", other.entity.name);
}
onTriggerExit(other: Collider) {
console.log("触发器结束,对象:", other.entity.name);
}
}