creator3.x遇到一个隐藏的严重bug,通过代码修改物理碰撞层无效

使用版本creator3.32
步骤

  1. 在项目设置面板里的物理层添加一个碰撞层player,因为默认default层值是1,所以player层的值是2,设置碰撞组,player层和default层不碰撞,player层和player层能碰撞。

  2. 创建一个场景,场景立加入两个物体A,B,并添加上BoxCollider和Rigidbody组件。BoxCollider都勾选isTrigger。A的 Rigidbody的group 设置为default , B的 Rigidbody的group 设置为player。因为碰撞组设置了player 和 default层不会发生碰撞,所以默认A,B是不发生碰撞的。

  3. 创建一个脚本,在onLoad函数立设置A的碰撞层的值 A.getComponent(BoxCollider).setGroup(2);也就是改把A的碰撞层从default 改成 player,这样A和B都是player层了,理论上是可以碰撞的。

  4. 给物体A的BoxCollider添加触发器事件监听 onTriggerEnter。

  5. 结果虽然A和B都是同一个碰撞层player,但是无论怎么接触都无法触发onTriggerEnter事件。

6.如果在A的属性面板的Rigidbody的group的层默认设置为player 就可以触发onTriggerEnter事件了。

最后总结出通过代码修改Collider的group是无效的。

@panda 希望下个版本你们能修改这个bug,最近做项目,场景物体资源数量比较多,想在代码里动态批量修改物体的碰撞器的碰撞组,结果监听触发器事件监听不到。但是在旧版的Creator3D 2.1是没问题.

感谢反馈,我们确认一下

主要是监听触发器事件onTriggerEnter监听不到,动态修改物体物理碰撞层完全不生效。只能在属性面板里初始化好,但是这样就必须每个物体都要加RigidBody组件才能配置。还有初始化好碰撞层了之后,就再也无法在代码里动态修改了。
旧版的Creator3D 是没有这种问题的,你可以用旧版的和现在的对比一下

是不是只调用了 setGroup 没有调用 setMask?
简单测试可以动态修改;
测试demo:
NewProject_19.zip (10.3 KB)

按你的方法测了,确实只设置setGroup不设置setMask是没用的。

搞了半天才搞懂setMask是什么意思,就是用于设置当前物体的group和其它碰撞组的碰撞关系。

但是有点疑惑,既然已经在项目设置面板已经设置了物理层的碰撞组的碰撞关系,为什么动态设置物体的group时,还要用setMask跟进设置面板的碰撞组关系再设置一次,这不是多次一举吗。

比如
现在在物理设置面板设置了物理层 2 分别和 3,4,5层有碰撞。
所以我动态修改对象碰撞层为2时,同时要设置掩码为3,4,5层,否则碰撞不生效。
obj.getComponent(BoxCollider).setGroup(1 << 2);
obj.getComponent(BoxCollider).setMask(1 << 3 | 1 << 4 | 1 << 5);

这是不断做重复工作啊,一旦把物理设置面板里的碰撞组修改了,代码也要跟着修改setMask。还有如果物理层很多,碰撞关系很复杂,自己再用setMask跟着设置面板改一遍,那工作量不是一般大。

为什么要做开发者做这种重复造轮子的工作呢。如果只看官方文档开发者根本就不知道使用setGroup的同时必须要执行setMask才生效,这个原因只有你们引擎开发者才知道。估计后面的游戏开发者都会遇到这种疑似bug的问题,心情不好的果断放弃这个引擎。

记得早期 的creator3d 1.0 至 creator3d 2.1 版本都是setGroup就能完成修改碰撞层的,我的项目就是从creator3d 2.1 升级到 creator3.32 出现这个动态设置物理碰撞层无效的问题。

@EndEvil

1赞

23年都没解决这个问题

1赞

25年啦,还没解决

动态设置物理层和掩码是可以做到的,2d有2d的做法,3d有3d的做法。没效果说明你方法不对

而且随着项目变大,物理场景变的更多更杂,是有概率超过引擎默认32位物理限制的。建议代码在不同的场景去维护当前使用的掩码和对应的分组。