Creator3.0的2d物理引擎没法玩啊,简单一行代码就报异常


简单执行上面截图里的代码
PhysicsSystem2D.instance.raycast(new Vec2(0,0),new Vec2(0,100));
必定报下面截图异常,并且搞不懂异常错误代表什么

难道我用错了?引擎组大佬能不能给个解释,如果是引擎bug我就暂时停止使用2d物理了

1赞

你试下这个测试例?

https://github.com/cocos-creator/physics-samples/blob/v3.0/2d/box2d/assets/cases/demo/raycast.ts

现在 3.0 场景里需要有物理碰撞体,比如 cc.BoxCollider2D 组件的节点,这样才能使用射线


我这样摆放组件了,执行 PhysicsSystem2D.instance.raycast(new Vec2(0,0),new Vec2(0,100)); 还是报异常,真没辙了。

别人unity做个2d物理射线不过是简单的一行代码
Physics2D.Raycast(origin, direction); 没有那么多限制啊,方便用户使用的引擎才是好的引擎。但是目前按你们说的根据限制去解决还是没用,一运行就报错,解决不了问题。

我这边的组件有这些

用这个例子也是一样报异常

RaycastDemo.zip (1.2 MB) 给我的例子你运行看看吧,看我缺什么

缺少 cc.RigidBody2D 组件

我自己测试也找到原因了,原来是场景里必须存在一个RigidBody2D和一个Collider2D。而且这两个物体必须挂在同一个脚本下,分别挂在不同的物体也不行,只要场景存在一个这样的节点就不会报错。执行物理射线检测的脚本可以不用挂在同一个脚本下。

说实话你们这样的设计太不科学了,99%的开发者第一次使用射线都会遇到坑,而且不知什么原因。场景不存在Collider2D就当射线碰撞不到任何东西嘛,返回空就好了,为什么要报一个物理异常,射线不该依赖于Collider2D的存在而存在。而且检测射线碰撞应该只有Collider2D就够了,很多静态物体不需要刚体组件。目前就为了个射线检测,所有2d碰撞器都要加个刚体组件,这太烦人了。你们真的可以参考unity的射线怎么写的 Physics2D.Raycast,要检测的碰撞器也不需要刚体存在。

1赞

微信图片_20201208142222

截图里的这两个步骤可以让游戏马上挂掉,你们这种射线要依赖于2d刚体和2d碰撞器存在的设计,是个大坑。如果一个射击游戏把场景里的所有2d刚体和碰撞器清理完了,还在发射物理射线,游戏必定报异常挂掉。

希望引擎方能重视这个问题吧

3赞

问一下,没报错后,射线检测返回值[],没有检测到相交点,这是怎么回事?

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))
1赞

你得先知道原理才能明白为什么,
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会卡住,完全不知道为啥,你们有遇到这个问题吗?

1赞

2年了还是这样,就算不更新物理引擎至少在文档里提一句吧……