const{ccclass,property}=cc._decorator;
@ccclass
export default class Player extends cc.Component{
private _rigidBody:cc.RigidBody;
private _disabledColliders:cc.PhysicsCollider[]=[];
private onLoad():void{
this._rigidBody=this.node.getComponent(cc.RigidBody);
this._rigidBody.enabledContactListener=true;//激活接触侦听
}
private onPreSolve(contact:cc.PhysicsContact,selfCollider:cc.PhysicsCollider,otherCollider:cc.PhysicsCollider):void{
let index=this._disabledColliders.indexOf(otherCollider);
if(index>-1){
//此碰撞器已经被忽略碰撞,则直接忽略碰撞
contact.disabled=true;
}else{
let normal=contact.getWorldManifold().normal.mulSelf(-1);
if(normal.y<-0.7){
//加入_disabledColliders列表
this._disabledColliders.push(otherCollider);
contact.disabled=true;
}
}
}
private onEndContact(contact:cc.PhysicsContact,selfCollider:cc.PhysicsCollider,otherCollider:cc.PhysicsCollider):void{
//接触结束,从_disabledColliders列表中移出
let index=this._disabledColliders.indexOf(otherCollider);
if(index>-1)this._disabledColliders.splice(index,1);
}
}
碰撞回调顺序:
...
Step
Step
BeginContact
PreSolve
PostSolve
Step
PreSolve
PostSolve
Step
PreSolve
PostSolve
Step
EndContact
Step
Step
...