玩家登录游戏,去向服务器请求引导 ID 表,根据这个 ID 表关掉所有已完成的节点,
开始引导系统的检测流程,在每一帧( Update )检测是否存在哪个引导节点满足了开始条件, 有就启动该步引导(启动一个引导节点即将该节点的状态从未开始转为执行中),
当有节点在执行中时,停止引导系统的检测流程,改为刷新该节点的 OnUpdate 逻辑(引导节点类会在 OnUpdate 函数中逐步执行各个引导命令,直到全部执行完毕,关闭当前节点),
当检测到当前节点执行完成后,又开始新的一轮检测流程。
<hr/>还有很多其他机制,都是视项目需求添加,随便举几个例子:
不可逆的引导
比如一个商店教学,要先给玩家发金币,然后引导去商店买个物品,如果玩家在发完金币后就强退了,怎么办?下次玩家登录时从哪里开始引导,不可能再给他发一次钱吧。
所以我们会在服务端再存一个奖励 ID 表,在新手引导过程中,每次给玩家发东西都会在服务端存下对应的 ID ,一方面防止重复发放奖励,另一方面客户端能够依据奖励 ID 表知道玩家重连时如何重新引导。
系统的顺序开放
玩家一级进游戏时只能看到开始游戏这一个功能模块,后续在新手引导流程中再把商店、排行榜等模块一个一个开放给他。
有了引导 ID 表之后,这个实现起来就简单了,只需将 xml 表中玩家开放新系统的那一步骤 ID 单独存入一个列表,可视为不同系统模块均绑定了一个给定 ID,玩家登录游戏时,检查一下引导 ID 表中已经记录了哪些 ID,就知道哪些系统模块已经开放了。
<hr/>就我个人而言,这样设计就已经达到了我之前的想法:即一开始搭好框架后,以后需求变动就只需要改 xml 文档,有新功能需要实现也用加一个引导命令类ヽ( ̄▽ ̄)ノ 但新手引导毕竟是一个特别依赖于需求设计的系统,只能说我这样弄刚好满足了我这边的需求,肯定还有很多不足,具体情况具体分析吧,欢迎各位大佬批评指正( • ̀ω•́ )✧