-
Notifications
You must be signed in to change notification settings - Fork 4
玩家的动作状态是怎么同步的?
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种不同的同步方式, 不存在谁更好, 只有谁适合什么游戏。
你要用做帧同步只能自己在客户端做, 让服务器转发。