主要做技能系统的时序管理框架,并不包含具体的业务实现(例如伤害、眩晕等)
技能系统被抽象为 技能(ability)、技能实体(running)、buff,其中:
- 技能是单位的固有能力,他可以调用、触发去影响单位的状态,改变单位的buff以及产生一些技能实体
- 技能实体是依附于单位的有一定生命周期的状态,他可以定期、被触发地去影响单位,甚至继续产生其他的技能实体。与技能不同的是, 技能实体 主要通过事件触发和思考(think)来触发逻辑,事件触发跟技能一致,思考则是技能实体定期地去触发一些逻辑。
- buff是依附于单位的一定生命周期的状态,与技能实体不一样的时,buff在整个生命周期不会思考,也不会触发,他仅仅影响单位的数值状态。 buff在实现中添加了一下基本的堆叠、组合方案提供实现游戏中常用的buff。
考虑到 gas 需要和游戏逻辑进行交互,我们对交互接口进行了抽象,其中:
- WI是整个游戏世界的抽象,技能、技能实体 可以通过 WI 去影响世界,例如伤害、治疗其他单位,给他们上技能实体或者上buff等。
- UI是单位抽象,是技能、技能实体、buff依附的抽象实体,他需要提供接口让buff去做buff数值交互
- EI是触发事件抽象
ArrayMap
ArrayMap 是使用 slice 模拟的 map,在元素较少时,access 效率与 map 相当,但是迭代速度更快(map 迭代效率太低,拖累整个系统)。 在典型的游戏场景中,单个单位的技能、技能实体、buff各自一般不会超过50个,并且常常需要遍历,因此 ArrayMap 效率更高。
HeapArrayMap
HeapArrayMap 与 ArrayMap 类似,但额外维护了一个 heap 用来对 map 中的元素排序,典型的场景是维护技能实体的思考时间和buff的变更时间。
RegisterProxy
RegisterProxy 提供了一种方案根据 id 动态派发 json,方便实现通过文本(json)配置装载逻辑。