Skip to content

玩家的动作状态是怎么同步的?

ilvxna edited this page Aug 7, 2018 · 4 revisions

: 玩家跳跃“jump”是通过直接调用:

cellCall("jump", new object[]{});

但是玩家走动状态呢,没有找到有“walk”的cellCall呀? : 走是直接同步坐标的,

updatePlayerToServer

跳是逻辑层的模拟, 走是引擎层的同步行为。

: 下面代码是updatePlayerToServer的片段:

                        if(posHasChanged || dirHasChanged)
                        {
                                playerEntity._entityLastLocalPos = position;
                                playerEntity._entityLastLocalDir = direction;

                                Bundle bundle = Bundle.createObject();
                                bundle.newMessage(Message.messages["Baseapp_onUpdateDataFromClient"]);
                                bundle.writeFloat(position.x);
                                bundle.writeFloat(position.y);
                                bundle.writeFloat(position.z);
                                
                                double x = ((double)direction.x / 360 * (System.Math.PI * 2));
                                double y = ((double)direction.y / 360 * (System.Math.PI * 2));
                                double z = ((double)direction.z / 360 * (System.Math.PI * 2));
                                
                                // 根据弧度转角度公式会出现负数
                                // unity会自动转化到0~360度之间,这里需要做一个还原
                                if(x - System.Math.PI > 0.0)
                                        x -= System.Math.PI * 2;

                                if(y - System.Math.PI > 0.0)
                                        y -= System.Math.PI * 2;
                                
                                if(z - System.Math.PI > 0.0)
                                        z -= System.Math.PI * 2;
                                
                                bundle.writeFloat((float)x);
                                bundle.writeFloat((float)y);
                                bundle.writeFloat((float)z);
                                bundle.writeUint8((Byte)(playerEntity.isOnGround == true ? 1 : 0));
                                bundle.writeUint32(spaceID);
                                bundle.send(_networkInterface);
                        }

在代码里,我看到同步了position,角度,isOnGround,spaceID,并没有同步走势? 那么我的理解是,如果坐标发生变化,其它客户端就认为该玩家是在“walk”状态吗?

在本机测试了两个客户端同时登陆一个场景的同步效果,有一下问题: 1.玩家A倒退,在玩家B来看,依然是播放跑步动作 2.由于A的动作是由服务器根据位移来判断,所以B经常看见A的动作卡卡的。

: 卡卡的那是客户端移动匹配表现没做好而已。 因为移动太慢,被客户端算法当作误差值了

移动和停止完全可以客户端匹配出来。 你可以将demo的做法改为总是向某个方向移动移动,除非发现最后一次同步位置与前一次位置相同既止。

E4服务器和客户端是基于帧同步的, 与KBE目前不是一个方向。 帧同步可以保证客户端保持一致的画面, KBE的方向是mmo, 只需要适度表现即可, KBE的同步方式也不是自我创造的, 也是根据权威的mmo服务端引擎学习而来。 2种不同的同步方式, 不存在谁更好, 只有谁适合什么游戏。

你要用做帧同步只能自己在客户端做, 让服务器转发。

Clone this wiki locally