【求助】prefab生成新的物体时,sensor碰撞不回调

  • Creator 版本:2.2.1 - rc

  • 目标平台: web

  • 重现方式:必现,请参考demo

小球自由下落

方块内含两个rigidbody和两个collider。(分别称为A、B)
A是B的父节点。
A的group与小球不交互(需动态控制)
B的group与小球可交互,是sensor

demo左边:用编辑器修改A的group
demo右边:动态生成小球和方块,并修改方块中A的group

结果:只有左边的B会发生sensor回调。

请问是bug还是什么其他原因造成的?

AoFeidemo.rar (799.5 KB)

  1. 为什么这两个方形障碍都要加 rigid body,这会产生不可预估的情况

  2. 这里 position 设置要在设置 parent 前

let block : cc.Node = cc.instantiate(this.BlockOrgin);
block.position = this.BlockPos.position;
block.setParent(cc.find("Canvas"));

感谢回复。

1、 两个方形障碍都添加rigidbody是参考了unity的思路。unity的碰撞回调是捆绑在rigidbody上的。
我只需要两个方形障碍分别有各自的碰撞回调。并且两个障碍能够处于不同的group,并能够动态转换group即可。

如果cocos的逻辑是不需要rigidbody来判断碰撞体的回调对象的话,删去这个子物体中的rigidbody也是可以的。
(实际尝试过collider本身就是依赖于rigidbody的,并不能删除。)

但这样又衍生出另外的问题,如果我希望几个碰撞体共享同一个碰撞回调函数,我应该怎样操作呢?还是说目前不可能做到?

简单形容一下需求,假设有三种物体,A、B、C,都以物理法则运动。根据游戏情况的改变,A、B、C之间是否会发生物理碰撞会动态改变(目前打算利用group)。但哪怕不发生碰撞,依然需要有穿过时的回调(目前打算利用ABC下面绑的同样大小的sensor)。又因为有可能A和B是穿过,A和C是碰撞,所以穿过和碰撞需要同时存在。需要两个回调。

要实现这样的效果。可以怎么做?

2、明白,马上修改试试看。
补充:已修改,但对于问题并无帮助。

  1. 我的意思是可以有多个,但是最好不要添加到父子结构里面

  2. 我这样改都有回调了啊

        let b : cc.Node = cc.instantiate(this.ballorigin);
        b.position = this.ballPos.position;
        b.group = "Rainbow";
        b.setParent(cc.find("Canvas"));
        b.getComponent(cc.PhysicsCollider).apply();

        let block : cc.Node = cc.instantiate(this.BlockOrgin);
        block.position = this.BlockPos.position;
        block.setParent(cc.find("Canvas"));

1、我的意思是可以有多个,但是最好不要添加到父子结构里面
→我明白你的意思了。
但是实际开发上,有些情况,不太可能做到避免父子结构中同时存在rigidbody。
例如我上面说的需求就是一个例子。

当然我可以用代码在update里面强行将两个rigidbody拉到一起。
但譬如类似FTG和ACT这类有复杂碰撞框的情况,需要开发者强行将原本就是父子关系的obj分开,又拉到一起是十分奇怪的。

2、好的,算是解决了,虽然不清楚这里面的逻辑是什么。
这算是一个bug吗?还是这里面有什么使用上要注意的地方?有相关的文档或者指引吗?

let block : cc.Node = cc.instantiate(this.BlockOrgin);
block.setParent(cc.find("Canvas"));
block.position = this.BlockPos.position;

rigid body 只会监听自身节点的 position changed 事件,这里你修改的是父节点 block 的 position, 子节点收不到消息,所以保留在原来的 (10000,10000) 位置了

原来如此…明白了…感谢回答(`・ω・´)ゞ
虽然作为用家觉得这种情况下,rigidbody是有必要跟着自己绑定的节点移动的。