MIROS 开发中部分代码理解
该文档的编写的主要目的是便于我理解代码,因为有部分代码是从各位天人抄来的,为了更好地修改使用,特此用文字记录下我的理解过程,大概率以后我也不会再看,
写下思考过程,目的就达成了。
AttributeAggregator
主要服务对象是个 AttributeBase,并保存该属性的拥有者、被引用的各效果与其修改器(_modifierCahce)。
在启用时,将自身的“基础值变化时更新当前值函数”绑定至属性的“基础值变化后事件”,并将自身的“刷新修改器缓存函数”绑定至属性拥有者的效果容器的“效果容器变化时事件”上。
关闭启用后,解除这两条的绑定规则。
刷新修改器缓存函数:调用自身“注销属性变化监听函数”,清空_modifierCahce, 后将拥有者效果容器中的所有引用该属性的效果与其修改器保存起来(相当于重建_modifierCahce),并对各个效果及其修改器调用自身“注册属性变化监听函数”,最后调用自身“修改器变化时更新当前值函数”。
实际效果:当效果容器中对一个属性增减了效果时,AttributeAggregator 会重建属性与修改器的序列关系,并使用新的序列关系计算出新的结果。
举个例子:
假如有一个属性“生命值”,当其拥有者的效果容器中添加了‘恢复生命值’
效果,会触发绑定的刷新修改器缓存函数,计算出当前的生命值
计算当前值函数:根据属性的修改序列关系应用修改器,计算结果。
基础值变化时更新当前值函数:使用“计算当前值函数”重新计算属性当前值。
修改器变化时更新当前值函数:使用“计算当前值函数”重新计算属性当前值。
注册属性变化监听函数:当属性修改器为 基于其他属性的幅度计算器 ,且计算器的捕获类型为追踪:
- 如果计算器的属性来源为Target(拥有者)则将自身的“在属性改变时函数”绑定至效果拥有者对应属性的“当前值变化后事件”
- 如果计算器的属性来源为Source(创建者),则将自身的“在属性改变时函数”绑定至效果创建者对应属性的“当前值变化后事件”。
注销属性变化监听函数:注销上者的绑定
在属性改变时函数:当属性修改器为 基于其他属性的幅度计算器 ,计算器的捕获类型为追踪: 检查属性来源是否匹配:
- 如果是来自目标,则检查属性拥有者是否是效果的目标
- 如果是来自源头,则检查属性拥有者是否是效果的来源
然后调用自身的“修改器变化时更新当前值函数”
实际效果:实现一个属性依赖于另一个属性的自动更新
举个例子:
假设有一个效果"吸血",其伤害值基于角色的攻击力属性:
- 当攻击力属性发生变化时
- 这个方法会被触发
- 检查到吸血效果的修改器依赖攻击力属性
- 然后重新计算吸血效果的数值