Buff的多来源化
前言
这是一个做技能时发现的问题。
技能的效果就相当于一个领域,在一定领域内会给其他角色增加一定BUFF,离开时会移除掉。但是对于这个需求进行深入讨论后,还是发现了一些值得记录的东西。
实现记录
进入添加,离开移除
第一版的实现即是最简单的,在和领域发生重叠时。尝试添加BUFF,在角色退出重叠时,移除BUFF。这个甚至是已经有道具碰撞的基础功能了。
多个领域重叠?
但是做完第一版测试时,就想到了重叠的情况。多个领域部分重叠时,不就会导致离开一个领域时BUFF直接被移除了嘛?
只处理自己的BUFF
第一反应就是,一个领域只处理自己的BUFF。因为添加BUFF时是可以记录下来源的。那么只需要在离开领域时,移除由自己添加的BUFF不就行了么?
但是仔细思考一下,会发现一些其它问题。
目前BUFF机制,不允许同一个BUFF存在多个实例。
在此基础上,重新去审视了一下项目原本的代码,发现对于这种在某个法术场内添加的BUFF,会在离开对应法术场时移除。
但是如果在1号法术场内进入了一个新的相同法术场2号场,会导致BUFF重新刷新,归于2号法术场。
这个时候离开2号法术场时会导致BUFF移除。
但是这个过程中一直没有离开1号法术场。就会导致明明在法术场内,但是没有对应BUFF。
允许多实例叠加相同BUFF时,效果要叠加生效么?
BUFF叠层
这时候的思路似乎让对应BUFF可以叠层,进入领域加一层,离开领域减一层。层数虽然变化,但是实际效果不发生变化。似乎很方便的简单的解决了这个问题。
这个方案实际上会涉及到一部分UI表现问题,但与内容无关,暂且不表。
领域管理
领域自身通过各类碰撞消息,事件监控来处理最后角色身上最终存在的BUFF。
实际需求的复杂化
其实本来通过叠层方式,看起来就够了。但是做实际技能需求时,发现并不能简单叠层解决。
进入领域时加的BUFF,不是实际目标的BUFF
策划的实际需求上面,可以理解为进入领域获得一个状态BUFF-A。
在拥有状态BUFF-A时,如果得到了其他的某类BUFF-B,则会给角色增加一个特殊状态BUFF-C。
在离开领域后,A和C都会被清除掉。
这样就导致了叠层的难以适用性,这个添加过程中,涉及到了许多基础(历史久远)的BUFF机制,C也是一种特定的BUFF效果,没法轻易改动。
就算可以通过各种叠层、抵消的BUFF机制来处理这种效果。但是让策划来维护这种关系属于是有点难度的。
而且这种基于BUFF机制的具体效果后续又要改动呢?
允许多来源化
在此基础,为BUFF功能添加了一个多来源化的设计。
BUFF可以把自己涉及到的影响来源存储下来。
这个存储不影响BUFF本身功能的具体实现。只是允许,通过某些特定接口添加BUFF时,可以对于已经存在BUFF,如果存在的话,就直接保存一个来源。
在移除的时候,根据来源进行判定,是只移除掉这一个来源,还是移除整体的BUFF
需求的最终实现
最后,对于这个领域的需求,对于涉及到的BUFF均在代码中进行多来源化处理。
对于要添加的,要移除的BUFF,都会通过来源判定。进行增删。