buff相关个人备注
bonus:游戏对象指定类型属性值,一般和逻辑有强耦合关系。
最终值 = 基础属性值+offset值
value = (BaseValue+ AddValue)*(1+MulValue)
其中:AddValue = addValue_base + addValue_dynamic
Mulvalue = mulValue_base+mulValue_dynamic
其中BaseValue是默认初始值
addValue_base,mulValue_base是记录在服务器的add类型的target初始值
buff:游戏对象持续性的一段逻辑
1.Add 2.Remove 3.Refresh
一:Add:
添加Buff A到 Target 对象上:
能否真正添加进去?
是否移除已有的buff?
如果已经有此buffA,怎么处理?
buff消失类型:时间、触发次数、永久。
-
如果A可被场景禁止,当前又是场景禁加buff状态;加不上
-
Target有禁止addBuff的bonus,加不上
-
AddBuffCD概念。A有CD属性,并且还在CD内。 加不上
-
Target已有A,进行Refresh叠加规则
-
唯一BuffExclusiveID的概念,用于进行Buff之间的交互规则(下面6、7、8条)
-
Target已有Buff_B并且B禁止添加A 加不上
-
A移除列表中有buff_B,则移除buff_B
-
A和B的BuffExclusiveID相同,保留谁?1.什么也不做,A和B无关,加A留B 2.A替换B 3.选择配置level高的 4.A被B屏蔽,A加不上
-
A消失类型是时间控制,target有影响lifeTime的Bonus属性,,判断两者值的大小,如果A的lifeTime小于reduceCD,则A加不上
-
A的BuffValue是有意义的,target有影响BuffValue的Bonus属性,则判断受reduceValue影响后BuffValue是否还有意义, 无意义(一般是value<0)则A加不上
二:Remove:
buff消失三种类型:时间、触发次数、永久。
统一在fixedUpdate内进行CheckRemove
-
时间类型 每个buff进行倒计时
-
触发次数类型
三:Refresh:
buffLayer叠加规则。会影响到buffValue的值。进而影响具体buffLogic的执行。
四:Effect效果:
每个buff实现的logic差异化,有logicType,继承baseBuffLogic。
目前基类BaseBuffLogic针对常用的bonus类型做了layer_bonus处理。
-
bonus相关比较常用,直接放入到baseBuffLogic内
-
A加上后执行独立类型logicType的buffLogic类进行 buffEnter Refresh Update Trigger
-
如果有BuffTriggerType的话,会被event触发执行Trigger逻辑。 比如:308 BuffControlType类型为 次数类型的,BuffTriggerType=CfgTriggerType.BeHurt TriggerTimes=1 表示为 targert受伤一次就移除这个buff
比如:50014 使用N张卡牌后,给target添加指定buff并移除50014
五:统一在BuffManager内管理:
1.target+bufflist(游戏对象映射buffLogicList)
2.BuffManager里进行Update刷新,检测所有target的buffList内的buff是否合法、更新。
总结:
1.bonus在进入战斗后伴随游戏对象执行具体逻辑。区分基础值和动态添加。
2.buff的添加是否成功,需要考虑全局场景buffCD、buffCD、buff互斥、buff叠加
-
buff的移除:时间or触发次数or永久
-
trigger的概念,执行OnTrigger,进行和其它逻辑进行交互。并在buffTriggerCount记录次数。
-
layer的概念,执行onRefresh,进行同buff的叠加规则。
-
exParams扩展参数概念,进行logicType指定可配置逻辑处理
-
buff的添加、移除最好统一放在Update内,外部的Addbuff和removebuff针对list进行临时操作,在下一帧Update内进行真正的操作。可以避免出现:在Update buff delete内remove其它buff导致出现buffList长度变化,在for循环内的异常。