# 英雄属性系统 **本文档中引用的文件** - [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) - *定义了游戏事件系统* ## 更新摘要 **主要变更** - **架构重构**:将`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
属性枚举与配置] B[heroSet.ts
英雄数据配置] C[GameEvent.ts
事件系统] end subgraph "实体管理层" D[Hero.ts
英雄实体] E[HeroAttrsComp.ts
属性组件] F[HeroViewComp.ts
视图组件] end subgraph "战斗系统" G[Mon.ts
怪物系统] H[BuffComp.ts
缓冲组件] 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架构的最佳实践,提高了代码的可维护性和测试性。通过将数据状态与表现逻辑分离,系统变得更加健壮和可扩展。 该系统为游戏提供了坚实的战斗基础,支持丰富的角色定制和战斗策略,是整个游戏体验的重要组成部分。随着游戏的发展,这套属性系统已经证明了其良好的扩展性和稳定性,能够适应未来更多的功能需求。