501 lines
14 KiB
Markdown
501 lines
14 KiB
Markdown
# 英雄属性系统
|
||
|
||
<cite>
|
||
**本文档中引用的文件**
|
||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts)
|
||
- [Hero.ts](file://assets/script/game/hero/Hero.ts)
|
||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts)
|
||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts)
|
||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts)
|
||
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts)
|
||
- [Mon.ts](file://assets/script/game/hero/Mon.ts)
|
||
</cite>
|
||
|
||
## 目录
|
||
1. [简介](#简介)
|
||
2. [项目结构](#项目结构)
|
||
3. [核心组件](#核心组件)
|
||
4. [架构概览](#架构概览)
|
||
5. [详细组件分析](#详细组件分析)
|
||
6. [依赖关系分析](#依赖关系分析)
|
||
7. [性能考虑](#性能考虑)
|
||
8. [故障排除指南](#故障排除指南)
|
||
9. [结论](#结论)
|
||
|
||
## 简介
|
||
|
||
英雄属性系统是游戏《heroes》的核心战斗机制之一,负责管理英雄的基础属性、成长属性、动态计算以及战斗中的实时更新。该系统采用模块化设计,通过HeroAttrs.ts定义属性枚举和配置,Hero.ts实现英雄实体管理,HeroViewComp.ts处理属性计算和UI更新,形成了完整的属性管理体系。
|
||
|
||
系统支持多种属性类型,包括基础生存属性、攻击属性、防御属性、特殊效果属性等,每种属性都有明确的数值型或百分比型分类。通过Buff系统实现属性的动态叠加和计算,确保战斗中的属性变化能够实时反映在UI界面中。
|
||
|
||
## 项目结构
|
||
|
||
英雄属性系统的核心文件分布在以下目录结构中:
|
||
|
||
```mermaid
|
||
graph TB
|
||
subgraph "属性配置层"
|
||
A[HeroAttrs.ts<br/>属性枚举与配置]
|
||
B[heroSet.ts<br/>英雄数据配置]
|
||
C[GameEvent.ts<br/>事件系统]
|
||
end
|
||
subgraph "实体管理层"
|
||
D[Hero.ts<br/>英雄实体]
|
||
E[HeroViewComp.ts<br/>视图组件]
|
||
F[BuffComp.ts<br/>缓冲组件]
|
||
end
|
||
subgraph "战斗系统"
|
||
G[Mon.ts<br/>怪物系统]
|
||
H[BuffComp.ts<br/>UI组件]
|
||
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)
|
||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.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 View as HeroViewComp
|
||
participant Buff as Buff系统
|
||
participant UI as UI组件
|
||
Player->>Hero : 创建英雄
|
||
Hero->>View : hero_init()
|
||
View->>View : 初始化基础属性
|
||
View->>View : 初始化属性配置
|
||
View->>Buff : initAttrs()
|
||
Note over Player,UI : 属性计算流程
|
||
Player->>Buff : 添加Buff
|
||
Buff->>View : recalculateSingleAttr()
|
||
View->>View : 计算属性值
|
||
View->>UI : 更新UI显示
|
||
Note over Player,UI : 属性更新流程
|
||
Player->>Buff : 属性变更
|
||
Buff->>View : 触发重新计算
|
||
View->>UI : 实时更新显示
|
||
```
|
||
|
||
**图表来源**
|
||
- [Hero.ts](file://assets/script/game/hero/Hero.ts#L65-L99)
|
||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.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 HeroModelComp
|
||
participant View as HeroViewComp
|
||
Client->>Hero : load(pos, scale, uuid)
|
||
Hero->>Hero : 查找空闲槽位
|
||
Hero->>Hero : 加载英雄预制体
|
||
Hero->>Hero : 设置位置和缩放
|
||
Hero->>Hero : hero_init(uuid, node)
|
||
Hero->>View : 初始化属性配置
|
||
Hero->>View : 设置基础属性值
|
||
Hero->>View : 初始化属性系统
|
||
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)
|
||
|
||
### HeroViewComp.ts - 属性计算与UI更新
|
||
|
||
HeroViewComp.ts是属性系统的核心计算引擎,负责属性的动态计算和UI更新:
|
||
|
||
#### 属性计算算法
|
||
|
||
系统实现了复杂的属性计算算法:
|
||
|
||
```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
|
||
```
|
||
|
||
**图表来源**
|
||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L254-L354)
|
||
|
||
#### Buff系统设计
|
||
|
||
Buff系统支持持久和临时两种类型的Buff叠加:
|
||
|
||
| Buff类型 | 存储位置 | 生命周期 | 计算方式 |
|
||
|---------|---------|---------|---------|
|
||
| 持久Buff | BUFFS | 手动清除 | 直接累加 |
|
||
| 临时Buff | BUFFS_TEMP | 时间到期自动清除 | 时间递减计算 |
|
||
| 增益Buff | 正数值 | - | 属性提升 |
|
||
| 减益Buff | 负数值 | - | 属性削弱 |
|
||
|
||
#### 属性计算公式
|
||
|
||
系统根据不同属性类型采用不同的计算公式:
|
||
|
||
**百分比型属性公式**:
|
||
```
|
||
最终值 = 基础值 + 所有数值型Buff之和 + 所有百分比Buff之和
|
||
```
|
||
|
||
**数值型属性公式**:
|
||
```
|
||
最终值 = (基础值 + 所有数值型Buff之和) × (1 + 所有百分比Buff之和/100)
|
||
```
|
||
|
||
**章节来源**
|
||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L165-L354)
|
||
|
||
### BuffComp.ts - UI组件集成
|
||
|
||
BuffComp.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 : 护盾更新流程
|
||
```
|
||
|
||
**图表来源**
|
||
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts#L44-L80)
|
||
|
||
#### UI组件类型
|
||
|
||
BuffComp管理多种UI组件:
|
||
|
||
| UI组件 | 功能 | 更新触发 |
|
||
|-------|------|---------|
|
||
| 血条 | 显示生命值 | hp_show |
|
||
| 能量条 | 显示魔法值 | mp_show |
|
||
| 护盾条 | 显示护盾值 | show_shield |
|
||
| 提示框 | 显示伤害数字 | tooltip |
|
||
| 状态图标 | 显示负面状态 | 状态切换 |
|
||
|
||
**章节来源**
|
||
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.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[HeroViewComp.ts]
|
||
F[BuffComp.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. 检查内存使用情况
|
||
|
||
**章节来源**
|
||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L385-L425)
|
||
|
||
## 结论
|
||
|
||
英雄属性系统通过精心设计的分层架构,实现了复杂而高效的属性管理机制。系统的主要优势包括:
|
||
|
||
1. **模块化设计**:清晰的职责分离使得系统易于维护和扩展
|
||
2. **灵活的属性类型**:支持数值型和百分比型属性的混合计算
|
||
3. **强大的Buff系统**:支持持久和临时Buff的叠加计算
|
||
4. **实时UI同步**:确保属性变化能够即时反映在用户界面上
|
||
5. **性能优化**:通过多种优化策略保证系统的流畅运行
|
||
|
||
该系统为游戏提供了坚实的战斗基础,支持丰富的角色定制和战斗策略,是整个游戏体验的重要组成部分。随着游戏的发展,这套属性系统已经证明了其良好的扩展性和稳定性,能够适应未来更多的功能需求。 |