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

15 KiB
Raw Blame History

英雄属性系统

**本文档中引用的文件** - [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架构的最佳实践将数据状态与表现逻辑分离提高了系统的可维护性和扩展性。

项目结构

英雄属性系统的核心文件分布在以下目录结构中:

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
  • Hero.ts
  • HeroAttrsComp.ts

章节来源

  • HeroAttrs.ts
  • Hero.ts

核心组件

属性枚举系统

属性系统定义了完整的属性体系,涵盖战斗中的各个方面:

属性类别 属性数量 主要功能 示例属性
基础生存属性 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

架构概览

英雄属性系统采用分层架构设计,确保职责分离和模块化:

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
  • HeroAttrsComp.ts

详细组件分析

HeroAttrs.ts - 属性配置核心

HeroAttrs.ts定义了完整的属性体系和配置机制

属性枚举设计

系统定义了105种属性按逻辑分组排列

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
  • HeroAttrs.ts

属性类型配置

系统通过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 -

职业属性成长系统

系统实现了基于职业的属性成长机制:

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

章节来源

  • HeroAttrs.ts
  • HeroAttrs.ts

Hero.ts - 英雄实体管理

Hero.ts负责英雄实体的创建和基础属性初始化

英雄初始化流程

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

基础属性设置

hero_init方法完成了英雄基础属性的初始化

属性类型 设置方式 默认值来源
基础属性 直接赋值 HeroInfo配置
属性映射 getAttrs() 初始化为0
负面状态 getNeAttrs() 初始化为0
技能列表 循环遍历 技能配置表

章节来源

  • Hero.ts

HeroAttrsComp.ts - 属性计算与状态管理

HeroAttrsComp.ts是属性系统的核心计算引擎负责属性的动态计算和状态管理

属性计算算法

系统实现了复杂的属性计算算法:

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

状态管理重构

根据最新代码重构,is_atking攻击状态已从视图层迁移至数据层:

// HeroAttrsComp.ts - 数据层状态管理
export class HeroAttrsComp extends ecs.Comp {
    // ... 其他属性
    is_atking: boolean = false;  // 是否正在攻击
    is_stop: boolean = false;    // 是否正在停止
    // ... 其他状态
}

这一变更实现了状态管理的集中化符合ECS架构的最佳实践。

章节来源

  • HeroAttrsComp.ts

HeroViewComp.ts - UI更新与动画控制

HeroViewComp.ts现在仅负责UI表现和动画控制不再管理攻击状态

UI更新机制

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

UI组件类型

HeroViewComp管理多种UI组件

UI组件 功能 更新触发
血条 显示生命值 hp_show
能量条 显示魔法值 mp_show
护盾条 显示护盾值 show_shield
提示框 显示伤害数字 tooltip
状态图标 显示负面状态 状态切换

章节来源

  • HeroViewComp.ts

Mon.ts - 怪物属性系统

Mon.ts继承了英雄的属性系统但针对怪物进行了优化

怪物属性特点

属性类型 英雄 vs 怪物 设计差异
基础属性 多样化配置 固定基础值
成长属性 动态计算 预设固定值
Buff系统 复杂计算 简化处理
UI更新 实时同步 基础显示

章节来源

  • Mon.ts

依赖关系分析

英雄属性系统的依赖关系体现了清晰的分层架构:

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
  • Hero.ts

模块间通信

系统通过事件机制实现模块间的松耦合通信:

通信方式 使用场景 实现方式
直接调用 属性计算 方法调用
事件分发 状态同步 GameEvent
UI更新 实时反馈 组件回调
数据绑定 状态管理 MVVM模式

章节来源

  • GameEvent.ts

性能考虑

属性计算优化

系统采用了多种性能优化策略:

  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

结论

英雄属性系统通过精心设计的分层架构,实现了复杂而高效的属性管理机制。系统的主要优势包括:

  1. 模块化设计:清晰的职责分离使得系统易于维护和扩展
  2. 灵活的属性类型:支持数值型和百分比型属性的混合计算
  3. 强大的Buff系统支持持久和临时Buff的叠加计算
  4. 实时UI同步:确保属性变化能够即时反映在用户界面上
  5. 性能优化:通过多种优化策略保证系统的流畅运行

架构演进:最新的代码重构将is_atking攻击状态从视图层迁移至数据层实现了状态管理的集中化。这一变更遵循了ECS架构的最佳实践提高了代码的可维护性和测试性。通过将数据状态与表现逻辑分离系统变得更加健壮和可扩展。

该系统为游戏提供了坚实的战斗基础,支持丰富的角色定制和战斗策略,是整个游戏体验的重要组成部分。随着游戏的发展,这套属性系统已经证明了其良好的扩展性和稳定性,能够适应未来更多的功能需求。