游戏成就系统实现

每个游戏基本都有成就系统,它的实现流程和任务基本相同,但是没有任务功能那么复杂。本质上都是任务系统。所以梳理一下成就系统的实现方案。

成就功能内容和游戏功能的关系。很显然成就功能大部分是基于游戏玩法触发的比如:升到x级,获得xxx道具,xx玩法胜利….。

设计方案

  1. 触发点

    首先是触发点比如升到30级,升级(加经验)的时候在对应模块里触发。获得xxx道具,在背包变更 或者获得物品里触发。

  2. 类型区分

    成就部分大多是相同需求不同数值,升到15、20、30级。所以定义一个枚举类型AchievementType 1001是升级,1002是道具….

  3. 统计方式

    成就主题 – 成就数据 用一个set<Long> 表示成就完成情况。 可以减少数据的存储和协议的处理

  4. 扩展性

    有了AchievementType 如果同类型在细分,比如:升级中新加一个 宠物升级,我们只能新加一个类型1003,但是这样配置和代码都有冗余的可能。

    所以设计是尽可能做到通用,可以加一个类型subKey 用来增加类型。定义为 1=>玩家 2=>宠物。这样我们只需要根据模块传递的AchievementType 和subKey 就能确定具体是哪个成就了。

  5. 数据一定要和其他模块的定义一致,便于维护,不易出错。

实现方案

其他

设计的时候还要考虑有些功能玩法没有但是成就需要,要么扩展之前旧的功能,要么想办法在计数上处理。