Buff的多来源化

前言

这是一个做技能时发现的问题。

技能的效果就相当于一个领域,在一定领域内会给其他角色增加一定BUFF,离开时会移除掉。但是对于这个需求进行深入讨论后,还是发现了一些值得记录的东西。

实现记录

进入添加,离开移除

第一版的实现即是最简单的,在和领域发生重叠时。尝试添加BUFF,在角色退出重叠时,移除BUFF。这个甚至是已经有道具碰撞的基础功能了。

多个领域重叠?

但是做完第一版测试时,就想到了重叠的情况。多个领域部分重叠时,不就会导致离开一个领域时BUFF直接被移除了嘛?

只处理自己的BUFF

第一反应就是,一个领域只处理自己的BUFF。因为添加BUFF时是可以记录下来源的。那么只需要在离开领域时,移除由自己添加的BUFF不就行了么?

但是仔细思考一下,会发现一些其它问题。

  1. 目前BUFF机制,不允许同一个BUFF存在多个实例。

    在此基础上,重新去审视了一下项目原本的代码,发现对于这种在某个法术场内添加的BUFF,会在离开对应法术场时移除。

    但是如果在1号法术场内进入了一个新的相同法术场2号场,会导致BUFF重新刷新,归于2号法术场。

    这个时候离开2号法术场时会导致BUFF移除。

    但是这个过程中一直没有离开1号法术场。就会导致明明在法术场内,但是没有对应BUFF。

  2. 允许多实例叠加相同BUFF时,效果要叠加生效么?

BUFF叠层

这时候的思路似乎让对应BUFF可以叠层,进入领域加一层,离开领域减一层。层数虽然变化,但是实际效果不发生变化。似乎很方便的简单的解决了这个问题。

这个方案实际上会涉及到一部分UI表现问题,但与内容无关,暂且不表。

领域管理

领域自身通过各类碰撞消息,事件监控来处理最后角色身上最终存在的BUFF。

实际需求的复杂化

其实本来通过叠层方式,看起来就够了。但是做实际技能需求时,发现并不能简单叠层解决。

进入领域时加的BUFF,不是实际目标的BUFF

策划的实际需求上面,可以理解为进入领域获得一个状态BUFF-A

在拥有状态BUFF-A时,如果得到了其他的某类BUFF-B,则会给角色增加一个特殊状态BUFF-C

在离开领域后,AC都会被清除掉。

这样就导致了叠层的难以适用性,这个添加过程中,涉及到了许多基础(历史久远)的BUFF机制,C也是一种特定的BUFF效果,没法轻易改动。

就算可以通过各种叠层、抵消的BUFF机制来处理这种效果。但是让策划来维护这种关系属于是有点难度的。

而且这种基于BUFF机制的具体效果后续又要改动呢?

允许多来源化

在此基础,为BUFF功能添加了一个多来源化的设计。

BUFF可以把自己涉及到的影响来源存储下来。

这个存储不影响BUFF本身功能的具体实现。只是允许,通过某些特定接口添加BUFF时,可以对于已经存在BUFF,如果存在的话,就直接保存一个来源。

在移除的时候,根据来源进行判定,是只移除掉这一个来源,还是移除整体的BUFF

需求的最终实现

最后,对于这个领域的需求,对于涉及到的BUFF均在代码中进行多来源化处理。

对于要添加的,要移除的BUFF,都会通过来源判定。进行增删。