在2d中开启碰撞需要在项目设置–功能裁剪–2D物理系统【选择 基于Box2D的2D物理系统】
如果想要两个物体碰撞,则需要添加刚体和碰撞【!!重点】
设置刚体类型 可以设为四种,
Static 静态刚体,零质量,零速度,即不会受到重力或速度影响,但是可以设置他的位置来进行移动。该类型通常用于制作场景
Dynamic 动态刚体,有质量,可以设置速度,会受到重力影响。
Kinematic 运动刚体,零质量,可以设置速度,不会受到重力的影响,但是可以设置速度来进行移动
Animated 动画刚体,在上面已经提到过,从 Kinematic 衍生的类型,主要用于刚体与动画编辑结合使用
在设置碰撞体的时候可以选择Editing编辑碰撞体
Regenerate Points输入的值越小,点越密集
监听碰撞代码如下
import {
_decorator,
Component,
Node,
RigidBody2D,
Collider2D,
Contact2DType,
PhysicsSystem2D,
IPhysics2DContact,
tween,
Vec3,
} from "cc";
const { ccclass, property } = _decorator;
@ccclass("rigidbodys")
export class rigidbodys extends Component {
start() {
// 注册单个碰撞体的回调函数
let collider = this.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);
}
// 注册全局碰撞回调函数
if (PhysicsSystem2D.instance) {
PhysicsSystem2D.instance.on(
Contact2DType.BEGIN_CONTACT,
this.onBeginContact,
this
);
PhysicsSystem2D.instance.on(
Contact2DType.END_CONTACT,
this.onEndContact,
this
);
PhysicsSystem2D.instance.on(
Contact2DType.PRE_SOLVE,
this.onPreSolve,
this
);
PhysicsSystem2D.instance.on(
Contact2DType.POST_SOLVE,
this.onPostSolve,
this
);
}
}
onBeginContact(
selfCollider: Collider2D,
otherCollider: Collider2D,
contact: IPhysics2DContact | null
) {
// 只在两个碰撞体开始接触时被调用一次
console.log("onBeginContact");
}
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");
}
}