581 lines
16 KiB
Markdown
581 lines
16 KiB
Markdown
# 天赋系统
|
||
|
||
<cite>
|
||
**本文档中引用的文件**
|
||
- [TalSet.ts](file://assets/script/game/common/config/TalSet.ts)
|
||
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts)
|
||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts)
|
||
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts)
|
||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts)
|
||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts)
|
||
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts)
|
||
</cite>
|
||
|
||
## 目录
|
||
1. [简介](#简介)
|
||
2. [系统架构](#系统架构)
|
||
3. [天赋配置结构](#天赋配置结构)
|
||
4. [天赋组件系统](#天赋组件系统)
|
||
5. [天赋触发机制](#天赋触发机制)
|
||
6. [天赋与系统交互](#天赋与系统交互)
|
||
7. [扩展新天赋类型](#扩展新天赋类型)
|
||
8. [实现示例](#实现示例)
|
||
9. [性能优化](#性能优化)
|
||
10. [总结](#总结)
|
||
|
||
## 简介
|
||
|
||
天赋系统是游戏中的核心成长机制之一,为英雄提供独特的特殊能力和特性。该系统采用配置驱动的方式,通过精心设计的数据结构和组件架构,实现了灵活的天赋配置、智能的触发机制和高效的性能表现。
|
||
|
||
天赋系统的主要特点包括:
|
||
- **多样化触发条件**:支持等级、行为计数、受伤次数等多种触发方式
|
||
- **丰富的效果类型**:涵盖属性修改、技能触发、天赋增强等多重效果
|
||
- **智能堆叠机制**:支持效果堆叠和最大层数限制
|
||
- **无缝集成**:与属性系统、技能系统深度集成,形成完整的成长体系
|
||
|
||
## 系统架构
|
||
|
||
天赋系统采用模块化的架构设计,主要由以下几个核心组件构成:
|
||
|
||
```mermaid
|
||
graph TB
|
||
subgraph "配置层"
|
||
TalSet[TalSet.ts<br/>天赋配置文件]
|
||
HeroSet[heroSet.ts<br/>英雄配置]
|
||
SkillSet[SkillSet.ts<br/>技能配置]
|
||
end
|
||
subgraph "组件层"
|
||
TalComp[TalComp.ts<br/>天赋组件]
|
||
HeroView[HeroViewComp.ts<br/>英雄视图组件]
|
||
SkillCon[SkillConComp.ts<br/>技能控制组件]
|
||
end
|
||
subgraph "系统层"
|
||
AttrSys[属性系统]
|
||
BuffSys[Buff系统]
|
||
ECS[ECS架构]
|
||
end
|
||
TalSet --> TalComp
|
||
HeroSet --> TalComp
|
||
SkillSet --> TalComp
|
||
TalComp --> HeroView
|
||
TalComp --> SkillCon
|
||
HeroView --> AttrSys
|
||
HeroView --> BuffSys
|
||
ECS --> TalComp
|
||
```
|
||
|
||
**图表来源**
|
||
- [TalSet.ts](file://assets/script/game/common/config/TalSet.ts#L1-L116)
|
||
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L1-L171)
|
||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L140-L160)
|
||
|
||
**章节来源**
|
||
- [TalSet.ts](file://assets/script/game/common/config/TalSet.ts#L1-L116)
|
||
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L1-L171)
|
||
|
||
## 天赋配置结构
|
||
|
||
### 天赋类型枚举
|
||
|
||
天赋系统定义了七种基本触发类型,每种类型对应不同的触发条件:
|
||
|
||
```mermaid
|
||
classDiagram
|
||
class TalType {
|
||
+LEVEL : 1
|
||
+LEVEL_UP : 2
|
||
+ACTION_COUNT : 3
|
||
+SKILL_COUNT : 4
|
||
+DAMAGE_COUNT : 5
|
||
+INIT : 6
|
||
+DEAD : 7
|
||
}
|
||
class TalEType {
|
||
+ATTRS : 1
|
||
+SKILL : 2
|
||
+SKILL_MORE : 3
|
||
}
|
||
class ItalConf {
|
||
+uuid : number
|
||
+name : string
|
||
+desc : string
|
||
+type : TalType
|
||
+triggerType : TalEType
|
||
+chance : number
|
||
+t_value : number
|
||
+e_value : number
|
||
+e_name : number
|
||
+e_type : BType
|
||
+e_scaling : number
|
||
+e_count : number
|
||
+stackable : boolean
|
||
+maxStack : number
|
||
}
|
||
TalType --> ItalConf
|
||
TalEType --> ItalConf
|
||
```
|
||
|
||
**图表来源**
|
||
- [TalSet.ts](file://assets/script/game/common/config/TalSet.ts#L10-L35)
|
||
|
||
### 天赋配置表结构
|
||
|
||
天赋配置采用紧凑的二维表格式,每行包含注释和配置对象:
|
||
|
||
| 配置项 | 类型 | 描述 | 示例 |
|
||
|--------|------|------|------|
|
||
| uuid | number | 天赋唯一标识符 | 7001 |
|
||
| name | string | 天赋名称 | "剑意提升" |
|
||
| desc | string | 天赋描述 | "每升5级,攻击力增加10%" |
|
||
| type | TalType | 触发类型 | LEVEL_UP |
|
||
| triggerType | TalEType | 效果类型 | ATTRS |
|
||
| chance | number | 触发概率 | 100 |
|
||
| t_value | number | 触发阈值 | 5 |
|
||
| e_value | number | 效果值 | 0.10 |
|
||
| e_name | number | 效果属性类型 | Attrs.AP |
|
||
| e_type | BType | 效果类型 | RATIO |
|
||
| e_scaling | number | 缩放系数 | 1 |
|
||
| e_count | number | 触发次数 | 1 |
|
||
| stackable | boolean | 是否可堆叠 | true |
|
||
| maxStack | number | 最大堆叠层数 | 10 |
|
||
|
||
### 天赋树结构
|
||
|
||
天赋树按照英雄类型进行分类,每个英雄可以拥有多个天赋:
|
||
|
||
```mermaid
|
||
graph TD
|
||
subgraph "刘邦 - 战士"
|
||
L1[剑意提升<br/>每5级+10%攻击力]
|
||
L2[霸王之威<br/>初始+100生命值]
|
||
L3[离骚诗韵<br/>每8次攻击触发技能]
|
||
end
|
||
subgraph "赵武灵王 - 远程"
|
||
Z1[胡服骑射<br/>每3级+5%攻击速度]
|
||
end
|
||
subgraph "张良 - 法师"
|
||
Z2[运筹帷幄<br/>每4级+8%魔法攻击力]
|
||
end
|
||
subgraph "萧何 - 辅助"
|
||
X1[后勤保障<br/>每6级+3生命回复]
|
||
end
|
||
L1 --> L2
|
||
L1 --> L3
|
||
Z1 --> Z2
|
||
Z2 --> X1
|
||
```
|
||
|
||
**图表来源**
|
||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L60-L120)
|
||
- [TalSet.ts](file://assets/script/game/common/config/TalSet.ts#L75-L115)
|
||
|
||
**章节来源**
|
||
- [TalSet.ts](file://assets/script/game/common/config/TalSet.ts#L10-L116)
|
||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L60-L120)
|
||
|
||
## 天赋组件系统
|
||
|
||
### 组件架构设计
|
||
|
||
天赋组件采用ECS架构模式,继承自CCComp基类,负责管理英雄的天赋系统:
|
||
|
||
```mermaid
|
||
classDiagram
|
||
class TalComp {
|
||
-heroView : any
|
||
-skillCon : any
|
||
-heroUuid : number
|
||
-FStats : FightStats
|
||
-activeTals : TalEffect[]
|
||
-talEffects : ItalConf[]
|
||
-isInitialized : boolean
|
||
+start()
|
||
+initializeTalents()
|
||
+getHeroTalents()
|
||
+doTalEffect(tal)
|
||
+checkTrigger(tal)
|
||
+checkHasTal(type)
|
||
+onAction()
|
||
+onSkillUse()
|
||
+onDamageTaken()
|
||
+onLevelUp(level)
|
||
+onDeath()
|
||
+reset()
|
||
}
|
||
class FightStats {
|
||
+aCount : number
|
||
+sCount : number
|
||
+dCount : number
|
||
+level : number
|
||
}
|
||
class TalEffect {
|
||
+uuid : number
|
||
+stack : number
|
||
+lTTime : number
|
||
}
|
||
TalComp --> FightStats
|
||
TalComp --> TalEffect
|
||
```
|
||
|
||
**图表来源**
|
||
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L28-L171)
|
||
|
||
### 组件生命周期
|
||
|
||
天赋组件的生命周期管理确保了正确的初始化和状态维护:
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Node as 节点
|
||
participant TalComp as 天赋组件
|
||
participant HeroView as 英雄视图
|
||
participant HeroInfo as 英雄配置
|
||
Node->>TalComp : start()
|
||
TalComp->>HeroView : 获取组件引用
|
||
TalComp->>HeroView : 获取英雄UUID
|
||
TalComp->>HeroInfo : 查询英雄天赋
|
||
HeroInfo-->>TalComp : 返回天赋配置
|
||
TalComp->>TalComp : 初始化触发统计
|
||
TalComp->>TalComp : 设置初始化标志
|
||
TalComp-->>Node : 初始化完成
|
||
```
|
||
|
||
**图表来源**
|
||
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L59-L75)
|
||
|
||
**章节来源**
|
||
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L28-L171)
|
||
|
||
## 天赋触发机制
|
||
|
||
### 触发条件检测
|
||
|
||
天赋系统实现了智能的触发条件检测机制,支持多种触发类型的精确匹配:
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
Start([开始触发检测]) --> GetType{获取天赋类型}
|
||
GetType --> Level{LEVEL?}
|
||
GetType --> LevelUp{LEVEL_UP?}
|
||
GetType --> Action{ACTION_COUNT?}
|
||
GetType --> Skill{SKILL_COUNT?}
|
||
GetType --> Damage{DAMAGE_COUNT?}
|
||
GetType --> Init{INIT?}
|
||
GetType --> Dead{DEAD?}
|
||
Level --> LevelCheck{等级 >= 阈值?}
|
||
LevelUp --> LevelUpCheck{等级 % 阈值 == 0?}
|
||
Action --> ActionCheck{攻击次数 >= 阈值?}
|
||
Skill --> SkillCheck{技能使用次数 >= 阈值?}
|
||
Damage --> DamageCheck{受伤次数 >= 阈值?}
|
||
Init --> True[返回true]
|
||
Dead --> False[返回false]
|
||
LevelCheck --> |是| Trigger[触发天赋]
|
||
LevelCheck --> |否| NoTrigger[不触发]
|
||
LevelUpCheck --> |是| Trigger
|
||
LevelUpCheck --> |否| NoTrigger
|
||
ActionCheck --> |是| Trigger
|
||
ActionCheck --> |否| NoTrigger
|
||
SkillCheck --> |是| Trigger
|
||
SkillCheck --> |否| NoTrigger
|
||
DamageCheck --> |是| Trigger
|
||
DamageCheck --> |否| NoTrigger
|
||
Trigger --> Effect[执行天赋效果]
|
||
NoTrigger --> End([结束])
|
||
Effect --> End
|
||
True --> End
|
||
False --> End
|
||
```
|
||
|
||
**图表来源**
|
||
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L105-L125)
|
||
|
||
### 效果执行机制
|
||
|
||
天赋效果的执行遵循统一的处理流程,根据效果类型调用相应的处理函数:
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant TalComp as 天赋组件
|
||
participant HeroView as 英雄视图
|
||
participant SkillCon as 技能控制
|
||
participant BuffSys as Buff系统
|
||
TalComp->>TalComp : 检查天赋效果类型
|
||
alt 属性修改 (ATTRS)
|
||
TalComp->>BuffSys : 创建Buff配置
|
||
TalComp->>HeroView : addBuff(buffConf)
|
||
HeroView->>HeroView : 应用属性加成
|
||
else 技能触发 (SKILL)
|
||
TalComp->>SkillCon : doSkill(skill, false, 0)
|
||
SkillCon->>SkillCon : 执行技能逻辑
|
||
else 天赋增强 (SKILL_MORE)
|
||
TalComp->>HeroView : 添加新技能
|
||
HeroView->>HeroView : 更新技能列表
|
||
end
|
||
```
|
||
|
||
**图表来源**
|
||
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L85-L105)
|
||
|
||
**章节来源**
|
||
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L105-L171)
|
||
|
||
## 天赋与系统交互
|
||
|
||
### 与属性系统的集成
|
||
|
||
天赋系统与属性系统深度集成,通过Buff机制实现属性加成:
|
||
|
||
```mermaid
|
||
graph LR
|
||
subgraph "天赋系统"
|
||
TalConf[天赋配置]
|
||
TalEffect[天赋效果]
|
||
end
|
||
subgraph "属性系统"
|
||
AttrCalc[属性计算]
|
||
BuffMgmt[Buff管理]
|
||
AttrApply[属性应用]
|
||
end
|
||
subgraph "英雄实体"
|
||
HeroAttrs[英雄属性]
|
||
BaseAttrs[基础属性]
|
||
end
|
||
TalConf --> TalEffect
|
||
TalEffect --> BuffMgmt
|
||
BuffMgmt --> AttrCalc
|
||
AttrCalc --> AttrApply
|
||
AttrApply --> HeroAttrs
|
||
HeroAttrs --> BaseAttrs
|
||
```
|
||
|
||
**图表来源**
|
||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L180-L220)
|
||
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L85-L95)
|
||
|
||
### 与技能系统的交互
|
||
|
||
天赋系统与技能系统协同工作,支持技能触发和技能增强:
|
||
|
||
| 交互类型 | 天赋效果 | 技能系统响应 | 实现方式 |
|
||
|----------|----------|--------------|----------|
|
||
| 技能触发 | 触发指定技能 | 执行技能逻辑 | SkillCon.doSkill() |
|
||
| 技能增强 | 增加额外技能 | 更新技能列表 | HeroView.skills.push() |
|
||
| 技能冷却 | 影响技能冷却 | 调整CD计算 | 技能系统集成 |
|
||
|
||
**章节来源**
|
||
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L95-L105)
|
||
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L28-L40)
|
||
|
||
## 扩展新天赋类型
|
||
|
||
### 新增触发类型
|
||
|
||
要扩展新的触发类型,需要修改以下部分:
|
||
|
||
1. **添加新的触发类型枚举**:
|
||
```typescript
|
||
export enum TalType {
|
||
// 现有类型...
|
||
CUSTOM_TRIGGER = 8, // 新增自定义触发类型
|
||
}
|
||
```
|
||
|
||
2. **更新触发检测逻辑**:
|
||
```typescript
|
||
case TalType.CUSTOM_TRIGGER:
|
||
return this.customTriggerCondition();
|
||
```
|
||
|
||
3. **实现自定义触发条件**:
|
||
```typescript
|
||
private customTriggerCondition(): boolean {
|
||
// 实现自定义触发逻辑
|
||
return customConditionMet;
|
||
}
|
||
```
|
||
|
||
### 新增效果类型
|
||
|
||
扩展新的效果类型需要:
|
||
|
||
1. **添加效果类型枚举**:
|
||
```typescript
|
||
export enum TalEType {
|
||
// 现有效果类型...
|
||
NEW_EFFECT = 4, // 新增效果类型
|
||
}
|
||
```
|
||
|
||
2. **更新效果处理逻辑**:
|
||
```typescript
|
||
if (tal.triggerType == TalEType.NEW_EFFECT) {
|
||
this.handleNewEffect(tal);
|
||
}
|
||
```
|
||
|
||
3. **实现效果处理函数**:
|
||
```typescript
|
||
private handleNewEffect(tal: ItalConf): void {
|
||
// 实现新效果处理逻辑
|
||
}
|
||
```
|
||
|
||
### 配置新天赋
|
||
|
||
新增天赋的配置格式保持一致:
|
||
|
||
```typescript
|
||
// 新天赋 - 英雄名称 | 触发条件 | 效果描述
|
||
newTalentId: {uuid: newTalentId, name: "新天赋名称", desc: "效果描述",
|
||
type: TalType.CUSTOM_TRIGGER, triggerType: TalEType.NEW_EFFECT,
|
||
chance: 100, t_value: threshold, e_value: effectValue,
|
||
e_name: specialValue, e_type: BType.VALUE, e_scaling: 1,
|
||
e_count: 1, stackable: true, maxStack: 5},
|
||
```
|
||
|
||
## 实现示例
|
||
|
||
### 天赋选择界面实现
|
||
|
||
天赋选择界面需要与后端逻辑紧密配合:
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant UI as 界面组件
|
||
participant TalentMgr as 天赋管理器
|
||
participant Backend as 后端服务
|
||
participant Hero as 英雄实体
|
||
UI->>TalentMgr : 请求可用天赋
|
||
TalentMgr->>Backend : 查询天赋数据
|
||
Backend-->>TalentMgr : 返回天赋列表
|
||
TalentMgr-->>UI : 显示天赋选项
|
||
UI->>TalentMgr : 选择天赋
|
||
TalentMgr->>Backend : 提交天赋选择
|
||
Backend->>Backend : 验证选择合法性
|
||
Backend->>Hero : 应用天赋效果
|
||
Hero->>Hero : 更新属性和状态
|
||
Backend-->>TalentMgr : 确认选择成功
|
||
TalentMgr-->>UI : 更新界面状态
|
||
```
|
||
|
||
### 天赋点分配系统
|
||
|
||
天赋点分配系统的核心实现:
|
||
|
||
```typescript
|
||
// 天赋点分配接口
|
||
interface TalentPointAllocation {
|
||
heroUuid: number;
|
||
selectedTalents: number[];
|
||
pointsSpent: number;
|
||
validateAllocation(): boolean;
|
||
applyAllocation(): void;
|
||
}
|
||
|
||
// 天赋点分配验证逻辑
|
||
class TalentValidator {
|
||
private validateTalentCompatibility(talents: number[]): boolean {
|
||
// 验证天赋兼容性
|
||
return this.checkMutualExclusivity(talents) &&
|
||
this.validatePrerequisites(talents);
|
||
}
|
||
|
||
private checkMutualExclusivity(talents: number[]): boolean {
|
||
// 检查互斥天赋冲突
|
||
return !this.hasConflictingTalents(talents);
|
||
}
|
||
}
|
||
```
|
||
|
||
### 状态持久化
|
||
|
||
天赋系统的状态持久化确保玩家进度的安全存储:
|
||
|
||
```mermaid
|
||
graph TB
|
||
subgraph "客户端"
|
||
LocalStorage[本地存储]
|
||
Cache[内存缓存]
|
||
end
|
||
subgraph "服务器"
|
||
Database[(数据库)]
|
||
API[后端API]
|
||
end
|
||
subgraph "同步机制"
|
||
SyncLogic[同步逻辑]
|
||
ConflictResolve[冲突解决]
|
||
end
|
||
Cache --> SyncLogic
|
||
SyncLogic --> API
|
||
API --> Database
|
||
Database --> API
|
||
API --> SyncLogic
|
||
SyncLogic --> ConflictResolve
|
||
ConflictResolve --> Cache
|
||
LocalStorage --> Cache
|
||
Cache --> LocalStorage
|
||
```
|
||
|
||
## 性能优化
|
||
|
||
### 触发检测优化
|
||
|
||
天赋系统采用多种优化策略提升性能:
|
||
|
||
1. **延迟初始化**:只在需要时初始化天赋组件
|
||
2. **触发条件缓存**:缓存频繁检查的触发条件
|
||
3. **批量处理**:将多个天赋效果合并处理
|
||
|
||
### 内存管理
|
||
|
||
```typescript
|
||
// 内存优化策略
|
||
class TalentMemoryManager {
|
||
private static readonly MAX_ACTIVE_TALENTS = 20;
|
||
|
||
cleanupInactiveTalents(): void {
|
||
if (this.activeTals.length > TalentMemoryManager.MAX_ACTIVE_TALENTS) {
|
||
this.activeTals.sort((a, b) => b.lTTime - a.lTTime);
|
||
this.activeTals = this.activeTals.slice(0, TalentMemoryManager.MAX_ACTIVE_TALENTS);
|
||
}
|
||
}
|
||
|
||
recycleTalentInstances(): void {
|
||
// 回收不再使用的天赋实例
|
||
this.activeTals = this.activeTals.filter(tal => tal.stack > 0);
|
||
}
|
||
}
|
||
```
|
||
|
||
### 计算优化
|
||
|
||
天赋系统的计算优化主要体现在属性重计算的频率控制上:
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
AttrChange[属性变化] --> CheckFreq{检查计算频率}
|
||
CheckFreq --> |高频变化| BatchCalc[批量计算]
|
||
CheckFreq --> |低频变化| ImmediateCalc[立即计算]
|
||
BatchCalc --> DelayedRecalc[延迟重计算]
|
||
ImmediateCalc --> DirectUpdate[直接更新]
|
||
DelayedRecalc --> FinalAttr[最终属性值]
|
||
DirectUpdate --> FinalAttr
|
||
```
|
||
|
||
## 总结
|
||
|
||
天赋系统作为游戏成长机制的核心组成部分,通过精心设计的架构和灵活的配置系统,为玩家提供了丰富而深入的游戏体验。系统的主要优势包括:
|
||
|
||
1. **高度可配置性**:通过配置文件实现天赋的灵活定义和调整
|
||
2. **智能触发机制**:支持多种触发条件和精确的效果执行
|
||
3. **系统集成度高**:与属性系统、技能系统无缝协作
|
||
4. **良好的扩展性**:易于添加新的天赋类型和效果
|
||
5. **优秀的性能表现**:通过多种优化策略确保流畅的游戏体验
|
||
|
||
未来的改进方向包括:
|
||
- 增强天赋树的可视化展示
|
||
- 实现天赋组合的动态平衡
|
||
- 添加天赋效果的实时预览功能
|
||
- 优化大量天赋场景下的性能表现
|
||
|
||
天赋系统的设计理念体现了游戏开发中的模块化思维和配置驱动开发的优势,为构建复杂的游戏成长体系提供了可靠的技术基础。 |