跳到主要内容

游戏暂离与结束相关说明

开发者在开发游戏时,经常会碰到需要在玩家暂离或结束时清算云变量或执行一些特定的操作。本篇文档从常见事件和触发入手,结合具体案例详细讲述暂离、重连、断线、结束的规则和注意事项。

相关事件

1.玩家-暂时离开

短暂的网络波动(比如网络没有信号)、玩家手动切到后台、或其他暂时离开当前游戏局的操作(如看广告)被视为玩家暂离。

2.玩家-断线

玩家因上述原因切换到暂离状态后开始计时,直到超出网络连接超时时间(默认为120秒)被视为断线。

3.游戏-结束

游戏局内所有玩家断线后,该游戏局仍保留固定时间(默认为300秒),该时间后游戏自动结束。

4.玩家-重连

玩家因各种情况暂离后回到游戏或手动重新连接,即触发该事件。

5.玩家-放弃重连

玩家因各种情况暂离后进入大厅,在弹出的对话框中选择“放弃重连”,返回大厅后触发该事件。

关于离开游戏的触发语句

服务端

1. 触发语句:『游戏-彻底结束当前游戏局,释放服务器资源并断开所有客户端』

base.game:set_winner()

经过一段时间(默认为1秒,可配置)后,结束游戏局。

无论局内有多少玩家正在进行游戏,执行该语句总是会断开所有玩家的连接并进入游戏结束阶段,从而彻底结束游戏局。

注意:执行这个操作不会触发『玩家-断线』事件,但是会触发『游戏-结束』事件
我们观察到有部分开发者习惯于在『玩家-断线』事件中进行存档,需要注意这样的语句结束游戏时不会触发『玩家-断线』事件

客户端

1. 触发语句:『游戏-退出游戏』

base.game_exit()

客户端退出游戏局,会强制退出游戏,并触发玩家断线行为。(只能用于游戏局)

2. 触发语句:『游戏-返回大厅』

base.return_to_lobby()

客户端返回大厅,并触发玩家断线行为。(只能用于装备局)

关于重连的说明

  1. 重连时,服务端先向客户端发送『连入并开始游戏』事件(也就是客户端的『当前游戏客户端连入并开始游戏』事件),后初始化单位及其属性,所以客户端此时是拿不到任何单位的。
  2. 客户端不能监听重连事件,需要监听『玩家-主控单位改变时』事件才能拿到主控单位(其他的初始化逻辑也推荐监听该事件执行)。
  3. 服务端监听『玩家-连入』事件,重连后该事件会被触发,可以用是否为重连 == true来判断,这里可以拿到主控及其他单位。

Q&A


Q:切后台会触发暂离吗?杀进程会直接断线吗?

A:玩家手动切到后台或杀进程都遵循同一规则:不在游戏内3秒后被视为暂离;若网络连接超时判断时间(默认120秒)内一直未返回游戏,则被视为断线。


Q:不同游戏模式下建议用哪种退出方式,需要在什么时机下清算云变量?

A:

模式退出方式云变量清算需监听的事件
装备局游戏-返回大厅(客户端)玩家-断线
单人模式游戏-退出游戏(客户端)游戏-结束
多人组队(匹配)游戏-彻底结束当前游戏局(服务端)游戏-结束
多人随进随出游戏-退出游戏(客户端)玩家-断线

Q:我想延长游戏局和游戏结束的时间,应该在哪里配置

A:打开数编-地图设置-默认地图设置,勾选“显示高级属性”,修改图中两个参数的值。

游戏运行时间指的是一局游戏的最长时间,假如玩家在游戏局内挂机超过了这个时间,服务器也会将该玩家踢出,并执行游戏结束的逻辑。

游戏结束时间指"彻底结束当前游戏局,释放服务器资源并断开所有客户端"这步操作后停留的时间,过了这个时间后游戏局自动结束。


Q:我想修改断线和游戏结束的判断时间,应该在哪里配置

A:打开数编-地图设置-默认地图设置,修改图中两个参数的值。

网络连接超时时间是指“玩家-暂时离开”事件抛出后,直到超出本字段所设置的时间(单位秒),才会真的触发玩家断线操作。暂离期间,所有的网络数据都会被缓存。

所有玩家触发“玩家-断线”(或者根本没有玩家在这一局)后,经过“玩家离线游戏局保留时间”(单位秒),游戏局强制结束。


Q:放弃重连后会断线吗?

A:不会立刻断线,断线的时机是上次暂离时间+网络连接超时时间。

下面举一个例子说明:

玩家杀进程后重新进入大厅,在弹出的窗口中选择放弃重连,并退出游戏。配置的超时时间为120秒,玩家离线后游戏局保留时间为300秒。

可以看出,玩家放弃重连后没有立刻断线,而是达到设定的超时时间后才断线。此时游戏局保留300秒,经过该时间后游戏局结束。


Q:单人、多人(组队、匹配)、随进随出模式下,游戏结束的规则是一样的吗?

A:不同模式游戏结束的规则如下表所示:

模式行为
单人模式单个玩家退出,经过保留时间后游戏结束
多人模式、随进随出模式所有玩家断线退出且不再有人连入,经过保留时间后游戏结束