微信小游戏--Buff系统设计
解决问题
需求要点
BUFF 是现在网络游戏中非常常见的一个术语,简单来说,给角色加一个 BUFF 通常意味着对虚拟角色的一些数值上的临时修正,同时为角色添加一些指定的表现效果。所以buff系统设计的需求主要有两个方面,一个是对角色的数值进行修改,另一个就是给角色添加表现特效。
难点
- 针对buff系统的第一个需求,存在的难点主要是数值的修改有可能是不可逆的。通常在对角色添加一个buff的时候,都会临时修改角色的数值,而在buff移除的时候,又需要将数值恢复。这个过程有可能是不可逆的,比如浮点数的加减乘除运算。不可逆的过程会使得游戏产生数值上的偏差,多个偏差的累加会导致最终游戏的表现与预期不同。另一种不可逆的情况是如果buff的效果是直接将数值修改成某个指定的值,在没有缓存的情况下,是完全不可逆的。
- Buff系统第二个需求的难点主要是特效生命周期的管理,需要考虑的问题有特效的预加载,播放时机,播放位置,回收时机等。
解决方案
概要设计

详细设计
- 针对Buff系统的第一个难点,buff基类在设计的时候使用了execute和remove两个配对的接口,execute接口会先缓存要改变的角色数值,然后再对数值进行操作,remove接口会在buff释放的时候还原数值,同时回收特效。update接口用于对数值进行渐变处理,同时更新特效的位置和旋转。
- 针对Buff系统的第二个难点,EffectManager会在战场初始化的时候,根据策划的配置,对指定的特效资源进行预加载和预创建。为了避免打乱角色的渲染批次,buff特效并不会直接挂在角色身上,而是挂在与角色不同的层级上,通过buff的update来更新特效的位置和旋转,保持与角色同步。在buff的生命周期结束的时候,会将特效返回缓存池中复用。