cocos creator 有碰撞函数吗?求各位大佬指教

之前学的是unity,里面有自带的碰撞函数,cocos好像是要先注册碰撞事件,然后回调碰撞函数,比如回调函数onBeginContact(selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null){ } ,可是函数是自己写的,运行后cocos怎么知道是selfCollider还是otherCollider?

  • Creator 版本:3.8.1
1赞

打开文档,搜索碰撞

你好,我想知道的是,回调函数是自己写的,自己写的函数形参,系统怎么识别哪个是selfcollider哪个otherCollider,谢谢

诶嘿嘿我就是不看文档 :stuck_out_tongue_closed_eyes:

我觉得不管是从零还是从其他引擎转过来 看视频学习比较靠谱 毕竟能看到运行效果 自己敲总会有坑

你代码写在组件里,组件挂在节点上,挂的节点就是self,跟self碰撞的就是other,理解了么

我分得清self和other,我不理解的是,碰撞函数得自己手写,包括参数都是自己手写的,打字的话,编译器不会有提示的,那既然是自己写的 ,cocos怎么区分other和self?谢谢你的回复

看视频我没耐心,有些视频太长了,哈哈

@ccclass(‘TestContactCallBack’)
export class TestContactCallBack 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');
}

}

你好,这是官方文档里的,我不理解的是,碰撞函数得自己手写,包括参数都是自己手写的,打字的话,编译器不会有提示的,那既然是自己写的 ,cocos怎么区分other和self?谢谢

你这话问的好奇怪,什么cocos怎么区分?假设两个物体AB发生碰撞,A自身的组件中,A是self,B就是other,对于B挂的组件来说,与之相反,仅此而已,有何难理解的,碰撞回调组件(或者监听)本身无任何意义,触发碰撞的还是物体本身。

1赞

image

额,意思是第一个参数是self,第二个参数是other,你想知道的是不是这个啊。cocos确实不分你写的名字是啥,但名字也是一种注释啊,意思是cocos把slef的碰撞体放第一个参数里,other的碰撞体放进第二个参数里罢了

对,差不多就是这个意思,我想知道的是碰撞回调函数是自己写的,与函数的参数名无关,那为什么第一个参数cocos就识别是self呢?

我觉着吧,回调的形参和引擎抛事件实参是对应的,抛事件的第一个参数就是self,第二个就是other;不管你回调函数写成啥样接收的第一个参数都是self;这是代码逻辑,不是引擎识别的

不是识别,是cocos自己把slef碰撞体放在第一个,也不是识别,类似于a被b扇了一巴掌,你现在问我cocos是怎么知道a被扇了一巴掌。那就是它观察到了a被扇了一巴掌,然后把a放在第一个,b放在第二个,告诉你a被扇了,b是扇人的那个

回调函数又不用你主动调。。参数也不用你传 不用的话你不写也没事 就是个形式而已

判断碰撞速度,速度大的一方是主动碰撞。如果速度相同,则判断碰撞角度
let selfSpeed = selfBall.getLinearSpeed();

        let otherSpeed = otherBall.getLinearSpeed();

        // 如果速度相同,进一步判断碰撞点和速度向量

        if (selfSpeed === otherSpeed) {

            let selfVelocity = selfBall.getLinearVelocity();

            let otherVelocity = otherBall.getLinearVelocity();

            let contactPoint = selfBall.node.worldPosition;

            let selfToContact = contactPoint.clone().subtract(selfBall.node.worldPosition);

            let otherToContact = contactPoint.clone().subtract(otherBall.node.worldPosition);

            let selfAngle = Vec3.angle(selfToContact, selfVelocity.toVec3())

            let otherAngle = Vec3.angle(otherToContact, otherVelocity.toVec3());

            // 角度较小的一方为主动碰撞

            return Math.abs(selfAngle) < Math.abs(otherAngle);

        }

        // 速度较大的一方为主动碰撞

        return selfSpeed > otherSpeed;