[客户端][UI] 游戏内退出逻辑整理

作者:邱子鉴
创建时间:2016.11.29
最后更新:2016.11.29


组件

1.名称:InGamePage
2.路径:/Game/UMG/InGamePage


需求说明

由于前段时间统一修改页面返回逻辑,所以,游戏内的返回逻辑也一起整理了,在整理过程中,发现一些坑,在这里记录一下,避免踩坑。

  1. 游戏内出口众多。下面会一一说明。

  2. 正常情况需要返回游戏入口界面(快速对战、组队界面、创建房间等),或者,游戏结算界面(GameResult、PVEGameResult等),so,此处会区别处理。

  3. 异常情况下,返回大厅或者房间界面。游戏内,客户端崩溃,60s内再次登录,玩家会直接进入到游戏内,此时,如果从游戏内退出,栈内是没有记录应该返回到哪个页面的。因此,需要特殊处理返回的页面:
    3.1 玩家不是通过房间or组队进入游戏,直接返回主界面。
    3.2 玩家通过房间or组队进入游戏,根据房间信息计算应该回到哪个房间页面。


    [客户端][UI] 游戏内退出逻辑整理_第1张图片
    根据房间信息计算所在页面.png
  4. 状态缓存。从游戏地图切到UI地图后,此时,游戏内的引用资源才会释放干净。所以,在MainHUD的BeginPlay事件中,处理切换状态的操作。


    [客户端][UI] 游戏内退出逻辑整理_第2张图片
    InGame缓存状态

    [客户端][UI] 游戏内退出逻辑整理_第3张图片
    MainHUD切状态
  5. 出口唯一性。由于离开游戏的事件是服务器 or GS 驱动的,可能存在服务器和GS都出发离开游戏的情况,如果客户端响应多次离开游戏事件,那么,页面跳转可能会出现错误。so,我们采用先到先离开的原则,一旦触发离开事件,即走了下面某一个出口,那么,关闭其他出口。

开启gate:OpenExitGate
关闭gate:CloseExitGate

出口整理

  1. 出口1:玩家点击退出游戏按钮,中途退出。

调用UserClickQuitGameEvent。
在此函数中会区别处理玩家是否通过房间or组队进入游戏。

  1. 出口2:GS崩溃;GS退出;LadderWait超时等

响应事件为GameOverDispatcher

  1. 出口3:正常结束游戏,会返回最终战绩表。

响应事件为GameEndNoteDispatcher
参数GameResultState:告知应该返回哪个结算界面状态

  1. 出口4:网络异常、客户端超时

响应事件为TravelNetErrDisptcher

  1. 出口5:关闭服务器

响应事件为IKickRoleInterface

根据不同的踢号原因,切换状态到不同的state。

总结

因为游戏内的处理的异常情况比较复杂,GS or Realm 都可能对客户端的行为有影响,所以,在处理出口的逻辑上,最好统一到一处处理。便于日后维护。另外,在整理过程中,发现在TempData里存了一些临时数据,现在可以干掉了,可以通过状态机把参数从其他状态传递到InGame里。

你可能感兴趣的:([客户端][UI] 游戏内退出逻辑整理)