引入物理引擎的最大好处是使得场景中的物体拥有了物理响应。碰撞器(Collider)在引擎中是一种组件,目前有两种,在使用前,我们需要先了解下这两种碰撞器:
为一个物体添加物理组件之前,首先需要考虑的是,碰撞器是静态的还是动态的,然后添加对应的碰撞器组件,静态碰撞器 StaticCollider 或者 DynamicCollider
之后我们需要为碰撞器组件添加 ColliderShape,事实上,每一种 Collider
都是 ColliderShape 的集合,即每一种 Collider
都可以通过组合 ColliderShape 设置复合的碰撞器外形。
目前支持了四种 ColliderShape
,但不同的后端物理包支持程度不同,具体如下:
名称 | 解释 | 支持的后端物理包 |
---|---|---|
BoxColliderShape | 盒形碰撞外形 | physics-lite, physics-physx |
SphereColliderShape | 球形碰撞外形 | physics-lite, physics-physx |
PlaneColliderShape | 无界平面碰撞外形 | physics-physx |
CapsuleColliderShape | 胶囊碰撞外形 | physics-physx |
引擎支持复合的碰撞器外形,也就是说,碰撞器本身可以由 BoxColliderShape
,SphereColliderShape
,CapsuleColliderShape
复合而成。
这里特别强调的是 Collider
与 ColliderShape
的位置关系。每一个 Collider
的姿态和其挂载的 Entity
是一致的,每一帧两者都会进行同步。而 ColliderShape
上则可以通过 position
属性设置 相对于 Entity
的偏移。
在加入碰撞器组件后,不会默认添加碰撞器外形,因此需要点击 Add Item 进行添加,添加后会在视口中看到碰撞器的辅助渲染出现。
对于每一个碰撞器外形,都可以设计对应的一些大小属性。例如
无论哪个碰撞器外形,都可以设置 Local Position,即相对于 Entity 坐标的局部偏移
ColliderShape
上还有一个值得注意的属性 Trigger
,它可以将这个 ColliderShape
由 碰撞器模式
转为 触发器模式
。
触发器模式:物体不具备刚体外形,但发生接触时可以触发特定的脚本函数。 碰撞器模式:物理具有刚体外形,发生接触时不仅可以触发脚本函数,还可以根据物理规律改变原先的运动。
和静态碰撞器不同,动态碰撞器会受到物理规律的作用,因此有许多附加的物理属性进行设置
在修改这些参数后,视口不会发生变化,因为动态碰撞器默认会受到重力的作用,因此需要在预览模式
下才能进行观察。
// 添加静态碰撞器
const boxCollider = boxEntity.addComponent(StaticCollider);
// 添加动态碰撞器
const sphereCollider = sphereEntity.addComponent(DynamicCollider);
const boxCollider = boxEntity.getComponent(StaticCollider);
const physicsBox = new BoxColliderShape();
physicsBox.size = new Vector3(1, 1, 1);
boxCollider.addShape(physicsBox);
//设置 Trigger
physicsBox.isTrigger = true;
针对这两种类型,脚本中都提供了对应的函数
对于触发器模式,首先需要给场景中的 Entity
添加 Collider
;该当这些组件相互接触时,会自动触发脚本组件当中的三个函数:
可以通过 ColliderShape
上的 isTrigger
开启触发器模式,但需要特别强调的是,两个 StaticCollider 之间不会调用触发器事件,除非其中一个是 DynamicCollider
。
对于碰撞器模式,DynamicCollider
相互作用时会触发三个碰撞相关的脚本函数: