关于moba游戏的移动同步技术

时间:2022-12-03 15:04:24

服务器对客户端世界进行模拟,包括世界中的所有碰撞都需要服务器进行检测。


客户端移动摇杆,发送move_dir协议给服务器,数据为一个方向向量 (x和z) 和一个角度,

服务器返回run_state协议,数据为:开始移动的坐标,方向向量和速度。

客户端把英雄置到那个坐标然后才开始移动。

开始移动后,不需要再进行通信,除非摇杆改变了移动方向。


当松开摇杆的时候,会发送stop_move协议给服务器。

服务器会停止我们的英雄的移动,返回free_state给客户端,数据为:坐标和方向向量


Q: 如果服务器没有返回run_state,客户端的英雄救不进行移动吗?

A: 没错,客户端可以自己旋转英雄,但是必须受到run_state才开始移动。


Q: 如果服务器不返回free_state,客户端英雄就一直往前跑?

A: 没错,一直往前跑,跑到地图外都不停下来。如果此时摇杆改变方向,就会发送move_dir,收到run_state,会从服务器指定的位置开始移动,这个位置就是客户端发送stop_move时服务器当时的位置。


Q: 如果服务器返回run_state,但是客户端直接return掉,不移动英雄,会怎么样?

A: 英雄开起来就不会移动了,但是,服务器还是进行坐标计算的,服务器自己需要维护整个世界的信息,包括碰撞,所以服务器自己计算发现你碰撞到墙壁了,会推送free_state给客户端,此时客户端就会瞬间瞬间变到那个位置(准确说是距离跨度太大才瞬间变过去的,如果距离小,则客户端进行插值移动到目标点)


Q: 客户端不进行物理碰撞??

A: 客户端可以不进行物理碰撞,全都在服务器进行模拟,所以就像上面说的,如果不处理free_state,那么英雄一直往前跑,是可以穿墙的~