看心情我后面会出一个基于MK框架帧同步 demo,至于帧管理器的逻辑的代码其他人可以在我的 MKFramework 仓库的 1.0.9 preview 分支 tool_frame_manage.ts 查看(已上商业项目)
我一直在表达的是物理引擎的repier.step()不会放在脚本的update里去运行, 为的就是避免像2.X那种脚本update的次数会跟着刷屏率,导致物理引擎执行step的次数不同(指直接update执行step, 不做任何调控),在我的角度component脚本的update 不等于本地逻辑帧, 因为我将component脚本的update理解为渲染帧, 即我想表达物理世界step不应该跟渲染帧
实际上我就是这样做的(cc.director.getScheduler().scheduleUpdate),而且无论两边的设备 update 速率差异多大都同步,我只能说没同步就是帧逻辑不对,我上面说了很多你还没明白那只有看 Demo 才能懂
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 驱动的…不想说更多了,反正我已经验证了自己的逻辑
- 确认碰接mask是否正确, rapier的mask是要自己传入, 跟cc 那个设置没关系
- const events = RAPIER.EventQueue(true); 宣告后, 要在wrold.step(events)传入events, 物理引擎在会step执行完后把所有碰撞事件附值到events中
- [每次][每次][每次]在step执行完后再调用events.drainCollisionEvents
原来是么有设置接触事件
Collider.setActiveEvents(RAPIER.ActiveEvents.COLLISION_EVENTS); //设置接触事件
解决了吗后来,同遇到
this.schedule(xxx,0.01666667) 你客户端这么写肯定不同的设备运行速度不一样,要服务器驱动啊
这是我以前在rapier还没有官方控制器的时候自己写的控制器及demo示例,好几年了我都不知道源码放到哪去了,现在rapier已经有了官方的角色控制器了,直接用官方的就可以了。
这个Rapier是不能在原生ios中使用的是吗?我尝试在cocos creator 3.8.6引入这个rapier,PC和安卓原生都正常,但在原生ios会提示WebAssembly is not supported!然后就一种报错无法加载
老哥你这个用的是 锁帧吗。就是服务器下发再移动?
是的,所有操作都是上报服务器,然后广播给所有人
利用服务器下发才能确定所有设备的物理引擎步数一致