refactor(skill): 重构技能组件目录结构并重命名施法请求组件
将技能相关组件从hero目录移动到skill目录 将CastSkillRequestComp重命名为CSRequestComp 更新相关引用和文档说明
This commit is contained in:
@@ -18,7 +18,7 @@
|
|||||||
## 更新摘要
|
## 更新摘要
|
||||||
**已做更改**
|
**已做更改**
|
||||||
- 更新了组件注册机制部分,以反映在多个系统中添加ECS注册装饰器的更改
|
- 更新了组件注册机制部分,以反映在多个系统中添加ECS注册装饰器的更改
|
||||||
- 添加了关于技能系统的新部分,包括CastSkillRequestComp、SkillCastSystem、SkillCDSystem和SkillAutocastSystem
|
- 添加了关于技能系统的新部分,包括CSRequestComp、SkillCastSystem、SkillCDSystem和SkillAutocastSystem
|
||||||
- 更新了实际案例分析,以包含新的技能系统实现
|
- 更新了实际案例分析,以包含新的技能系统实现
|
||||||
- 在扩展开发指南中添加了新的系统接口示例
|
- 在扩展开发指南中添加了新的系统接口示例
|
||||||
- 更新了文档来源以包含新分析的文件
|
- 更新了文档来源以包含新分析的文件
|
||||||
@@ -355,7 +355,7 @@ HeroViewComp实现了复杂的BUFF/DEBUFF管理系统:
|
|||||||
|
|
||||||
```mermaid
|
```mermaid
|
||||||
classDiagram
|
classDiagram
|
||||||
class CastSkillRequestComp {
|
class CSRequestComp {
|
||||||
+number skillIndex
|
+number skillIndex
|
||||||
+Vec3[] targetPositions
|
+Vec3[] targetPositions
|
||||||
+reset() void
|
+reset() void
|
||||||
@@ -424,14 +424,14 @@ participant Cast as SkillCastSystem
|
|||||||
participant Entity as Entity
|
participant Entity as Entity
|
||||||
participant Skill as SkillEnt
|
participant Skill as SkillEnt
|
||||||
Auto->>Entity : update()
|
Auto->>Entity : update()
|
||||||
Auto->>Entity : add(CastSkillRequestComp)
|
Auto->>Entity : add(CSRequestComp)
|
||||||
Cast->>Entity : entityEnter()
|
Cast->>Entity : entityEnter()
|
||||||
Cast->>Entity : checkCastConditions()
|
Cast->>Entity : checkCastConditions()
|
||||||
Cast->>Entity : executeCast()
|
Cast->>Entity : executeCast()
|
||||||
Cast->>Entity : playSkillEffect()
|
Cast->>Entity : playSkillEffect()
|
||||||
Cast->>Cast : createSkillEntity()
|
Cast->>Cast : createSkillEntity()
|
||||||
Cast->>Skill : load()
|
Cast->>Skill : load()
|
||||||
Cast->>Entity : remove(CastSkillRequestComp)
|
Cast->>Entity : remove(CSRequestComp)
|
||||||
```
|
```
|
||||||
|
|
||||||
**图表来源**
|
**图表来源**
|
||||||
@@ -447,7 +447,7 @@ Cast->>Entity : remove(CastSkillRequestComp)
|
|||||||
- `SkillCDSystem`:负责管理"技能冷却"
|
- `SkillCDSystem`:负责管理"技能冷却"
|
||||||
|
|
||||||
2. **标记驱动设计**:
|
2. **标记驱动设计**:
|
||||||
- 使用`CastSkillRequestComp`作为标记组件
|
- 使用`CSRequestComp`作为标记组件
|
||||||
- 避免了直接调用系统方法的耦合
|
- 避免了直接调用系统方法的耦合
|
||||||
- 符合ECS的声明式编程理念
|
- 符合ECS的声明式编程理念
|
||||||
|
|
||||||
|
|||||||
@@ -239,7 +239,7 @@ SkillConfig --> BuffConf
|
|||||||
|
|
||||||
```mermaid
|
```mermaid
|
||||||
classDiagram
|
classDiagram
|
||||||
class CastSkillRequestComp {
|
class CSRequestComp {
|
||||||
+skillIndex : number
|
+skillIndex : number
|
||||||
+targetPositions : Vec3[]
|
+targetPositions : Vec3[]
|
||||||
+reset() void
|
+reset() void
|
||||||
@@ -261,9 +261,9 @@ class SkillAutocastSystem {
|
|||||||
+update(e : Entity) void
|
+update(e : Entity) void
|
||||||
+selectTargets() Vec3[]
|
+selectTargets() Vec3[]
|
||||||
}
|
}
|
||||||
CastSkillRequestComp --> SkillCastSystem
|
CSRequestComp --> SkillCastSystem
|
||||||
SkillCastSystem --> SkillCDSystem
|
SkillCastSystem --> SkillCDSystem
|
||||||
SkillAutocastSystem --> CastSkillRequestComp
|
SkillAutocastSystem --> CSRequestComp
|
||||||
```
|
```
|
||||||
|
|
||||||
**章节来源**
|
**章节来源**
|
||||||
|
|||||||
12
assets/script/game/common/ecs/position.meta
Normal file
12
assets/script/game/common/ecs/position.meta
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"ver": "1.2.0",
|
||||||
|
"importer": "directory",
|
||||||
|
"imported": true,
|
||||||
|
"uuid": "d2d775f5-1dc0-455e-89d7-4a17f43170e0",
|
||||||
|
"files": [],
|
||||||
|
"subMetas": {},
|
||||||
|
"userData": {
|
||||||
|
"compressionType": {},
|
||||||
|
"isRemoteBundle": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
||||||
import { Vec3, v3 } from "cc";
|
import { Vec3, v3 } from "cc";
|
||||||
import { CastSkillRequestComp } from "./STagComps";
|
|
||||||
import { HeroAttrsComp } from "./HeroAttrsComp";
|
import { HeroAttrsComp } from "./HeroAttrsComp";
|
||||||
import { HeroViewComp } from "./HeroViewComp";
|
import { HeroViewComp } from "./HeroViewComp";
|
||||||
import { SkillSet, SType } from "../common/config/SkillSet";
|
import { SkillSet, SType } from "../common/config/SkillSet";
|
||||||
import { HeroSkillsComp } from "./HeroSkills";
|
import { HeroSkillsComp } from "./HeroSkills";
|
||||||
|
import { CSRequestComp } from "../skill/STagComps";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ==================== 自动施法系统 ====================
|
* ==================== 自动施法系统 ====================
|
||||||
@@ -17,7 +17,7 @@ import { HeroSkillsComp } from "./HeroSkills";
|
|||||||
*
|
*
|
||||||
* 设计理念:
|
* 设计理念:
|
||||||
* - 负责"何时施法"的决策
|
* - 负责"何时施法"的决策
|
||||||
* - 通过添加 CastSkillRequestComp 触发施法
|
* - 通过添加 CSRequestComp 触发施法
|
||||||
* - 可被玩家输入系统或AI系统复用
|
* - 可被玩家输入系统或AI系统复用
|
||||||
* - 支持多种AI策略
|
* - 支持多种AI策略
|
||||||
*/
|
*/
|
||||||
@@ -53,7 +53,7 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat
|
|||||||
if (!config || config.SType !== SType.damage) continue;
|
if (!config || config.SType !== SType.damage) continue;
|
||||||
|
|
||||||
// ✅ 添加施法请求标记组件
|
// ✅ 添加施法请求标记组件
|
||||||
const request = e.add(CastSkillRequestComp) as CastSkillRequestComp;
|
const request = e.add(CSRequestComp) as CSRequestComp;
|
||||||
request.skillIndex = skillIndex;
|
request.skillIndex = skillIndex;
|
||||||
request.targets = this.sTargets(heroView);
|
request.targets = this.sTargets(heroView);
|
||||||
|
|
||||||
|
|||||||
9
assets/script/game/hero/SACastSystem.ts.meta
Normal file
9
assets/script/game/hero/SACastSystem.ts.meta
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"ver": "4.0.24",
|
||||||
|
"importer": "typescript",
|
||||||
|
"imported": true,
|
||||||
|
"uuid": "e76866cc-7379-436f-91ff-e71e790580a9",
|
||||||
|
"files": [],
|
||||||
|
"subMetas": {},
|
||||||
|
"userData": {}
|
||||||
|
}
|
||||||
@@ -1,18 +1,18 @@
|
|||||||
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
||||||
import { Vec3, v3 } from "cc";
|
import { Vec3, v3 } from "cc";
|
||||||
import { CastSkillRequestComp } from "./STagComps";
|
|
||||||
import { HeroAttrsComp } from "./HeroAttrsComp";
|
import { HeroAttrsComp } from "./HeroAttrsComp";
|
||||||
import { HeroViewComp } from "./HeroViewComp";
|
import { HeroViewComp } from "./HeroViewComp";
|
||||||
import { SkillSet, SType } from "../common/config/SkillSet";
|
import { SkillSet, SType } from "../common/config/SkillSet";
|
||||||
import { SkillEnt } from "../skill/SkillEnt";
|
import { SkillEnt } from "../skill/SkillEnt";
|
||||||
import { HeroSkillsComp } from "./HeroSkills";
|
import { HeroSkillsComp } from "./HeroSkills";
|
||||||
import { Skill } from "../skill/Skill";
|
import { Skill } from "../skill/Skill";
|
||||||
|
import { CSRequestComp } from "../skill/STagComps";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ==================== 技能施法系统 手动施法====================
|
* ==================== 技能施法系统 手动施法====================
|
||||||
*
|
*
|
||||||
* 职责:
|
* 职责:
|
||||||
* 1. 监听 CastSkillRequestComp 标记组件
|
* 1. 监听 CSRequestComp 标记组件
|
||||||
* 2. 检查施法条件(CD、MP、状态)
|
* 2. 检查施法条件(CD、MP、状态)
|
||||||
* 3. 扣除资源(MP)
|
* 3. 扣除资源(MP)
|
||||||
* 4. 创建技能实体
|
* 4. 创建技能实体
|
||||||
@@ -31,7 +31,7 @@ export class SkillCastSystem extends ecs.ComblockSystem implements ecs.IEntityEn
|
|||||||
* 过滤器:拥有技能数据 + 施法请求的实体
|
* 过滤器:拥有技能数据 + 施法请求的实体
|
||||||
*/
|
*/
|
||||||
filter(): ecs.IMatcher {
|
filter(): ecs.IMatcher {
|
||||||
return ecs.allOf(HeroSkillsComp, HeroAttrsComp, CastSkillRequestComp);
|
return ecs.allOf(HeroSkillsComp, HeroAttrsComp, CSRequestComp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -40,13 +40,13 @@ export class SkillCastSystem extends ecs.ComblockSystem implements ecs.IEntityEn
|
|||||||
entityEnter(e: ecs.Entity): void {
|
entityEnter(e: ecs.Entity): void {
|
||||||
const skills = e.get(HeroSkillsComp);
|
const skills = e.get(HeroSkillsComp);
|
||||||
const heroModel = e.get(HeroAttrsComp);
|
const heroModel = e.get(HeroAttrsComp);
|
||||||
const request = e.get(CastSkillRequestComp);
|
const request = e.get(CSRequestComp);
|
||||||
const heroView = e.get(HeroViewComp);
|
const heroView = e.get(HeroViewComp);
|
||||||
|
|
||||||
// 1. 验证数据完整性
|
// 1. 验证数据完整性
|
||||||
if (!skills || !heroModel || !request || !heroView) {
|
if (!skills || !heroModel || !request || !heroView) {
|
||||||
console.warn("[SkillCastSystem] 数据不完整,取消施法");
|
console.warn("[SkillCastSystem] 数据不完整,取消施法");
|
||||||
e.remove(CastSkillRequestComp);
|
e.remove(CSRequestComp);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -54,13 +54,13 @@ export class SkillCastSystem extends ecs.ComblockSystem implements ecs.IEntityEn
|
|||||||
const skill = skills.getSkill(request.skillIndex);
|
const skill = skills.getSkill(request.skillIndex);
|
||||||
if (!skill) {
|
if (!skill) {
|
||||||
console.warn(`[SkillCastSystem] 技能索引无效: ${request.skillIndex}`);
|
console.warn(`[SkillCastSystem] 技能索引无效: ${request.skillIndex}`);
|
||||||
e.remove(CastSkillRequestComp);
|
e.remove(CSRequestComp);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. 检查施法条件
|
// 3. 检查施法条件
|
||||||
if (!this.checkCastConditions(skills, heroModel, request.skillIndex)) {
|
if (!this.checkCastConditions(skills, heroModel, request.skillIndex)) {
|
||||||
e.remove(CastSkillRequestComp);
|
e.remove(CSRequestComp);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,7 +72,7 @@ export class SkillCastSystem extends ecs.ComblockSystem implements ecs.IEntityEn
|
|||||||
skills.resetCD(request.skillIndex);
|
skills.resetCD(request.skillIndex);
|
||||||
|
|
||||||
// 6. 移除请求标记
|
// 6. 移除请求标记
|
||||||
e.remove(CastSkillRequestComp);
|
e.remove(CSRequestComp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,106 +0,0 @@
|
|||||||
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
|
||||||
import { Vec3 } from "cc";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ==================== 技能数据组件 ====================
|
|
||||||
*
|
|
||||||
* 用途:
|
|
||||||
* - 存储单个技能的完整数据
|
|
||||||
* - 包含技能配置、状态、目标等信息
|
|
||||||
* - 可被技能系统读取和修改
|
|
||||||
*/
|
|
||||||
@ecs.register('SkillData')
|
|
||||||
export class SkillDataComp extends ecs.Comp {
|
|
||||||
/** 技能唯一ID */
|
|
||||||
skillId: number = 0;
|
|
||||||
|
|
||||||
/** 技能名称 */
|
|
||||||
name: string = "";
|
|
||||||
|
|
||||||
/** 技能等级 */
|
|
||||||
level: number = 1;
|
|
||||||
|
|
||||||
/** 技能类型 */
|
|
||||||
type: number = 0;
|
|
||||||
|
|
||||||
/** 消耗MP */
|
|
||||||
cost: number = 0;
|
|
||||||
|
|
||||||
/** 冷却时间 */
|
|
||||||
cooldown: number = 0;
|
|
||||||
|
|
||||||
/** 当前冷却剩余时间 */
|
|
||||||
currentCooldown: number = 0;
|
|
||||||
|
|
||||||
/** 伤害值 */
|
|
||||||
damage: number = 0;
|
|
||||||
|
|
||||||
/** 技能范围 */
|
|
||||||
range: number = 0;
|
|
||||||
|
|
||||||
/** 施法时间 */
|
|
||||||
castTime: number = 0;
|
|
||||||
|
|
||||||
/** 技能描述 */
|
|
||||||
description: string = "";
|
|
||||||
|
|
||||||
/** 是否已解锁 */
|
|
||||||
unlocked: boolean = false;
|
|
||||||
|
|
||||||
/** 技能图标路径 */
|
|
||||||
iconPath: string = "";
|
|
||||||
|
|
||||||
/** 额外属性数据 */
|
|
||||||
extraData: any = null;
|
|
||||||
|
|
||||||
reset() {
|
|
||||||
this.skillId = 0;
|
|
||||||
this.name = "";
|
|
||||||
this.level = 1;
|
|
||||||
this.type = 0;
|
|
||||||
this.cost = 0;
|
|
||||||
this.cooldown = 0;
|
|
||||||
this.currentCooldown = 0;
|
|
||||||
this.damage = 0;
|
|
||||||
this.range = 0;
|
|
||||||
this.castTime = 0;
|
|
||||||
this.description = "";
|
|
||||||
this.unlocked = false;
|
|
||||||
this.iconPath = "";
|
|
||||||
this.extraData = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 检查技能是否可以施放
|
|
||||||
*/
|
|
||||||
canCast(currentMP: number): boolean {
|
|
||||||
return this.unlocked &&
|
|
||||||
this.currentCooldown <= 0 &&
|
|
||||||
currentMP >= this.cost;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 更新冷却时间
|
|
||||||
*/
|
|
||||||
updateCooldown(deltaTime: number): void {
|
|
||||||
if (this.currentCooldown > 0) {
|
|
||||||
this.currentCooldown = Math.max(0, this.currentCooldown - deltaTime);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 重置冷却时间
|
|
||||||
*/
|
|
||||||
resetCooldown(): void {
|
|
||||||
this.currentCooldown = this.cooldown;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取冷却进度 (0-1)
|
|
||||||
*/
|
|
||||||
getCooldownProgress(): number {
|
|
||||||
if (this.cooldown <= 0) return 1;
|
|
||||||
return Math.max(0, 1 - (this.currentCooldown / this.cooldown));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,17 +1,20 @@
|
|||||||
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
||||||
import { BoxSet } from "../common/config/BoxSet";
|
import { BoxSet } from "../common/config/BoxSet";
|
||||||
|
import { HeroViewComp } from "../hero/HeroViewComp";
|
||||||
|
|
||||||
/** 业务层对象 */
|
/** 业务层对象 */
|
||||||
@ecs.register('SDataCom')
|
@ecs.register('SDataCom')
|
||||||
export class SDataCom extends ecs.Comp {
|
export class SDataCom extends ecs.Comp {
|
||||||
/** 业务层组件移除时,重置所有数据为默认值 */
|
/** 业务层组件移除时,重置所有数据为默认值 */
|
||||||
attrs:any=null
|
attrs:any=null
|
||||||
|
caster:HeroViewComp=null
|
||||||
group:BoxSet=BoxSet.HERO
|
group:BoxSet=BoxSet.HERO
|
||||||
s_uuid:number=0
|
s_uuid:number=0
|
||||||
reset() {
|
reset() {
|
||||||
this.attrs=null
|
this.attrs=null
|
||||||
this.group=0
|
this.group=0
|
||||||
this.s_uuid=0
|
this.s_uuid=0
|
||||||
|
this.caster=null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ import { Vec3 } from "cc";
|
|||||||
* - 由外部(如AI系统、玩家输入)添加
|
* - 由外部(如AI系统、玩家输入)添加
|
||||||
* - 施法系统处理后自动移除
|
* - 施法系统处理后自动移除
|
||||||
*/
|
*/
|
||||||
@ecs.register('CastSkillRequest')
|
@ecs.register('CSRequest')
|
||||||
export class CastSkillRequestComp extends ecs.Comp {
|
export class CSRequestComp extends ecs.Comp {
|
||||||
/** 技能索引(在 HeroSkillsComp.skills 中的位置) */
|
/** 技能索引(在 HeroSkillsComp.skills 中的位置) */
|
||||||
skillIndex: number = 0;
|
skillIndex: number = 0;
|
||||||
|
|
||||||
@@ -12,7 +12,7 @@ import { HType } from "../common/config/heroSet";
|
|||||||
import { SkillView } from "./SkillView";
|
import { SkillView } from "./SkillView";
|
||||||
import { SDataCom } from "./SDataCom";
|
import { SDataCom } from "./SDataCom";
|
||||||
import { Attrs } from "../common/config/HeroAttrs";
|
import { Attrs } from "../common/config/HeroAttrs";
|
||||||
import { SMoveDataComp } from "../hero/SMoveComp";
|
import { SMoveDataComp } from "../skill/SMoveComp";
|
||||||
|
|
||||||
/** Skill 模块 */
|
/** Skill 模块 */
|
||||||
@ecs.register(`Skill`)
|
@ecs.register(`Skill`)
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { DTType, RType, SkillSet } from "../common/config/SkillSet";
|
|||||||
import { BezierMove } from "../BezierMove/BezierMove";
|
import { BezierMove } from "../BezierMove/BezierMove";
|
||||||
import { BoxSet } from "../common/config/BoxSet";
|
import { BoxSet } from "../common/config/BoxSet";
|
||||||
import { SDataCom } from "./SDataCom";
|
import { SDataCom } from "./SDataCom";
|
||||||
import { SMoveDataComp } from "../hero/SMoveComp";
|
import { SMoveDataComp } from "./SMoveComp";
|
||||||
|
|
||||||
const { ccclass, property } = _decorator;
|
const { ccclass, property } = _decorator;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user