联机功能讲解:手动网络同步
联机功能讲解:手动网络同步
联机功能在旧版本中会自动同步机械和零件的全部状态,比如零件是否发光,机械是否有碰撞,这种模式虽然制作联机游戏时入门简单,但我们在实际游戏制作中发现当状态改变比较频繁时会产生大量的网络通讯造成游戏卡顿。所以新版本中我们增加了一个“手动网络同步”开关,旧的自动同步功能在未来版本中将会被移除,所以新创建的联机游戏都应该在工程的设置面板中勾选“手动网络同步”开关
首先手动网络同步模式下还是有几种功能是自动同步的:
1.创建机械
2.机械死亡
3.删除机械
4.自定义发射器发射机械
5.装备插槽产生装备
6.玩家同步数据,机械同步数据,地图同步数据
7.机械的位置和旋转
8.蓝色的逻辑方块调用红色的分机逻辑方块
9.红色的分机逻辑方块调用蓝色的逻辑方块
除此以外的所有功能调用都不会自动通过网络通知,比如关节运动,零件设置材质等等
手动模式下“所有机械”的逻辑在所有分机上都会运行。比如现在有A、B两个玩家进入了联机游戏,产生了a,b两个玩家机械分别属于两个玩家,还有c机械是AI机械。在旧模式下,A玩家只会运行a机械的逻辑,只有主机才会运行c机械的逻辑。但是在新的手动模式下,a、b、c三个机械的逻辑在A玩家和B玩家的设备上都会运行。
这样做的目的是,可以灵活的控制以下3中情况的逻辑:
1.可以分别运行而不需要同步的,比如机械上有个随时间亮灭的呼吸灯,因为变化是有固定规律的,不需要网络同步。这种逻辑很简单,只需要每个机械上直接运行对应的逻辑即可。
2.而有些逻辑是需要网络同步的,比如a机械做了一个挥手的动作,因为需要其他玩家也看到这个动作,所以需要使用手动调用网络通知的方式。
3.还有一些逻辑是只能控制者的设备运行的,比如UI,其他人是看不到的,所以其他人的设备要跳过这些逻辑。
其中第2种情况,可以使用零件变量中的“网络调用方法”功能,该方法会通过网络通知所有分机(包括自己)去调用这个名为“挥手”的自定义方法
用这种模式一定要确保调用不要太频繁,如果需要同步的操作非常频繁,比如是一把每秒钟射击30次的机枪,那么将“发射”这个功能作为网络调用就容易造成游戏卡顿。这种情况就应该将“开始射击”和“结束射击”作为网络调用,这样一次连射只会产生两次调用。
而有时候网络通知的操作比较频繁而且只是一些特效表现并不影响玩法,比如冷兵器互相撞击时通过网络通知“产生火花”,那么可以使用“不可靠网络调用”这个方法,这个方法的特点是只会尝试发送一次网络消息,如果因为网络不稳定原因消息丢包了就不会再次尝试发送,大大提高了性能,但是也会导致这个调用有概率不会成功。
当然通过“机械同步数据”的方式也可以实现同步,比如当角色血量变化时设置同步数据小数
机械的“机械自定义数据变化”事件中处理数据变化的逻辑也可以实现同步,但这种方式只适合状态变化的同步,像玩家挥一下手或者发射一颗子弹这种瞬时动作就不适合了。
而第3种情况,比如UI和键盘输入的逻辑只需要控制者一个设备来运行,那么就需要在其他分机上跳过这些逻辑,你可以使用如下方式判断当前机械是不是由当前分机控制的
begincodeV1;
color:0,132,144;
name:初始化;
1:Mech 当前机械=act 1.this.getMech();
2:Player 玩家=act 1.this.getPlayer();
3:Player 当前分机玩家=fun getCurrentPlayer();
4:Bool 不是本地机械=varf Player.当前分机玩家.isSame(var 玩家);
5:Bool 不是本地机械=fun bool.not(var 不是本地机械);
endcode
注意截图中,“当前机械”,“当前分机玩家”,“不是本地机械”这几个变量都应该设置为全局变量
然后在生成UI的代码前面就可以加上判断,避免非控制者分机执行UI相关代码
网络游戏开发时主要就是分以上三种情况,在实际制作中如果遇到两侧不同步的问题,需要使用调试功能具体查看每个分机逻辑的运行情况,不要靠主观逻辑猜测。
另外调试网络同步时,最好使用“功能调用/系统/调试/开关网络通讯日志”功能,根据输出的信息判断是否有过于频繁的网络调用。
原则上不应该出现1秒内多次的连续网络调用,当出现不得不频繁调用时,你应该思考是否有更节约的方式将频繁调用改为简单的切换状态是调用一次,或者这么频繁的操作能不能改为每个分机各自运算,该操作是否不同步也不会影响游戏体验。
最后游戏作者要知道开发网络游戏比开发单机游戏要更加困难,建议尝试开发一个网络游戏之前先尝试制作一些单机游戏来练手。