14 KiB
14 KiB
增益/减益状态系统
**本文档引用的文件** - [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts) - [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts) - [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts) - [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts) - [timedCom.ts](file://assets/script/game/skill/timedCom.ts) - [Hero.ts](file://assets/script/game/hero/Hero.ts)目录
系统概述
增益/减益状态系统是一个复杂的状态管理框架,负责管理英雄的各种状态效果,包括攻击提升、防御增强、灼烧、冰冻、眩晕等多种状态。该系统采用ECS架构设计,通过分离的状态管理组件和视觉反馈组件协同工作,实现了高效的状态管理和实时的视觉反馈。
主要特性
- 多重叠加支持:同一属性允许多个增益/减益效果同时存在
- 持久与临时状态:支持永久buff和限时debuff的统一管理
- 类型化属性系统:区分数值型和百分比型属性的不同计算方式
- 实时视觉反馈:状态变化时的即时视觉效果展示
- 性能优化:通过对象池和定时器复用提升系统效率
核心组件架构
系统由三个核心组件构成,每个组件承担不同的职责:
classDiagram
class HeroViewComp {
+Record~number,Array~ BUFFS
+Record~number,Array~ BUFFS_TEMP
+Object NeAttrs
+addBuff(buffConf)
+removeBuff(attrIndex, value, isPermanent)
+clearBuffs(attrIndex, isBuff)
+recalculateSingleAttr(attrIndex)
+updateTemporaryBuffsDebuffs(dt)
}
class BuffComp {
+Node top_node
+Node ap_node
+Node cd_node
+Node def_node
+Node hp_node
+Node crit_node
+number ap_cd
+number cd_cd
+number def_cd
+number hp_cd
+number crit_cd
+Timer timer
+hp_show(hp, hp_max)
+mp_show(mp, mp_max)
+show_shield(shield, shield_max)
+show_do_buff(name)
+in_iced(t, ap)
+in_fired(t, ap)
+in_yun(t, ap)
}
class timedCom {
+number time
+number cd
+number ap
+update(deltaTime)
}
HeroViewComp --> BuffComp : "管理视觉反馈"
HeroViewComp --> timedCom : "创建临时状态"
BuffComp --> timedCom : "管理特效节点"
图表来源
章节来源
状态系统设计
数据结构设计
系统采用统一的数组设计模式,支持多种类型的状态管理:
erDiagram
HeroViewComp {
Record BUFFS
Record BUFFS_TEMP
Object NeAttrs
}
BuffConf {
Attrs buff
BType BType
number value
number time
number chance
}
BuffInstance {
number value
BType BType
number remainTime
}
NeAttrInstance {
number value
number time
}
HeroViewComp ||--o{ BuffInstance : "管理"
BuffConf ||--|| BuffInstance : "转换为"
HeroViewComp ||--o{ NeAttrInstance : "管理负面状态"
图表来源
属性类型系统
系统定义了两种属性类型,每种类型采用不同的计算方式:
| 属性类型 | 描述 | 计算公式 | 示例 |
|---|---|---|---|
| 数值型 (VALUE) | 直接加减绝对数值 | (基础值 + 所有数值型buff之和) × (1 + 所有百分比buff之和/100) |
攻击力、防御力、生命值 |
| 百分比型 (RATIO) | 按百分比计算 | 基础值 + 所有数值型buff之和 + 所有百分比buff之和 | 暴击率、闪避率、伤害加成 |
章节来源
状态持续时间管理
cd字段族系统
系统通过专门的cd字段族来管理各种状态的持续时间:
flowchart TD
A[状态触发] --> B{判断状态类型}
B --> |增益状态| C[设置ap_cd字段]
B --> |减益状态| D[设置deap_cd字段]
C --> E[启动计时器]
D --> F[启动计时器]
E --> G[更新视觉反馈]
F --> G
G --> H{计时结束?}
H --> |否| I[继续监控]
H --> |是| J[清除状态]
I --> G
J --> K[更新属性计算]
图表来源
定时器更新机制
系统采用帧更新的方式管理状态持续时间:
sequenceDiagram
participant Game as "游戏主循环"
participant Hero as "HeroViewComp"
participant Timer as "updateTemporaryBuffsDebuffs"
participant Buff as "状态容器"
Game->>Hero : update(deltaTime)
Hero->>Timer : 调用定时器更新
Timer->>Buff : 遍历BUFFS_TEMP
loop 每个临时buff
Buff->>Buff : remainTime -= deltaTime
alt remainTime <= 0
Buff->>Buff : 从数组移除
Buff->>Hero : 标记属性受影响
end
end
Timer->>Hero : 重新计算受影响属性
Hero->>Game : 状态更新完成
图表来源
章节来源
视觉反馈机制
UI同步逻辑
系统通过专门的方法管理UI元素的显示状态:
flowchart LR
A[状态变化] --> B[调用相应显示方法]
B --> C{状态类型}
C --> |生命值| D[hp_show方法]
C --> |魔法值| E[mp_show方法]
C --> |护盾| F[show_shield方法]
C --> |特殊效果| G[show_do_buff方法]
D --> H[更新进度条]
E --> H
F --> H
G --> I[创建特效节点]
H --> J[延迟更新确保同步]
I --> K[设置位置和时间]
J --> L[视觉反馈完成]
K --> L
图表来源
特效节点管理
系统支持动态创建和销毁状态特效节点:
| 方法名 | 功能 | 参数 | 创建的节点类型 |
|---|---|---|---|
show_do_buff |
显示通用状态特效 | name: string |
buff_xxx.prefab |
in_iced |
显示冰冻状态特效 | t: number, ap: number |
buff_iced.prefab |
in_fired |
显示燃烧状态特效 | t: number, ap: number |
buff_fired.prefab |
in_yun |
显示眩晕状态特效 | t: number, ap: number |
buff_yun.prefab |
dead |
显示死亡特效 | 无 | dead.prefab |
章节来源
状态叠加与刷新策略
叠加规则
系统支持同属性多实例叠加,每种状态实例保持独立:
flowchart TD
A[添加新状态] --> B{检查属性是否存在}
B --> |不存在| C[创建新数组]
B --> |存在| D[添加到现有数组]
C --> E[设置状态实例]
D --> E
E --> F{状态类型判断}
F --> |持久| G[BUFFS数组]
F --> |临时| H[BUFFS_TEMP数组]
G --> I[直接添加]
H --> J[添加remainTime字段]
I --> K[重新计算属性]
J --> K
K --> L[触发视觉更新]
图表来源
刷新与清除策略
系统提供了多种状态清除机制:
flowchart TD
A[状态清除请求] --> B{清除范围}
B --> |单属性| C[clearBuffsForAttr]
B --> |全属性| D[遍历所有属性]
C --> E{过滤条件}
E --> |增益| F[value > 0]
E --> |减益| G[value < 0]
E --> |全部| H[无条件清除]
F --> I[过滤并保留符合条件的buff]
G --> I
H --> I
I --> J{数组是否为空}
J --> |是| K[删除属性条目]
J --> |否| L[保留数组]
K --> M[重新计算属性]
L --> M
M --> N[更新视觉反馈]
图表来源
章节来源
状态特效节点管理
动态创建流程
状态特效节点的创建遵循统一的流程:
sequenceDiagram
participant System as "状态系统"
participant Manager as "BuffComp"
participant Resource as "资源管理器"
participant Scene as "场景节点"
participant Timed as "timedCom组件"
System->>Manager : 请求创建特效
Manager->>Resource : 获取预制体资源
Resource-->>Manager : 返回Prefab对象
Manager->>Manager : instantiate(prefab)
Manager->>Scene : 设置父节点
Manager->>Manager : setPosition(position)
alt 临时状态特效
Manager->>Timed : 设置时间参数
Timed->>Timed : 启动定时器
Timed->>Scene : 自动销毁
end
Manager-->>System : 特效创建完成
图表来源
销毁机制
临时状态特效通过定时器组件自动销毁:
stateDiagram-v2
[*] --> Created : instantiate()
Created --> Active : setPosition()
Active --> Updating : update(deltaTime)
Updating --> Active : remainTime > 0
Updating --> Destroyed : remainTime <= 0
Destroyed --> [*] : node.destroy()
图表来源
章节来源
生命周期管理
完整生命周期示例
以冰冻状态为例,展示状态的完整生命周期:
sequenceDiagram
participant Skill as "技能系统"
participant Hero as "HeroViewComp"
participant Buff as "BuffComp"
participant Effect as "特效系统"
participant UI as "UI系统"
Note over Skill,UI : 冰冻状态触发
Skill->>Hero : addBuff(冰冻配置)
Hero->>Hero : 添加到BUFFS_TEMP
Hero->>Hero : recalculateSingleAttr(DEF)
Hero->>Buff : in_iced(duration, ap)
Buff->>Effect : 创建buff_iced特效
Effect->>Effect : 设置remainTime
Buff->>UI : 更新防御显示
UI-->>Buff : 视觉反馈确认
loop 每帧更新
Hero->>Hero : updateTemporaryBuffsDebuffs(dt)
Hero->>Hero : 减少remainTime
alt remainTime <= 0
Hero->>Hero : 从BUFFS_TEMP移除
Hero->>Hero : recalculateSingleAttr(DEF)
Hero->>Buff : 清除特效
Hero->>UI : 更新防御显示
end
end
图表来源
状态移除流程
系统提供了多种状态移除方式:
| 移除方式 | 触发条件 | 影响范围 | 性能影响 |
|---|---|---|---|
| 自然消失 | remainTime <= 0 | 单个状态 | 低 |
| 主动清除 | clearBuffs() | 指定属性 | 中等 |
| 类型过滤清除 | clearBuffs(attrIndex, isBuff) | 指定属性和类型 | 中等 |
| 全部清除 | clearAllNeAttrs() | 所有负面状态 | 高 |
章节来源
性能优化措施
对象池应用
虽然当前实现中没有显式的对象池,但系统设计考虑了以下优化点:
- 定时器复用:使用统一的Timer实例管理多个状态的计时
- 数组操作优化:采用splice而非filter进行状态移除
- 批量属性计算:通过Set记录受影响属性,避免重复计算
内存管理策略
flowchart TD
A[状态添加] --> B[检查内存使用]
B --> C{超出阈值?}
C --> |否| D[正常添加]
C --> |是| E[触发垃圾回收]
E --> F[清理无效状态]
F --> G[压缩数组结构]
G --> D
D --> H[更新统计信息]
H --> I[监控内存使用]
更新频率优化
系统采用智能更新策略:
- 暂停检测:在游戏暂停时跳过状态更新
- 属性变更追踪:只重新计算受影响的属性
- 延迟更新:使用scheduleOnce确保UI同步
章节来源
使用示例与最佳实践
基本使用模式
// 添加攻击提升buff
const attackBuff: BuffConf = {
buff: Attrs.AP,
BType: BType.VALUE,
value: 50,
time: 10,
chance: 100
};
hero.addBuff(attackBuff);
// 添加百分比伤害加成
const damageBuff: BuffConf = {
buff: Attrs.AP,
BType: BType.RATIO,
value: 20,
time: 5,
chance: 80
};
hero.addBuff(damageBuff);
// 清除特定属性的所有增益
hero.clearBuffs(Attrs.AP, true);
// 清除所有负面状态
hero.clearAllNeAttrs();
最佳实践建议
- 状态优先级管理:合理安排状态的添加顺序
- 性能监控:定期检查状态数量,避免过多叠加
- 视觉反馈同步:确保状态变化时UI及时更新
- 内存泄漏预防:及时清理不再需要的状态
- 状态冲突处理:避免相同属性的相互抵消
常见问题解决
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 状态不消失 | remainTime未正确更新 | 检查updateTemporaryBuffsDebuffs调用 |
| UI显示异常 | 视觉反馈未触发 | 确认BuffComp相关方法被调用 |
| 性能下降 | 状态数量过多 | 实施状态数量限制和定期清理 |
| 内存泄漏 | 特效节点未销毁 | 检查timedCom组件的自动销毁机制 |
章节来源