现在在用creator3d 和 creator3.0做项目,做项目中自然少不了使用3d物理引擎,但是在使用这两个版本的引擎过程中,遇到了很多引擎设定上难以吐槽的坎。
首先就是碰撞图层分组的问题,场景里有上百个各种类型的碰撞体,如地面,石头,建筑,角色,飞行道具等。很少有游戏不做分组,让这么多物体随便互相碰撞,所以设置碰撞分组是很有必要。
初次时用这两个引擎,我还以为碰撞分组就是按节点上的layer属性做区分的,后面经过多次试验发行,居然是由另外一个物理碰撞组设置,也就是说存在两种图层组,一种是用于渲染的,也就是节点上的layer属性,一种是碰撞用的,也就是刚体上的group属性。
如下图:
我是从unity到creator2.0用过来的,unity是只有layer这个东西,渲染和物理都是基于这个做处理,creator2.0也一样,渲染和物理共用节点的group属性,现在3d和3.0把渲染和物理的层分开管理了,虽然灵活,但是也加大了使用的复杂度。unity和creator2.0渲染和物理都共用一个层概念,也能做出各种大作,为什么到3d和3.0要分开呢,合在一起方便用户不是更好码。
即使按现在的图层和碰撞组的概念做开发,还是被现在的设定搞哭。看下面截图:
截图里的图文解释很清楚了,用刚体决定碰撞分组设定很不好,这样就导致其它一切静态物体要做碰撞分组全都要加刚体,碰撞器就无法独立存在了,必须和刚体捆绑在一起使用。最好把刚体的group属性提出到碰撞组件或者节点管理,用户一看就清楚是什么功能了,或者和layer图层合并,layer等于碰撞分组,untity和creator2.0就是这么玩的。
最后提一个3d射线无法根据图层过滤碰撞体检测射线碰撞的bug。3d和3.0两个版本都有这个问题。
我做的案例是,场景有一个地面和其它物体,地面分配图层layer为Floor,碰撞组为Floor_Hit。其它物体的图层layer为SceneObject,碰撞组为SceneObject_Hit。现在要通过鼠标检测点击到地面哪个地方,不能被其它物体阻挡射线,所以射线只检测Floor层。但是物理射线的图层过滤算法无效。
PhysicsSystem.instance.raycastClosest(ray,mask);
目前还没搞清楚射线方法的第二个参数掩码代表什么,官方文档也没解释,我自己估计不是节点的layer图层,就是刚体的group碰撞组,所以这两个情况都测试,结果什么效果都没有,检测不到射线碰撞地面。
以下是截图
测试项目
TestRaycast.zip (1.1 MB)
自己测试过很多次,可以猜到,发射射线函数的第二个参数掩码应该是和刚体的碰撞分组group属性有关的。不填第二个参数mask的时候,地面的group设置为DEFAULT可以检测到碰撞,设置为自己定义的碰撞组Floor_Hit时,mask不填或者无论怎么填都不行,这也是个很重大的bug。还有如果官方设定射线分组检测碰撞是根据刚体的group属性判断的话,那么所有静态物体都要加刚体,包括:地面,空气,宇宙。毕竟实际开发中使用射线时,80%的情况都会用到射线分组检测碰撞。
最后衷心希望引擎官方能重视这个节点图层和刚体碰撞组的设定体验很差的问题吧





就是这个,ray在default层,你不打开和其它层检测当然检测不到了