BuffSystem的简单实现

设计

首先对于一个 BuffSystem 来说,最重要的肯定是 Buff,我们的 Buff 应该记录最基本的信息:BuffIDGivers(授予者)Recipient(接受者),并且有最基本的功能:Create(生成)TickMerge(合并)Break(打断)

然后我们需要一个 BuffSystem 用来管理所有的操作,我们通过这个 System 来发起 CommitQuery 某个 Buff,并且保存一下最基本的信息 BuffTable(buff总表)RecipientDict(当前 Recipient 上有哪些 BUff)。其中BuffTable 在蓝图中手动添加。

image-20220613212816579

BuffBase

  1. Create:保存 BuffIDGivers(授予者)Recipient(接受者) 信息;
  2. Break:执行需要的方法,并将 bInterrupted 设为 true (对于每个 Buff,保存一个 bInterrupted 判断是否被 Break,可以有一个蓝图可调用的 CanBeInterrupted 方法来设置该值)
  3. Merge:执行当 Recipient 身上被 Commit 了相同 Buff 时,可能需要的逻辑;
  4. Tick:执行 Tick 内的逻辑;

每个 Buff 的生命周期由 BuffSystem 上的 RecipientDict 来管理。

BuffSystem

  1. Commit:判断 BuffTable 里是否有对应 BuffIDBuff,若存在则创建该实例,然后写进 RecipientDict;注意判断一下是否原本已经有该 Buff,若有的话执行 OldBuffMerge 即可;
  2. Query:直接判断是否在 RecipientDict,返回对应 Handler
  3. Tick:遍历 RecipientDict,遍历 BuffGroup;第一轮我们执行每一个 BuffTick;第二轮针对每个 Buff ,判断 CanBeInterrupted,执行 Break 方法,然后 Remove