今天又改了改还是不行,碰撞体检测,我的BOX明明在前面,但就是检测不到,或者一会检测到后面的,一会又能检测到前面的。
而在最右边角落里的还有个别挤在一起的,咋点都点不到。直接穿透了。
有的箱子点侧面或角角才能检测到,有的点上面就行,完全不准啊。。。怎么办。
上代码看看
//以下代码在鼠标的点击事件里的
const ray: geometry.Ray = new geometry.Ray();
let _location = event ? event.getLocation() : touch.getLocation();
if (_location.x == this._sx && _location.y == this._sy)
this._cameraCom?.screenPointToRay(_location.x, _location.y, ray);
if (PhysicsSystem.instance.raycast(ray)) {
const r = PhysicsSystem.instance.raycastResults;
for (let index = 0; index < r.length; index++) {
const element = r[index];
if (element) {
let boxcom = element.collider.node.getComponent(“Box”);
if (boxcom) {
console.log(“找到一个BOX”)
return;
}
}
}
}
//尝试了一个大佬的方法管用,直接用FOR循环检测一点都不准。以下是更好的方法,目前测试没问题,就是用find来寻找
const boxcollider = PhysicsSystem.instance.raycastResults.find(
(v) => { return v.collider.node.getComponent(“Box”) }
);
3.2.0 使用这个射线碰撞还是蛮精准的,可能要多检查一下代码里面有没有什么问题了,这一段没看出来问题。
谢谢,看起来没有问题,但确实有问题。我用的是3.3.2。不过我找到了另一个大佬写的正在测试,好像比这个方法准。我先测试一下。
我测试另一个方法可行,点的比较准,目前没发现穿透现象。
我知道你的问题了,不要用raycastResults 用raycastClosest
啊?能贴个代码不,我看看你这个咋用的。
if (PhysicsSystem.instance.raycastClosest(_ray)) {
const r = PhysicsSystem.instance.raycastClosestResult;
return r;
} else {
return null;
}
这个只会返回第一个碰撞的碰撞体,这样就不会出现你不想要的穿透
谢谢兄弟,不过我试了一下,在3.3.2中不行,但是用raycast(ray)可以,可能是改了又。
COCOS更新迭代太快了,每一版都在变的命令有点大。这有点可怕。
这个是3.3的文档,你使用这个raycastclosest要注意的就是空气墙之类的碰撞体不要挡住你的触摸
空气·~~其实我发现它是穿透到了BOX的后面,直接点中了地,而不是前面有阻挡。我怀疑是不是在FOR里循环,查找时由于其它原因比如检测慢还是什么的所以不准。但是用上面的FIND来查找就很准了。
就是它不只是会点中侧面的物体,还会点中后面的物体,也会点中前面的物体,其实都没有阻挡到这个BOX,所以只能说是莫名其妙了吧。但是FIND就很准,一样是查找,咱也说不清为啥。
这样说不清的,如果可以发个demo上来让引擎组康康
恩,谢谢,现在解决了。再测试看看吧。
代码就是那一段,其它的就是加个BOX组件和碰撞组件,别的也没有啥,这个不需要发DEMO吧。
发demo主要是如果你用错了大家能看出来,而且能上手调整
我这也没办法发了。每次发DEMO都要剔除很多东西,不然不能用。又不能全部发出来,毕竟还有一些代码虽然不高级,但不能随便上传懂我的意思不。不过就这一个功能,就只上面一段代码,别的也没有地方冲突,如果有问题就是FOR里使用的问题了。 
我说下我的流程吧。
新建了预制体
boxnode->boxNode->boxfbx
在boxnode上添加了碰撞体和BOX脚本
然后克隆了N个,再用上面的FOR循环检测出的问题。
但是换了FIND后没问题了。
没必要纠结了,只要现在没问题了就OK哈,再出问题就再找方法吧。
