简单执行上面截图里的代码
PhysicsSystem2D.instance.raycast(new Vec2(0,0),new Vec2(0,100));
必定报下面截图异常,并且搞不懂异常错误代表什么
难道我用错了?引擎组大佬能不能给个解释,如果是引擎bug我就暂时停止使用2d物理了
难道我用错了?引擎组大佬能不能给个解释,如果是引擎bug我就暂时停止使用2d物理了
你试下这个测试例?
https://github.com/cocos-creator/physics-samples/blob/v3.0/2d/box2d/assets/cases/demo/raycast.ts
现在 3.0 场景里需要有物理碰撞体,比如 cc.BoxCollider2D 组件的节点,这样才能使用射线
别人unity做个2d物理射线不过是简单的一行代码
Physics2D.Raycast(origin, direction); 没有那么多限制啊,方便用户使用的引擎才是好的引擎。但是目前按你们说的根据限制去解决还是没用,一运行就报错,解决不了问题。
用这个例子也是一样报异常
我自己测试也找到原因了,原来是场景里必须存在一个RigidBody2D和一个Collider2D。而且这两个物体必须挂在同一个脚本下,分别挂在不同的物体也不行,只要场景存在一个这样的节点就不会报错。执行物理射线检测的脚本可以不用挂在同一个脚本下。
说实话你们这样的设计太不科学了,99%的开发者第一次使用射线都会遇到坑,而且不知什么原因。场景不存在Collider2D就当射线碰撞不到任何东西嘛,返回空就好了,为什么要报一个物理异常,射线不该依赖于Collider2D的存在而存在。而且检测射线碰撞应该只有Collider2D就够了,很多静态物体不需要刚体组件。目前就为了个射线检测,所有2d碰撞器都要加个刚体组件,这太烦人了。你们真的可以参考unity的射线怎么写的 Physics2D.Raycast,要检测的碰撞器也不需要刚体存在。
截图里的这两个步骤可以让游戏马上挂掉,你们这种射线要依赖于2d刚体和2d碰撞器存在的设计,是个大坑。如果一个射击游戏把场景里的所有2d刚体和碰撞器清理完了,还在发射物理射线,游戏必定报异常挂掉。
希望引擎方能重视这个问题吧
问一下,没报错后,射线检测返回值[],没有检测到相交点,这是怎么回事?
3.x ? 慎重,居然存在这种设计,确实有点亮瞎我的狗眼,
const results = PhysicsSystem2D.instance.raycast(
new Vec2(0, 0),
new Vec2(0, -1),
ERaycast2DType.Closest,
);
console.log(results);
for (let i = 0; i < results.length; i += 1) {
const result = results[i];
const collider = result.collider;
const point = result.point;
const normal = result.normal;
const fraction = result.fraction;
}
我也遇到一樣的問題… 返回 [] …
我解了,要把座標變成世界座標(World Coordinate)
const uit = this.getComponent(UITransform);
uit.convertToWorldSpaceAR(new Vec3(x, y))
你得先知道原理才能明白为什么,
cc的内置2d物理引擎有两个,一个builtin的简单引擎,一个是box2d
cc的的物理抽象层有将collider和刚体分开,builtin的简单版引擎也是这样实现的。但是box2d,rigidbody2d对应就是box2d的b2body,collider是对应的box2d的fixture,box2d的实现本来就是fixture必须附加于b2body,所以就必须,只能这样。无解。
这是box2d的缺陷不是cc的,个人建议官方把这个写进官方文档里。
个人在使用rapier引擎,如果后面有空我可能会将它集成到cc,box2d实在是太老了,而且除了射线,也没有其它的世界查询,功能实在太单一。
。。。为什么没有正确答案你也能被亮瞎?
我用过3.5的2d射线,不会报错
请问rapier怎么集成呢?web都调通了,在安卓真机上WebAssembly.instantiate会卡住,完全不知道为啥,你们有遇到这个问题吗?
2年了还是这样,就算不更新物理引擎至少在文档里提一句吧……