cocos creator 3.x 2d物理碰撞检测(不使用物理刚体)
前言
我含着热泪而来,因为获取不到2d物体的碰撞检测弄了半天。之前一直学2.x,后面学了3.x版本,发现对于新手来说,蛮多需要去适应的,最主要的是引擎一直在更新,然后在网上为数不多的教程又更新很慢,而且大部分教程都是老接口,试了好多接口都不行。
官方2d物理检测文档:点击这里
在文档中只有脚本代码
步骤1:修改为‘内置2D物理系统’,不然无法进行碰撞检测
官方解析: Cocos Creator 支持内置的轻量 Builtin 物理系统和强大的 Box2D 物理系统。Builtin 物理系统只提供了碰撞检测的功能,对于物理计算较为简单的情况,我们推荐使用 Builtin 物理模块,这样可以避免加载庞大的 Box2D 物理模块并构建物理世界的运行时开销。而 Box2D 物理模块提供了更完善的交互接口和刚体、关节等已经预设好的组件。
你可以根据需要来选择适合自己的物理模块,通过编辑器主菜单中的 项目 -> 项目设置 -> 功能裁剪 切换物理模块的使用。
步骤2:创建两个单色节点,并且添加cc.BoxCollider2D (2d的物体用的都是2D的组件 )
步骤3:添加两个分组,并且勾选碰撞矩阵
步骤4:设置bule节点为bule分组,yellow为yellow分组
步骤5:创建一个phycisc.ts脚本,挂载在blue节点上,并且让两个节点挨在一起
import { _decorator, Component, Node, Collider, EPhysics2DDrawFlags, RigidBody, Constraint, PhysicsSystem2D, BoxCollider, director, Contact2DType, Collider2D, IPhysics2DContact, BoxCollider2D, PolygonCollider2D } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('phycisc')
export class phycisc extends Component {
onLoad() {
//绘制物理信息
PhysicsSystem2D.instance.enable = true;
PhysicsSystem2D.instance.debugDrawFlags = EPhysics2DDrawFlags.Aabb |
EPhysics2DDrawFlags.Pair |
EPhysics2DDrawFlags.CenterOfMass |
EPhysics2DDrawFlags.Joint |
EPhysics2DDrawFlags.Shape;
// 注册单个碰撞体的回调函数
let collider = this.node.getComponent(Collider2D);
if (collider) {
collider.on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this);
collider.on(Contact2DType.END_CONTACT, this.onEndContact, this);
collider.on(Contact2DType.PRE_SOLVE, this.onPreSolve, this);
collider.on(Contact2DType.POST_SOLVE, this.onPostSolve, this);
}
}
onBeginContact(selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null) {
// 只在两个碰撞体开始接触时被调用一次
console.log('onBeginContact', otherCollider);
}
onEndContact(selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null) {
// 只在两个碰撞体结束接触时被调用一次
console.log('onEndContact');
}
onPreSolve(selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null) {
// 每次将要处理碰撞体接触逻辑时被调用
console.log('onPreSolve');
}
onPostSolve(selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null) {
// 每次处理完碰撞体接触逻辑时被调用
console.log('onPostSolve');
}
}