Files
pixelheros/.qoder/repowiki/zh/content/英雄系统/英雄属性系统.md
2025-10-30 16:49:19 +08:00

504 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 英雄属性系统
<cite>
**本文档中引用的文件**
- [HeroAttrs.ts](file://assets\script\game\common\config\HeroAttrs.ts) - *更新了属性类型和职业成长配置*
- [Hero.ts](file://assets\script\game\hero\Hero.ts) - *更新了英雄实体初始化逻辑*
- [HeroAttrsComp.ts](file://assets\script\game\hero\HeroAttrsComp.ts) - *重构了属性组件,包含攻击状态管理*
- [HeroViewComp.ts](file://assets\game\hero\HeroViewComp.ts) - *更新了视图组件,移除了攻击状态管理*
- [heroSet.ts](file://assets\script\game\common\config\heroSet.ts) - *包含了英雄配置数据*
- [GameEvent.ts](file://assets\script\game\common\config\GameEvent.ts) - *定义了游戏事件系统*
</cite>
## 更新摘要
**主要变更**
- **架构重构**:将`is_atking`攻击状态从`HeroViewComp`视图层迁移至`HeroAttrsComp`数据层,实现状态管理集中化
- **ECS架构优化**:为`HeroAttrSystem`等系统添加ECS注册装饰器使架构更符合标准
- **职责分离**`HeroViewComp`不再管理攻击状态仅负责UI表现和动画控制
- **代码维护性提升**:通过将状态管理集中在数据层,提高了代码的可维护性和测试性
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
英雄属性系统是游戏《heroes》的核心战斗机制之一负责管理英雄的基础属性、成长属性、动态计算以及战斗中的实时更新。该系统采用模块化设计通过HeroAttrs.ts定义属性枚举和配置Hero.ts实现英雄实体管理HeroAttrsComp.ts处理属性计算和状态管理形成了完整的属性管理体系。
系统支持多种属性类型包括基础生存属性、攻击属性、防御属性、特殊效果属性等每种属性都有明确的数值型或百分比型分类。通过Buff系统实现属性的动态叠加和计算确保战斗中的属性变化能够实时反映在UI界面中。
**更新说明**:根据最新代码重构,攻击状态`is_atking`已从视图层`HeroViewComp`迁移至数据层`HeroAttrsComp`实现了状态管理的集中化。这一变更遵循了ECS架构的最佳实践将数据状态与表现逻辑分离提高了系统的可维护性和扩展性。
## 项目结构
英雄属性系统的核心文件分布在以下目录结构中:
```mermaid
graph TB
subgraph "属性配置层"
A[HeroAttrs.ts<br/>属性枚举与配置]
B[heroSet.ts<br/>英雄数据配置]
C[GameEvent.ts<br/>事件系统]
end
subgraph "实体管理层"
D[Hero.ts<br/>英雄实体]
E[HeroAttrsComp.ts<br/>属性组件]
F[HeroViewComp.ts<br/>视图组件]
end
subgraph "战斗系统"
G[Mon.ts<br/>怪物系统]
H[BuffComp.ts<br/>缓冲组件]
end
A --> D
B --> D
C --> E
D --> E
E --> F
G --> E
H --> F
```
**图表来源**
- [HeroAttrs.ts](file://assets\script\game\common\config\HeroAttrs.ts#L1-L50)
- [Hero.ts](file://assets\script\game\hero\Hero.ts#L1-L30)
- [HeroAttrsComp.ts](file://assets\script\game\hero\HeroAttrsComp.ts#L1-L50)
**章节来源**
- [HeroAttrs.ts](file://assets\script\game\common\config\HeroAttrs.ts#L1-L546)
- [Hero.ts](file://assets\script\game\hero\Hero.ts#L1-L100)
## 核心组件
### 属性枚举系统
属性系统定义了完整的属性体系,涵盖战斗中的各个方面:
| 属性类别 | 属性数量 | 主要功能 | 示例属性 |
|---------|---------|---------|---------|
| 基础生存属性 | 6 | 生命值、魔法值、护盾 | HP_MAX, MP_MAX, SHIELD_MAX |
| 攻击属性 | 6 | 输出能力相关 | AP, MAP, AS, AREA_OF_EFFECT |
| 防御属性 | 7 | 防御能力相关 | DEF, MDEF, DODGE, BLOCK |
| 暴击与命中 | 5 | 命中率与暴击系统 | CRITICAL, CRITICAL_DMG, HIT |
| 特殊效果属性 | 10 | 特殊战斗效果 | LIFESTEAL, FREEZE_CHANCE, BURN_CHANCE |
| 增益效果属性 | 10 | 状态增强效果 | BUFF_UP, SPEED, EXP_GAIN |
### 属性类型系统
系统区分两种属性类型:
- **数值型属性VALUE**:直接加减的绝对数值,如攻击力、防御力
- **百分比型属性RATIO**:按百分比计算的相对数值,如暴击率、闪避率
**章节来源**
- [HeroAttrs.ts](file://assets\script\game\common\config\HeroAttrs.ts#L142-L226)
## 架构概览
英雄属性系统采用分层架构设计,确保职责分离和模块化:
```mermaid
sequenceDiagram
participant Player as 玩家操作
participant Hero as Hero实体
participant Attrs as HeroAttrsComp
participant View as HeroViewComp
participant Buff as Buff系统
participant UI as UI组件
Player->>Hero : 创建英雄
Hero->>Attrs : hero_init()
Attrs->>Attrs : 初始化基础属性
Attrs->>Attrs : 初始化属性配置
Attrs->>Buff : initAttrs()
Note over Player,UI : 属性计算流程
Player->>Buff : 添加Buff
Buff->>Attrs : recalculateSingleAttr()
Attrs->>Attrs : 计算属性值
Attrs->>UI : 更新UI显示
Note over Player,UI : 属性更新流程
Player->>Attrs : 攻击状态变更
Attrs->>Attrs : is_atking=true
Attrs->>View : 触发攻击动画
View->>UI : 播放攻击动画
```
**图表来源**
- [Hero.ts](file://assets\script\game\hero\Hero.ts#L65-L99)
- [HeroAttrsComp.ts](file://assets\script\game\hero\HeroAttrsComp.ts#L165-L250)
## 详细组件分析
### HeroAttrs.ts - 属性配置核心
HeroAttrs.ts定义了完整的属性体系和配置机制
#### 属性枚举设计
系统定义了105种属性按逻辑分组排列
```mermaid
classDiagram
class Attrs {
+HP_MAX : 0
+MP_MAX : 1
+SHIELD_MAX : 2
+AP : 10
+MAP : 11
+DEF : 20
+MDEF : 21
+CRITICAL : 30
+CRITICAL_DMG : 31
+LIFESTEAL : 50
+SPEED : 63
+STRENGTH : 90
+INTELLIGENCE : 91
+AGILITY : 92
+SPIRIT : 93
+LUCK : 94
}
class BType {
+VALUE : 0
+RATIO : 1
}
class NeAttrs {
+IN_FROST : 0
+IN_STUN : 1
+IN_BURN : 2
+IN_POISON : 3
}
Attrs --> BType : "类型分类"
Attrs --> NeAttrs : "负面状态"
```
**图表来源**
- [HeroAttrs.ts](file://assets\script\game\common\config\HeroAttrs.ts#L10-L105)
- [HeroAttrs.ts](file://assets\script\game\common\config\HeroAttrs.ts#L8-L10)
#### 属性类型配置
系统通过AttrsType配置表明确区分属性类型
| 属性类型 | 数值型属性 | 百分比型属性 | 混合型属性 |
|---------|-----------|-------------|-----------|
| 基础生存 | HP_MAX, MP_MAX, SHIELD_MAX | HEAL_EFFECT | - |
| 攻击属性 | AP, MAP, DIS, AREA_OF_EFFECT, PIERCE | AS, SKILL_DURATION | - |
| 防御属性 | DEF, MDEF | DODGE, BLOCK, DAMAGE_REDUCTION, THORNS | - |
| 特殊效果 | - | LIFESTEAL, MANASTEAL, FREEZE_CHANCE | - |
#### 职业属性成长系统
系统实现了基于职业的属性成长机制:
```mermaid
flowchart TD
A[基础属性输入] --> B{职业类型}
B --> |战士| C[战士成长配置]
B --> |远程| D[远程成长配置]
B --> |法师| E[法师成长配置]
B --> |辅助| F[辅助成长配置]
B --> |刺客| G[刺客成长配置]
C --> H[计算属性增长]
D --> H
E --> H
F --> H
G --> H
H --> I[返回属性增长值]
style A fill:#e1f5fe
style I fill:#c8e6c9
```
**图表来源**
- [HeroAttrs.ts](file://assets\script\game\common\config\HeroAttrs.ts#L266-L439)
**章节来源**
- [HeroAttrs.ts](file://assets\script\game\common\config\HeroAttrs.ts#L106-L226)
- [HeroAttrs.ts](file://assets\script\game\common\config\HeroAttrs.ts#L266-L439)
### Hero.ts - 英雄实体管理
Hero.ts负责英雄实体的创建和基础属性初始化
#### 英雄初始化流程
```mermaid
sequenceDiagram
participant Client as 客户端
participant Hero as Hero实体
participant Model as HeroAttrsComp
participant View as HeroViewComp
Client->>Hero : load(pos, scale, uuid)
Hero->>Hero : 查找空闲槽位
Hero->>Hero : 加载英雄预制体
Hero->>Hero : 设置位置和缩放
Hero->>Hero : hero_init(uuid, node)
Hero->>Model : 初始化属性配置
Hero->>Model : 设置基础属性值
Hero->>Model : 初始化属性系统
Hero->>Model : 添加模型组件
Hero-->>Client : 英雄加载完成
```
**图表来源**
- [Hero.ts](file://assets\script\game\hero\Hero.ts#L40-L99)
#### 基础属性设置
hero_init方法完成了英雄基础属性的初始化
| 属性类型 | 设置方式 | 默认值来源 |
|---------|---------|-----------|
| 基础属性 | 直接赋值 | HeroInfo配置 |
| 属性映射 | getAttrs() | 初始化为0 |
| 负面状态 | getNeAttrs() | 初始化为0 |
| 技能列表 | 循环遍历 | 技能配置表 |
**章节来源**
- [Hero.ts](file://assets\script\game\hero\Hero.ts#L65-L99)
### HeroAttrsComp.ts - 属性计算与状态管理
HeroAttrsComp.ts是属性系统的核心计算引擎负责属性的动态计算和状态管理
#### 属性计算算法
系统实现了复杂的属性计算算法:
```mermaid
flowchart TD
A[属性计算请求] --> B[获取基础值]
B --> C[收集数值型Buff]
C --> D[收集百分比型Buff]
D --> E{属性类型判断}
E --> |百分比型| F[直接相加]
E --> |数值型| G[基础值×(1+百分比/100)+数值]
F --> H[属性值限制检查]
G --> H
H --> I{属性值验证}
I --> |超出范围| J[调整到合理值]
I --> |正常范围| K[更新属性值]
J --> K
K --> L[触发UI更新]
L --> M[完成计算]
style A fill:#e3f2fd
style M fill:#e8f5e8
```
**图表来源**
- [HeroAttrsComp.ts](file://assets\script\game\hero\HeroAttrsComp.ts#L254-L354)
#### 状态管理重构
根据最新代码重构,`is_atking`攻击状态已从视图层迁移至数据层:
```typescript
// HeroAttrsComp.ts - 数据层状态管理
export class HeroAttrsComp extends ecs.Comp {
// ... 其他属性
is_atking: boolean = false; // 是否正在攻击
is_stop: boolean = false; // 是否正在停止
// ... 其他状态
}
```
这一变更实现了状态管理的集中化符合ECS架构的最佳实践。
**章节来源**
- [HeroAttrsComp.ts](file://assets\script\game\hero\HeroAttrsComp.ts#L7-L380)
### HeroViewComp.ts - UI更新与动画控制
HeroViewComp.ts现在仅负责UI表现和动画控制不再管理攻击状态
#### UI更新机制
```mermaid
sequenceDiagram
participant Attr as 属性系统
participant View as HeroViewComp
participant Buff as BuffComp
participant UI as UI组件
Attr->>View : 属性值变更
View->>View : recalculateSingleAttr()
View->>Buff : hp_show/hp_mp_show
Buff->>UI : 更新进度条
Buff->>UI : 更新标签文本
UI->>UI : 动画效果展示
Note over Attr,UI : 实时更新流程
View->>Buff : show_shield
Buff->>UI : 更新护盾显示
UI->>UI : 护盾动画效果
Note over Attr,UI : 护盾更新流程
```
**图表来源**
- [HeroViewComp.ts](file://assets\script\game\hero\HeroViewComp.ts#L44-L80)
#### UI组件类型
HeroViewComp管理多种UI组件
| UI组件 | 功能 | 更新触发 |
|-------|------|---------|
| 血条 | 显示生命值 | hp_show |
| 能量条 | 显示魔法值 | mp_show |
| 护盾条 | 显示护盾值 | show_shield |
| 提示框 | 显示伤害数字 | tooltip |
| 状态图标 | 显示负面状态 | 状态切换 |
**章节来源**
- [HeroViewComp.ts](file://assets\script\game\hero\HeroViewComp.ts#L1-L80)
### Mon.ts - 怪物属性系统
Mon.ts继承了英雄的属性系统但针对怪物进行了优化
#### 怪物属性特点
| 属性类型 | 英雄 vs 怪物 | 设计差异 |
|---------|-------------|---------|
| 基础属性 | 多样化配置 | 固定基础值 |
| 成长属性 | 动态计算 | 预设固定值 |
| Buff系统 | 复杂计算 | 简化处理 |
| UI更新 | 实时同步 | 基础显示 |
**章节来源**
- [Mon.ts](file://assets\script\game\hero\Mon.ts#L87-L108)
## 依赖关系分析
英雄属性系统的依赖关系体现了清晰的分层架构:
```mermaid
graph TB
subgraph "配置层"
A[HeroAttrs.ts]
B[heroSet.ts]
C[GameEvent.ts]
end
subgraph "实体层"
D[Hero.ts]
E[HeroAttrsComp.ts]
F[HeroViewComp.ts]
end
subgraph "战斗层"
G[Mon.ts]
H[战斗系统]
end
A --> D
A --> E
B --> D
C --> E
D --> E
E --> F
G --> E
H --> E
style A fill:#e3f2fd
style D fill:#f3e5f5
style E fill:#e8f5e8
```
**图表来源**
- [HeroAttrs.ts](file://assets\script\game\common\config\HeroAttrs.ts#L1-L20)
- [Hero.ts](file://assets\script\game\hero\Hero.ts#L1-L20)
### 模块间通信
系统通过事件机制实现模块间的松耦合通信:
| 通信方式 | 使用场景 | 实现方式 |
|---------|---------|---------|
| 直接调用 | 属性计算 | 方法调用 |
| 事件分发 | 状态同步 | GameEvent |
| UI更新 | 实时反馈 | 组件回调 |
| 数据绑定 | 状态管理 | MVVM模式 |
**章节来源**
- [GameEvent.ts](file://assets\script\game\common\config\GameEvent.ts#L1-L70)
## 性能考虑
### 属性计算优化
系统采用了多种性能优化策略:
1. **延迟计算**:只有在属性值发生变化时才重新计算
2. **批量更新**同一帧内的多个属性变更只触发一次UI更新
3. **缓存机制**:缓存常用的属性计算结果
4. **增量更新**:只更新受影响的属性,而不是全部重新计算
### 内存管理
- 使用对象池管理Buff实例
- 及时清理过期的临时Buff
- 避免频繁的属性值分配和回收
### UI渲染优化
- 使用Tween动画实现平滑的属性变化
- 批量更新UI组件减少重绘次数
- 使用可视区域裁剪避免不必要的渲染
## 故障排除指南
### 常见问题及解决方案
#### 属性计算异常
**问题现象**:属性值显示不正确或计算错误
**可能原因**
- Buff配置错误
- 属性类型判断失误
- 基础值设置错误
**解决步骤**
1. 检查HeroAttrs.ts中的属性类型配置
2. 验证Buff的BType设置
3. 确认基础属性值的正确性
#### UI更新延迟
**问题现象**属性变化后UI没有及时更新
**可能原因**
- UI更新频率不足
- 属性变更事件未正确触发
- 组件生命周期问题
**解决步骤**
1. 检查update方法中的UI更新逻辑
2. 验证属性变更事件的分发
3. 确认组件的生命周期状态
#### 性能问题
**问题现象**:大量英雄同时战斗时出现卡顿
**可能原因**
- 属性计算过于频繁
- UI更新过于密集
- 内存泄漏
**解决步骤**
1. 优化属性计算的频率
2. 实施属性变更的批量处理
3. 检查内存使用情况
**章节来源**
- [HeroAttrsComp.ts](file://assets\script\game\hero\HeroAttrsComp.ts#L385-L425)
## 结论
英雄属性系统通过精心设计的分层架构,实现了复杂而高效的属性管理机制。系统的主要优势包括:
1. **模块化设计**:清晰的职责分离使得系统易于维护和扩展
2. **灵活的属性类型**:支持数值型和百分比型属性的混合计算
3. **强大的Buff系统**支持持久和临时Buff的叠加计算
4. **实时UI同步**:确保属性变化能够即时反映在用户界面上
5. **性能优化**:通过多种优化策略保证系统的流畅运行
**架构演进**:最新的代码重构将`is_atking`攻击状态从视图层迁移至数据层实现了状态管理的集中化。这一变更遵循了ECS架构的最佳实践提高了代码的可维护性和测试性。通过将数据状态与表现逻辑分离系统变得更加健壮和可扩展。
该系统为游戏提供了坚实的战斗基础,支持丰富的角色定制和战斗策略,是整个游戏体验的重要组成部分。随着游戏的发展,这套属性系统已经证明了其良好的扩展性和稳定性,能够适应未来更多的功能需求。