推荐一个支持定点数的物理引擎 Rapier,物理帧同步刚需

Demo 没写阿,之前做的是商业项目,碰撞分组官方文档说的比我更详细

那这麽我问一下,假设场景存有一堆静止球, a或b碰撞到球后 球与球之间会产生碰撞而运动。当a在高刷, 物理世界step执行了9次, b性能很差,所以物理世界执行了6次,在第7次发生碰撞, 服务器下发b第在7帧的操作, 这时a需不需要将物理世界回到第6次step然后加入b的操作来执行第7次step(先不管追帧),还是a只需按当前step次数(10)下加入b操作到物世界。 假a全程都静止不操作下。

物理的 step 和本地帧是同步的,你本地帧在 6,那么物理 step 也是执行了 6 次,而不是在 9 次,放在 update 里面是指 update 驱动本地帧,但是本地帧不会超过服务器帧,如果下一本地帧超过服务器帧会暂停

这不根我想表达的一様麻, 我一直在表达都是物理世界step不要跟着update一直跑(不做任何判断), 因为你要确保所有人同一个step下输入的参数都是一致的

我最开始就说过了,只是你一直没明白我说的"可以跳过"是什么意思而已

整个游戏的逻辑都是由物理引擎的step驱动的,脚本的update原则上只做渲染

如果没自己驱动物理引擎,物理引擎的 step 也是 cocos 引擎的 update 驱动的…不想说更多了,反正我已经验证了自己的逻辑

  1. 确认碰接mask是否正确, rapier的mask是要自己传入, 跟cc 那个设置没关系
  2. const events = RAPIER.EventQueue(true); 宣告后, 要在wrold.step(events)传入events, 物理引擎在会step执行完后把所有碰撞事件附值到events中
  3. [每次][每次][每次]在step执行完后再调用events.drainCollisionEvents

原来是么有设置接触事件
Collider.setActiveEvents(RAPIER.ActiveEvents.COLLISION_EVENTS); //设置接触事件

1赞

解决了吗后来,同遇到

http://jc-space.com/phy 这个案例在哪里下载?

this.schedule(xxx,0.01666667) 你客户端这么写肯定不同的设备运行速度不一样,要服务器驱动啊

这是我以前在rapier还没有官方控制器的时候自己写的控制器及demo示例,好几年了我都不知道源码放到哪去了,现在rapier已经有了官方的角色控制器了,直接用官方的就可以了。

1赞

这个Rapier是不能在原生ios中使用的是吗?我尝试在cocos creator 3.8.6引入这个rapier,PC和安卓原生都正常,但在原生ios会提示WebAssembly is not supported!然后就一种报错无法加载

老哥你这个用的是 锁帧吗。就是服务器下发再移动?

是的,所有操作都是上报服务器,然后广播给所有人

利用服务器下发才能确定所有设备的物理引擎步数一致

问一下 你用的是kcp吗 还是websocket?

websocket

Rapier封装完毕理游戏已上线
使用教程: 竞速类物理引擎帧同步实现方案 - Creator 3.x - Cocos中文社区