XiYou 西游 --- P0 阶段实施计划
版本 : v1.0
日期 : 2026-07-15
阶段 : P0 --- 可运行的俯视角实时战斗原型 + 技能系统
引擎: UE5.7
1. P0 阶段目标与验收标准
1.1 阶段目标
构建一个可运行的俯视角实时战斗原型,验证核心玩法循环:
- 角色能在俯视角场景中移动
- 角色能释放 5 个技能
- 技能有 CD 和蓝耗
- 技能能对怪物造成伤害
- 怪物能被击杀
- 基础 Buff/Debuff 能生效
1.2 验收标准
| # | 验收项 | 通过条件 |
|---|---|---|
| 1 | 角色移动 | 玩家角色能通过点击/摇杆/WASD 在场景中移动,位置在 DS 上正确同步 |
| 2 | 俯视角摄像机 | 摄像机固定等距俯视角,可缩放,不可旋转 |
| 3 | 5 技能槽 | 角色拥有 5 个技能槽,能从已学技能中自由装配 |
| 4 | 技能释放 | 点击技能按钮/快捷键能释放技能,有施法动画和特效 |
| 5 | 技能 CD | 释放后进入 CD,CD 期间按钮变灰不可再次释放 |
| 6 | 技能蓝耗 | 释放消耗蓝量,蓝量不足时无法释放并提示 |
| 7 | 伤害计算 | 技能命中怪物后按公式计算伤害,显示伤害飘字 |
| 8 | 怪物 AI | 怪物能巡逻、追击、攻击玩家 |
| 9 | 怪物击杀 | 怪物 HP 归零后死亡,可重生 |
| 10 | Buff/Debuff | 技能能施加 Buff/Debuff,效果正确生效和到期移除 |
| 11 | 控制效果 | 眩晕/沉默等控制效果能正确限制角色行动 |
| 12 | 手机端输入 | 手机端虚拟摇杆 + 技能按钮能正常操作 |
| 13 | 网络同步 | DS 模式下所有功能正常,无严重同步问题 |
1.3 P0 不包含
- 角色创建/选择界面(使用默认角色)
- 装备系统(仅预留接口)
- 背包系统(仅预留接口)
- 技能书掉落/学习(使用 GM 命令直接学习)
- 数据持久化(仅内存状态)
- UI 美化(使用占位 UI)
- 怪物掉落
- NPC 对话
- 地图切换
2. 任务分解
2.1 任务总览
| 任务ID | 任务名称 | 复杂度 | 前置依赖 | 产出物 |
|---|---|---|---|---|
| T01 | UE5 项目基础搭建 | 中等 | 无 | Module结构、基础类、Build.cs |
| T02 | 俯视角摄像机系统 | 简单 | T01 | 摄像机Actor、缩放逻辑 |
| T03 | 角色基类与移动系统 | 中等 | T01 | Character基类、移动逻辑、Replication |
| T04 | GAS 集成基础 | 复杂 | T03 | ASC、AttributeSet、基础Ability |
| T05 | 属性系统与伤害计算 | 中等 | T04 | 完整属性集、MMC、伤害Execution |
| T06 | 技能槽系统 | 中等 | T04 | 5槽位装配逻辑、UI |
| T07 | 技能释放与战斗逻辑 | 复杂 | T05, T06 | 技能释放流程、AbilityTask |
| T08 | Buff/Debuff 系统 | 中等 | T05 | GameplayEffect体系、控制效果 |
| T09 | 怪物 AI 与战斗 | 中等 | T07 | AIController、行为树、仇恨系统 |
| T10 | 手机端输入适配 | 中等 | T03, T06 | EnhancedInput、虚拟摇杆、技能按钮 |
| T11 | 战斗 UI 与反馈 | 中等 | T07, T08 | 血条、蓝条、CD、飘字、Buff图标 |
| T12 | 集成测试与调优 | 中等 | T09, T10, T11 | 完整战斗原型、性能调优 |
2.2 任务详细说明
T01: UE5 项目基础搭建
复杂度 : 中等
目标: 搭建项目的 C++ Module 结构和基础框架类
子任务:
| # | 子任务 | 说明 |
|---|---|---|
| 1 | 更新 Build.cs | 添加 GAS、EnhancedInput、UMG、AIModule 等依赖 |
| 2 | 创建 XiYouGameInstance | 游戏实例类,管理全局状态 |
| 3 | 创建 XiYouGameMode | 游戏模式类,定义默认类和规则 |
| 4 | 创建 XiYouGameState | 游戏状态类,全局复制状态 |
| 5 | 创建 XiYouPlayerController | 玩家控制器类,输入处理和 RPC |
| 6 | 创建 XiYouPlayerState | 玩家状态类,挂载 ASC |
| 7 | 创建 XiYouHUD | HUD 类,管理 UI |
| 8 | 创建目录结构 | Core/Character/Ability/Attribute/Combat/AI/UI/Data 等目录 |
| 9 | 配置 DefaultEngine.ini | 网络参数、GameMode、GameInstance 配置 |
| 10 | 配置 DefaultGame.ini | 游戏相关配置 |
产出文件:
Source/XiYou/XiYou.Build.cs(更新)Source/XiYou/Core/XiYouGameInstance.h/.cppSource/XiYou/Core/XiYouGameMode.h/.cppSource/XiYou/Core/XiYouGameState.h/.cppSource/XiYou/Core/XiYouPlayerController.h/.cppSource/XiYou/Core/XiYouPlayerState.h/.cppSource/XiYou/Core/XiYouHUD.h/.cppConfig/DefaultEngine.ini(更新)Config/DefaultGame.ini(更新)
T02: 俯视角摄像机系统
复杂度 : 简单
目标: 实现等距俯视角摄像机,固定角度可缩放不可旋转
子任务:
| # | 子任务 | 说明 |
|---|---|---|
| 1 | 创建 AXiYouCameraActor | 摄像机 Actor,固定俯视角 |
| 2 | 摄像机跟随 | 跟随玩家角色移动,平滑插值 |
| 3 | 摄像机缩放 | 鼠标滚轮/双指缩放,限制缩放范围 |
| 4 | 摄像机参数配置 | 角度、距离、缩放范围可配置 |
| 5 | 摄像机边界限制 | 限制摄像机不超出地图边界 |
产出文件:
Source/XiYou/Core/XiYouCameraActor.h/.cpp
关键设计:
- 摄像机角度:约 45-60 度俯视角
- 摄像机距离:800-2000 单位可调
- 使用 SpringArm + Camera 组件
- 在 PlayerController 中设置 ViewTarget
T03: 角色基类与移动系统
复杂度 : 中等
目标: 实现角色基类和移动系统,支持 DS Replication
子任务:
| # | 子任务 | 说明 |
|---|---|---|
| 1 | 创建 AXiYouCharacter | 角色基类,定义核心属性和组件 |
| 2 | 创建 AXiYouPlayerCharacter | 玩家角色,输入处理 |
| 3 | 移动组件配置 | CharacterMovementComponent 配置(俯视角移动) |
| 4 | 点击移动 | PC 端右键点击地面移动(NavMesh 寻路) |
| 5 | 移动 Replication | 移动同步,客户端预测 |
| 6 | 角色朝向 | 移动时自动面向移动方向 |
| 7 | 基础动画 | Idle/Run/Death 基础动画(可用占位动画) |
| 8 | 角色血条组件 | 头顶血条 WidgetComponent |
产出文件:
Source/XiYou/Character/XiYouCharacter.h/.cppSource/XiYou/Character/XiYouPlayerCharacter.h/.cpp
关键设计:
- 使用 UE5 内置 CharacterMovementComponent
- 俯视角移动:bOrientRotationToMovement = true,bUseControllerRotationYaw = false
- 点击移动:ServerMoveToTarget RPC + UNavigationSystemV1::FindPathToLocationSynchronously
- 移动同步:UE5 内置客户端预测 + 服务端校正
T04: GAS 集成基础
复杂度 : 复杂
目标: 集成 GAS 系统,实现 ASC、AttributeSet、基础 Ability
子任务:
| # | 子任务 | 说明 |
|---|---|---|
| 1 | 创建 UXiYouAbilitySystemComponent | ASC 扩展,技能槽管理 |
| 2 | 创建 UXiYouAttributeSet | 基础属性集(HP/MP/ATK/SPD 等) |
| 3 | ASC 初始化流程 | 在 PlayerState 中初始化 ASC,设置 AvatarActor |
| 4 | 创建 UXiYouAbility 基类 | 技能基类,定义核心属性和虚函数 |
| 5 | 创建基础伤害技能 | UXiYouDamageAbility,验证技能释放流程 |
| 6 | 创建 CD GameplayEffect | 技能冷却 Effect |
| 7 | 创建蓝耗 GameplayEffect | 技能蓝耗 Effect |
| 8 | GameplayTag 初始化 | 创建 XiYou Tag 目录结构 |
| 9 | 技能数据表 | XiYouSkillData DataTable,配置技能参数 |
| 10 | GAS Replication 验证 | 验证 ASC/Ability/Effect 的网络复制 |
产出文件:
Source/XiYou/Ability/XiYouAbilitySystemComponent.h/.cppSource/XiYou/Attribute/XiYouAttributeSet.h/.cppSource/XiYou/Ability/XiYouAbility.h/.cppSource/XiYou/Ability/XiYouDamageAbility.h/.cppSource/XiYou/Data/Tables/(DataTable 资源)Content/GameplayTags/(Tag 定义资源)
关键设计:
- ASC 挂载在 PlayerState 上
- AttributeSet 包含 HP/MaxHP/MP/MaxMP/ATK/SPD 等核心属性
- 技能数据通过 DataTable 配置,运行时加载
- CD 和蓝耗通过 GameplayEffect 实现
技术风险: GAS 学习曲线陡峭,需要大量阅读源码和示例
T05: 属性系统与伤害计算
复杂度 : 中等
目标: 实现完整的属性体系和伤害计算公式
子任务:
| # | 子任务 | 说明 |
|---|---|---|
| 1 | 扩展 AttributeSet | 添加根骨/灵性/力量/敏捷等基础属性 |
| 2 | 创建 MMC 衍生属性 | ModifierMagnitudeCalculation 计算衍生属性 |
| 3 | 创建 UXiYouAttributeCalculator | 属性计算器,管理属性初始化和更新 |
| 4 | 创建 UXiYouDamageExecution | 伤害执行类,实现伤害公式 |
| 5 | 物理伤害公式 | ATK × 倍率 → 防御减免 → 破防 → 暴击 → 波动 |
| 6 | 法术伤害公式 | 法术ATK × 倍率 → 抗性减免 → 忽视 → 狂暴 → 五行 → 波动 |
| 7 | 治疗量公式 | 法术ATK × 倍率 → 治疗加成 → 波动 |
| 8 | 属性初始化 | 根据种族和等级初始化属性 |
| 9 | 伤害日志 | 服务端记录伤害计算过程(调试用) |
产出文件:
Source/XiYou/Attribute/XiYouAttributeSet.h/.cpp(扩展)Source/XiYou/Attribute/XiYouAttributeCalculator.h/.cppSource/XiYou/Combat/XiYouDamageExecution.h/.cppSource/XiYou/Combat/XiYouCombatLog.h/.cpp
关键设计:
- 基础属性通过 AttributeSet 的 FGameplayAttributeData 定义
- 衍生属性通过 MMC(ModifierMagnitudeCalculation)计算
- 伤害公式在 GameplayEffectExecution 中实现
- 所有伤害计算在服务端执行
T06: 技能槽系统
复杂度 : 中等
目标: 实现 5 技能槽自由装配系统
子任务:
| # | 子任务 | 说明 |
|---|---|---|
| 1 | 技能槽数据结构 | EquippedAbilitySlots 数组,5 个槽位 |
| 2 | 技能装配逻辑 | ServerEquipAbility/ServerUnequipAbility RPC |
| 3 | 技能槽 Replication | EquippedAbilitySlots 复制和 RepNotify |
| 4 | 技能槽 UI | 5 个技能按钮,显示技能图标和 CD |
| 5 | 技能装配 UI | 简单的已学技能列表 + 拖拽到槽位 |
| 6 | GM 命令学习技能 | 供测试用的 GM 命令直接学习技能 |
| 7 | 技能槽与 InputID 映射 | 槽位索引 → InputID → GAS Ability 激活 |
产出文件:
Source/XiYou/Ability/XiYouAbilitySystemComponent.h/.cpp(扩展)Source/XiYou/UI/Widgets/W_SkillBar.h/.cppSource/XiYou/UI/Widgets/W_SkillSlot.h/.cppSource/XiYou/UI/Widgets/W_SkillList.h/.cpp
关键设计:
- 5 个槽位对应 InputID 1-5
- 装配 = 将 AbilitySpec 的 InputID 设为对应槽位
- 换装 = 解绑旧 InputID + 绑定新 InputID
- UI 使用 UMG 实现,支持拖拽
T07: 技能释放与战斗逻辑
复杂度 : 复杂
目标: 实现完整的技能释放流程和多种技能形态
子任务:
| # | 子任务 | 说明 |
|---|---|---|
| 1 | 技能释放流程 | 客户端请求 → 服务端验证 → CommitAbility → 执行效果 |
| 2 | 单体伤害技能 | UXiYouSingleTargetAbility,选择目标释放 |
| 3 | 方向性技能 | UXiYouDirectionalAbility,朝面向方向释放 |
| 4 | AOE 技能 | UXiYouAOEAbility,以目标点为中心范围伤害 |
| 5 | 弹道型技能 | UXiYouProjectileAbility,发射弹道命中伤害 |
| 6 | 治疗技能 | UXiYouHealAbility,治疗目标 |
| 7 | AbilityTask | 自定义 Task:播放蒙太奇、生成弹道、区域伤害 |
| 8 | 目标选择系统 | 自动锁定最近 + 手动点击 + Tab 切换 |
| 9 | 技能范围指示器 | 选中技能时显示范围/方向指示 |
| 10 | 施法前摇 | 部分技能有前摇,前摇期间可被打断 |
| 11 | 技能打断 | 控制效果打断正在施法的技能 |
产出文件:
Source/XiYou/Ability/XiYouDamageAbility.h/.cpp(扩展)Source/XiYou/Ability/XiYouHealAbility.h/.cppSource/XiYou/Ability/XiYouSingleTargetAbility.h/.cppSource/XiYou/Ability/XiYouDirectionalAbility.h/.cppSource/XiYou/Ability/XiYouAOEAbility.h/.cppSource/XiYou/Ability/XiYouProjectileAbility.h/.cppSource/XiYou/Ability/XiYouAbilityTask_PlayMontageAndWait.h/.cppSource/XiYou/Ability/XiYouAbilityTask_SpawnProjectile.h/.cppSource/XiYou/Ability/XiYouAbilityTask_ApplyAreaDamage.h/.cppSource/XiYou/Ability/XiYouTargetType.h/.cpp
关键设计:
- 每种技能形态一个子类,重写 ActivateAbility
- 弹道型技能使用 AbilityTask_SpawnProjectile 生成弹道 Actor
- AOE 技能使用 AbilityTask_ApplyAreaDamage 在服务端检测范围内目标
- 目标选择在 PlayerController 中处理
T08: Buff/Debuff 系统
复杂度 : 中等
目标: 实现 Buff/Debuff 的施加、叠加、驱散、到期移除
子任务:
| # | 子任务 | 说明 |
|---|---|---|
| 1 | Buff GameplayEffect 体系 | 定义各种 Buff/Debuff 的 GameplayEffect 类 |
| 2 | Buff 叠加规则 | AggregateBySource/AggregateByTarget/Override |
| 3 | 控制效果实现 | 眩晕/沉默/定身/恐惧的 GameplayEffect + Tag |
| 4 | 控制效果逻辑 | 眩晕禁止移动和施法,沉默禁止施法,定身禁止移动 |
| 5 | DoT 效果 | 毒/燃烧等持续伤害,Period 执行 |
| 6 | Buff 驱散 | 驱散技能移除可驱散 Buff |
| 7 | Buff 图标 UI | 显示当前 Buff/Debuff 图标和剩余时间 |
| 8 | Buff 到期处理 | 持续时间结束自动移除,角色死亡清除所有 Buff |
产出文件:
Source/XiYou/Buff/XiYouGameplayEffect.h/.cppSource/XiYou/Buff/XiYouBuffManager.h/.cppSource/XiYou/Ability/XiYouBuffAbility.h/.cppSource/XiYou/Ability/XiYouControlAbility.h/.cppSource/XiYou/UI/Widgets/W_BuffBar.h/.cppContent/GameplayEffects/(GE 蓝图资源)
关键设计:
- 每个 Buff 对应一个 UGameplayEffect 派生类或蓝图
- 控制效果通过 GameplayTag 实现:State.Stun / State.Silence / State.Root
- 技能释放前检查 Tag:有 State.Stun 则无法释放任何技能
- 移动前检查 Tag:有 State.Stun 或 State.Root 则无法移动
- DoT 通过 GameplayEffect 的 Period + Execution 实现
T09: 怪物 AI 与战斗
复杂度 : 中等
目标: 实现怪物 AI,能巡逻、追击、攻击玩家
子任务:
| # | 子任务 | 说明 |
|---|---|---|
| 1 | 创建 AXiYouAICharacter | AI 角色基类,挂载 ASC |
| 2 | 创建 AXiYouMonster | 怪物类,定义怪物属性和技能 |
| 3 | 创建 AXiYouAIController | AI 控制器,管理行为树 |
| 4 | 行为树 - 巡逻 | 怪物在出生点附近巡逻 |
| 5 | 行为树 - 追击 | 发现玩家后追击 |
| 6 | 行为树 - 攻击 | 进入攻击范围后使用技能攻击 |
| 7 | 仇恨系统 | 记录仇恨列表,攻击仇恨最高的目标 |
| 8 | 怪物死亡与重生 | HP 归零死亡,定时重生 |
| 9 | 怪物数据表 | XiYouMonsterData DataTable,配置怪物参数 |
| 10 | 怪物生成管理 | 简单的生成点配置和生成逻辑 |
产出文件:
Source/XiYou/Character/XiYouAICharacter.h/.cppSource/XiYou/Character/XiYouMonster.h/.cppSource/XiYou/AI/XiYouAIController.h/.cppSource/XiYou/AI/BehaviorTrees/(行为树资源)Source/XiYou/Data/Tables/(怪物 DataTable)Source/XiYou/World/XiYouSpawnManager.h/.cpp
关键设计:
- 怪物也使用 GAS 系统,拥有自己的 ASC 和 AttributeSet
- 怪物技能通过 AI Controller 调用 ASC->TryActivateAbilityByClass 释放
- 仇恨系统使用 TArray<TPair<AActor*, float>> 按仇恨值排序
- 怪物死亡后隐藏 Actor,定时后重新显示并恢复属性
T10: 手机端输入适配
复杂度 : 中等
目标: 实现手机端虚拟摇杆和技能按钮输入
子任务:
| # | 子任务 | 说明 |
|---|---|---|
| 1 | EnhancedInput 配置 | 定义 InputAction 和 InputMappingContext |
| 2 | IMC_Mobile | 手机端映射:触摸摇杆 + 技能按钮触摸 |
| 3 | IMC_PC | PC 端映射:WASD + QWERF + 鼠标 |
| 4 | 虚拟摇杆 Widget | UMG 虚拟摇杆,输出 2D 方向向量 |
| 5 | 技能按钮 Widget | 5 个技能按钮,支持触摸和长按 |
| 6 | 平台检测与切换 | 运行时检测平台,切换 IMC 和 UI 布局 |
| 7 | 触摸目标选择 | 点击敌人锁定目标 |
产出文件:
Source/XiYou/Core/XiYouInputConfig.h/.cppSource/XiYou/UI/Widgets/W_VirtualJoystick.h/.cppSource/XiYou/UI/Widgets/W_SkillButton.h/.cppContent/Input/(IA 和 IMC 资源)
关键设计:
- 使用 UE5 EnhancedInput 系统
- InputAction 定义:IA_Move, IA_Skill1~5, IA_TargetSelect
- 虚拟摇杆使用 UMG 实现,OnTouch 事件驱动
- 技能按钮支持:点击释放、长按显示范围、滑动选方向
- 平台检测:
UPlatformMisc::IsRunningOnMobilePlatform()
T11: 战斗 UI 与反馈
复杂度 : 中等
目标: 实现战斗相关的 UI 和视觉反馈
子任务:
| # | 子任务 | 说明 |
|---|---|---|
| 1 | 血条蓝条 UI | 自身血蓝条 + 头顶血条 |
| 2 | 技能栏 UI | 5 技能槽 + CD 转圈 + 蓝量不足变灰 |
| 3 | 伤害飘字 | 伤害/治疗/暴击数值飘字 |
| 4 | Buff 图标栏 | 当前 Buff/Debuff 图标和倒计时 |
| 5 | 目标指示器 | 选中目标的视觉指示 |
| 6 | 技能特效 | 基础技能特效(可用 Niagara 简化特效) |
| 7 | 死亡/复活 UI | 死亡界面和复活按钮 |
| 8 | 战斗信息日志 | 简单的战斗信息显示 |
产出文件:
Source/XiYou/UI/Widgets/W_HealthBar.h/.cppSource/XiYou/UI/Widgets/W_SkillBar.h/.cpp(扩展)Source/XiYou/UI/Widgets/W_DamageNumber.h/.cppSource/XiYou/UI/Widgets/W_BuffBar.h/.cpp(扩展)Source/XiYou/UI/Widgets/W_TargetIndicator.h/.cppSource/XiYou/UI/Widgets/W_DeathScreen.h/.cpp
关键设计:
- 伤害飘字使用 WidgetComponent 或 Niagara 实现
- CD 转圈使用 UMG 的 RenderAngle 动画
- 头顶血条使用 WidgetComponent,仅显示附近角色的
- 技能特效优先使用 Niagara,控制粒子数
T12: 集成测试与调优
复杂度 : 中等
目标: 集成所有系统,进行测试和性能调优
子任务:
| # | 子任务 | 说明 |
|---|---|---|
| 1 | 集成测试场景 | 创建测试地图,放置怪物和生成点 |
| 2 | 多技能测试 | 配置 5+ 不同类型技能进行测试 |
| 3 | 网络测试 | DS 模式下多人测试,验证同步 |
| 4 | 手机端测试 | 打包到手机测试操作和性能 |
| 5 | 性能 Profile | CPU/GPU/内存/网络性能分析 |
| 6 | 战斗手感调优 | 技能 CD/蓝耗/伤害数值调优 |
| 7 | Bug 修复 | 修复集成测试中发现的问题 |
| 8 | 录制演示视频 | 录制 P0 原型演示视频 |
产出物:
- 可运行的 P0 战斗原型
- 性能分析报告
- Bug 列表和修复记录
3. 开发顺序与依赖关系
3.1 依赖图
#mermaid-svg-d7QJxjj3i0frTNMJ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-d7QJxjj3i0frTNMJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-d7QJxjj3i0frTNMJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-d7QJxjj3i0frTNMJ .error-icon{fill:#552222;}#mermaid-svg-d7QJxjj3i0frTNMJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-d7QJxjj3i0frTNMJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-d7QJxjj3i0frTNMJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-d7QJxjj3i0frTNMJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-d7QJxjj3i0frTNMJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-d7QJxjj3i0frTNMJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-d7QJxjj3i0frTNMJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-d7QJxjj3i0frTNMJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-d7QJxjj3i0frTNMJ .marker.cross{stroke:#333333;}#mermaid-svg-d7QJxjj3i0frTNMJ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-d7QJxjj3i0frTNMJ p{margin:0;}#mermaid-svg-d7QJxjj3i0frTNMJ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-d7QJxjj3i0frTNMJ .cluster-label text{fill:#333;}#mermaid-svg-d7QJxjj3i0frTNMJ .cluster-label span{color:#333;}#mermaid-svg-d7QJxjj3i0frTNMJ .cluster-label span p{background-color:transparent;}#mermaid-svg-d7QJxjj3i0frTNMJ .label text,#mermaid-svg-d7QJxjj3i0frTNMJ span{fill:#333;color:#333;}#mermaid-svg-d7QJxjj3i0frTNMJ .node rect,#mermaid-svg-d7QJxjj3i0frTNMJ .node circle,#mermaid-svg-d7QJxjj3i0frTNMJ .node ellipse,#mermaid-svg-d7QJxjj3i0frTNMJ .node polygon,#mermaid-svg-d7QJxjj3i0frTNMJ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-d7QJxjj3i0frTNMJ .rough-node .label text,#mermaid-svg-d7QJxjj3i0frTNMJ .node .label text,#mermaid-svg-d7QJxjj3i0frTNMJ .image-shape .label,#mermaid-svg-d7QJxjj3i0frTNMJ .icon-shape .label{text-anchor:middle;}#mermaid-svg-d7QJxjj3i0frTNMJ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-d7QJxjj3i0frTNMJ .rough-node .label,#mermaid-svg-d7QJxjj3i0frTNMJ .node .label,#mermaid-svg-d7QJxjj3i0frTNMJ .image-shape .label,#mermaid-svg-d7QJxjj3i0frTNMJ .icon-shape .label{text-align:center;}#mermaid-svg-d7QJxjj3i0frTNMJ .node.clickable{cursor:pointer;}#mermaid-svg-d7QJxjj3i0frTNMJ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-d7QJxjj3i0frTNMJ .arrowheadPath{fill:#333333;}#mermaid-svg-d7QJxjj3i0frTNMJ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-d7QJxjj3i0frTNMJ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-d7QJxjj3i0frTNMJ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-d7QJxjj3i0frTNMJ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-d7QJxjj3i0frTNMJ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-d7QJxjj3i0frTNMJ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-d7QJxjj3i0frTNMJ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-d7QJxjj3i0frTNMJ .cluster text{fill:#333;}#mermaid-svg-d7QJxjj3i0frTNMJ .cluster span{color:#333;}#mermaid-svg-d7QJxjj3i0frTNMJ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-d7QJxjj3i0frTNMJ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-d7QJxjj3i0frTNMJ rect.text{fill:none;stroke-width:0;}#mermaid-svg-d7QJxjj3i0frTNMJ .icon-shape,#mermaid-svg-d7QJxjj3i0frTNMJ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-d7QJxjj3i0frTNMJ .icon-shape p,#mermaid-svg-d7QJxjj3i0frTNMJ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-d7QJxjj3i0frTNMJ .icon-shape .label rect,#mermaid-svg-d7QJxjj3i0frTNMJ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-d7QJxjj3i0frTNMJ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-d7QJxjj3i0frTNMJ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-d7QJxjj3i0frTNMJ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} T01 项目基础搭建
T02 俯视角摄像机
T03 角色基类与移动
T04 GAS集成基础
T05 属性系统与伤害计算
T06 技能槽系统
T07 技能释放与战斗逻辑
T08 Buff/Debuff系统
T09 怪物AI与战斗
T10 手机端输入适配
T11 战斗UI与反馈
T12 集成测试与调优
3.2 开发阶段划分
#mermaid-svg-ooCs6CbaySvGLj7W{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ooCs6CbaySvGLj7W .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ooCs6CbaySvGLj7W .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ooCs6CbaySvGLj7W .error-icon{fill:#552222;}#mermaid-svg-ooCs6CbaySvGLj7W .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ooCs6CbaySvGLj7W .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ooCs6CbaySvGLj7W .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ooCs6CbaySvGLj7W .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ooCs6CbaySvGLj7W .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ooCs6CbaySvGLj7W .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ooCs6CbaySvGLj7W .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ooCs6CbaySvGLj7W .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ooCs6CbaySvGLj7W .marker.cross{stroke:#333333;}#mermaid-svg-ooCs6CbaySvGLj7W svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ooCs6CbaySvGLj7W p{margin:0;}#mermaid-svg-ooCs6CbaySvGLj7W .mermaid-main-font{font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-ooCs6CbaySvGLj7W .exclude-range{fill:#eeeeee;}#mermaid-svg-ooCs6CbaySvGLj7W .section{stroke:none;opacity:0.2;}#mermaid-svg-ooCs6CbaySvGLj7W .section0{fill:rgba(102, 102, 255, 0.49);}#mermaid-svg-ooCs6CbaySvGLj7W .section2{fill:#fff400;}#mermaid-svg-ooCs6CbaySvGLj7W .section1,#mermaid-svg-ooCs6CbaySvGLj7W .section3{fill:white;opacity:0.2;}#mermaid-svg-ooCs6CbaySvGLj7W .sectionTitle0{fill:#333;}#mermaid-svg-ooCs6CbaySvGLj7W .sectionTitle1{fill:#333;}#mermaid-svg-ooCs6CbaySvGLj7W .sectionTitle2{fill:#333;}#mermaid-svg-ooCs6CbaySvGLj7W .sectionTitle3{fill:#333;}#mermaid-svg-ooCs6CbaySvGLj7W .sectionTitle{text-anchor:start;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-ooCs6CbaySvGLj7W .grid .tick{stroke:lightgrey;opacity:0.8;shape-rendering:crispEdges;}#mermaid-svg-ooCs6CbaySvGLj7W .grid .tick text{font-family:"trebuchet ms",verdana,arial,sans-serif;fill:#333;}#mermaid-svg-ooCs6CbaySvGLj7W .grid path{stroke-width:0;}#mermaid-svg-ooCs6CbaySvGLj7W .today{fill:none;stroke:red;stroke-width:2px;}#mermaid-svg-ooCs6CbaySvGLj7W .task{stroke-width:2;}#mermaid-svg-ooCs6CbaySvGLj7W .taskText{text-anchor:middle;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-ooCs6CbaySvGLj7W .taskTextOutsideRight{fill:black;text-anchor:start;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-ooCs6CbaySvGLj7W .taskTextOutsideLeft{fill:black;text-anchor:end;}#mermaid-svg-ooCs6CbaySvGLj7W .task.clickable{cursor:pointer;}#mermaid-svg-ooCs6CbaySvGLj7W .taskText.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-ooCs6CbaySvGLj7W .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-ooCs6CbaySvGLj7W .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-ooCs6CbaySvGLj7W .taskText0,#mermaid-svg-ooCs6CbaySvGLj7W .taskText1,#mermaid-svg-ooCs6CbaySvGLj7W .taskText2,#mermaid-svg-ooCs6CbaySvGLj7W .taskText3{fill:white;}#mermaid-svg-ooCs6CbaySvGLj7W .task0,#mermaid-svg-ooCs6CbaySvGLj7W .task1,#mermaid-svg-ooCs6CbaySvGLj7W .task2,#mermaid-svg-ooCs6CbaySvGLj7W .task3{fill:#8a90dd;stroke:#534fbc;}#mermaid-svg-ooCs6CbaySvGLj7W .taskTextOutside0,#mermaid-svg-ooCs6CbaySvGLj7W .taskTextOutside2{fill:black;}#mermaid-svg-ooCs6CbaySvGLj7W .taskTextOutside1,#mermaid-svg-ooCs6CbaySvGLj7W .taskTextOutside3{fill:black;}#mermaid-svg-ooCs6CbaySvGLj7W .active0,#mermaid-svg-ooCs6CbaySvGLj7W .active1,#mermaid-svg-ooCs6CbaySvGLj7W .active2,#mermaid-svg-ooCs6CbaySvGLj7W .active3{fill:#bfc7ff;stroke:#534fbc;}#mermaid-svg-ooCs6CbaySvGLj7W .activeText0,#mermaid-svg-ooCs6CbaySvGLj7W .activeText1,#mermaid-svg-ooCs6CbaySvGLj7W .activeText2,#mermaid-svg-ooCs6CbaySvGLj7W .activeText3{fill:black!important;}#mermaid-svg-ooCs6CbaySvGLj7W .done0,#mermaid-svg-ooCs6CbaySvGLj7W .done1,#mermaid-svg-ooCs6CbaySvGLj7W .done2,#mermaid-svg-ooCs6CbaySvGLj7W .done3{stroke:grey;fill:lightgrey;stroke-width:2;}#mermaid-svg-ooCs6CbaySvGLj7W .doneText0,#mermaid-svg-ooCs6CbaySvGLj7W .doneText1,#mermaid-svg-ooCs6CbaySvGLj7W .doneText2,#mermaid-svg-ooCs6CbaySvGLj7W .doneText3{fill:black!important;}#mermaid-svg-ooCs6CbaySvGLj7W .doneText0.taskTextOutsideLeft,#mermaid-svg-ooCs6CbaySvGLj7W .doneText0.taskTextOutsideRight,#mermaid-svg-ooCs6CbaySvGLj7W .doneText1.taskTextOutsideLeft,#mermaid-svg-ooCs6CbaySvGLj7W .doneText1.taskTextOutsideRight,#mermaid-svg-ooCs6CbaySvGLj7W .doneText2.taskTextOutsideLeft,#mermaid-svg-ooCs6CbaySvGLj7W .doneText2.taskTextOutsideRight,#mermaid-svg-ooCs6CbaySvGLj7W .doneText3.taskTextOutsideLeft,#mermaid-svg-ooCs6CbaySvGLj7W .doneText3.taskTextOutsideRight{fill:black!important;}#mermaid-svg-ooCs6CbaySvGLj7W .crit0,#mermaid-svg-ooCs6CbaySvGLj7W .crit1,#mermaid-svg-ooCs6CbaySvGLj7W .crit2,#mermaid-svg-ooCs6CbaySvGLj7W .crit3{stroke:#ff8888;fill:red;stroke-width:2;}#mermaid-svg-ooCs6CbaySvGLj7W .activeCrit0,#mermaid-svg-ooCs6CbaySvGLj7W .activeCrit1,#mermaid-svg-ooCs6CbaySvGLj7W .activeCrit2,#mermaid-svg-ooCs6CbaySvGLj7W .activeCrit3{stroke:#ff8888;fill:#bfc7ff;stroke-width:2;}#mermaid-svg-ooCs6CbaySvGLj7W .doneCrit0,#mermaid-svg-ooCs6CbaySvGLj7W .doneCrit1,#mermaid-svg-ooCs6CbaySvGLj7W .doneCrit2,#mermaid-svg-ooCs6CbaySvGLj7W .doneCrit3{stroke:#ff8888;fill:lightgrey;stroke-width:2;cursor:pointer;shape-rendering:crispEdges;}#mermaid-svg-ooCs6CbaySvGLj7W .milestone{transform:rotate(45deg) scale(0.8,0.8);}#mermaid-svg-ooCs6CbaySvGLj7W .milestoneText{font-style:italic;}#mermaid-svg-ooCs6CbaySvGLj7W .doneCritText0,#mermaid-svg-ooCs6CbaySvGLj7W .doneCritText1,#mermaid-svg-ooCs6CbaySvGLj7W .doneCritText2,#mermaid-svg-ooCs6CbaySvGLj7W .doneCritText3{fill:black!important;}#mermaid-svg-ooCs6CbaySvGLj7W .doneCritText0.taskTextOutsideLeft,#mermaid-svg-ooCs6CbaySvGLj7W .doneCritText0.taskTextOutsideRight,#mermaid-svg-ooCs6CbaySvGLj7W .doneCritText1.taskTextOutsideLeft,#mermaid-svg-ooCs6CbaySvGLj7W .doneCritText1.taskTextOutsideRight,#mermaid-svg-ooCs6CbaySvGLj7W .doneCritText2.taskTextOutsideLeft,#mermaid-svg-ooCs6CbaySvGLj7W .doneCritText2.taskTextOutsideRight,#mermaid-svg-ooCs6CbaySvGLj7W .doneCritText3.taskTextOutsideLeft,#mermaid-svg-ooCs6CbaySvGLj7W .doneCritText3.taskTextOutsideRight{fill:black!important;}#mermaid-svg-ooCs6CbaySvGLj7W .vert{stroke:navy;}#mermaid-svg-ooCs6CbaySvGLj7W .vertText{font-size:15px;text-anchor:middle;fill:navy!important;}#mermaid-svg-ooCs6CbaySvGLj7W .activeCritText0,#mermaid-svg-ooCs6CbaySvGLj7W .activeCritText1,#mermaid-svg-ooCs6CbaySvGLj7W .activeCritText2,#mermaid-svg-ooCs6CbaySvGLj7W .activeCritText3{fill:black!important;}#mermaid-svg-ooCs6CbaySvGLj7W .titleText{text-anchor:middle;font-size:18px;fill:#333;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-ooCs6CbaySvGLj7W :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 2026-07-19 2026-07-26 2026-08-02 2026-08-09 2026-08-16 2026-08-23 T01 项目基础搭建 T02 俯视角摄像机 T03 角色基类与移动 T04 GAS集成基础 T10 手机端输入适配 T05 属性与伤害计算 T06 技能槽系统 T07 技能释放与战斗 T08 Buff/Debuff T09 怪物AI与战斗 T11 战斗UI与反馈 T12 集成测试与调优 基础搭建GAS核心战斗实现适配与集成 P0 开发阶段
3.3 关键路径
T01 → T03 → T04 → T05 → T07 → T09 → T12
关键路径上的任务决定了 P0 的最短完成时间。其中 T04(GAS 集成基础)和 T07(技能释放与战斗逻辑)是最复杂的两个任务,是整个 P0 的核心瓶颈。
4. 每个任务的预估复杂度
| 任务ID | 任务名称 | 复杂度 | 风险因素 |
|---|---|---|---|
| T01 | UE5 项目基础搭建 | ⭐⭐ 中等 | UE5.7 API 变更 |
| T02 | 俯视角摄像机系统 | ⭐ 简单 | 无重大风险 |
| T03 | 角色基类与移动系统 | ⭐⭐ 中等 | 移动同步细节 |
| T04 | GAS 集成基础 | ⭐⭐⭐ 复杂 | GAS 学习曲线、文档不足 |
| T05 | 属性系统与伤害计算 | ⭐⭐ 中等 | MMC 理解、公式调试 |
| T06 | 技能槽系统 | ⭐⭐ 中等 | GAS InputID 机制理解 |
| T07 | 技能释放与战斗逻辑 | ⭐⭐⭐ 复杂 | 多种技能形态、AbilityTask |
| T08 | Buff/Debuff 系统 | ⭐⭐ 中等 | GameplayEffect 叠加规则 |
| T09 | 怪物 AI 与战斗 | ⭐⭐ 中等 | AI 与 GAS 集成 |
| T10 | 手机端输入适配 | ⭐⭐ 中等 | 触摸输入与 GAS 配合 |
| T11 | 战斗 UI 与反馈 | ⭐⭐ 中等 | UMG 与 GAS 数据绑定 |
| T12 | 集成测试与调优 | ⭐⭐ 中等 | 多系统联调 |
复杂度分布:
- 简单: 1 个任务(8%)
- 中等: 9 个任务(75%)
- 复杂: 2 个任务(17%)
5. 技术风险与应对方案
5.1 GAS 学习曲线
| 项目 | 说明 |
|---|---|
| 风险等级 | 🔴 高 |
| 风险描述 | GAS 系统复杂度高,文档分散,API 设计不直观。独自开发没有团队支持,学习成本大 |
| 影响范围 | T04、T05、T06、T07、T08 全部依赖 GAS |
| 应对方案 | 1. 优先学习官方 ARPG 示例项目(ActionRPG / Lyra)的 GAS 实现 |
| 2. 从最简单的技能开始,逐步增加复杂度 | |
| 3. 记录 GAS 学习笔记,建立自己的知识库 | |
| 4. 遇到问题优先查 GAS 源码,注释比文档更准确 | |
| 5. 先实现一个最简单的伤害技能跑通全流程,再扩展 |
5.2 UE5.7 不稳定性
| 项目 | 说明 |
|---|---|
| 风险等级 | 🟡 中 |
| 风险描述 | UE5.7 为最新版本,可能存在未修复的 Bug、API 变更、文档滞后 |
| 影响范围 | 所有任务 |
| 应对方案 | 1. 接受不稳定性,遇到引擎 Bug 及时记录 |
| 2. 关注 UE5 GitHub Issues 和论坛 | |
| 3. 使用 Git 管理项目,每次重大变更前提交 | |
| 4. 避免使用过于前沿的引擎特性,优先使用成熟 API | |
| 5. 准备降级到 UE5.6 的预案 |
5.3 手机端性能
| 项目 | 说明 |
|---|---|
| 风险等级 | 🟡 中 |
| 风险描述 | 俯视角场景同屏角色多,技能特效消耗大,手机端可能无法达到 30FPS |
| 影响范围 | T10、T12 |
| 应对方案 | 1. P0 阶段使用简化特效,验证功能而非画质 |
| 2. 早期就进行手机端性能测试,建立性能基线 | |
| 3. 使用 Unreal Insights 进行性能分析 | |
| 4. 控制同屏角色数量(P0 阶段 10-20 个) | |
| 5. 使用 LOD、Instance 渲染、粒子数限制等优化手段 |
5.4 大规模 Replication 优化
| 项目 | 说明 |
|---|---|
| 风险等级 | 🟢 低(P0阶段) |
| 风险描述 | 500-1000 人在线的 Replication 优化是长期挑战,但 P0 阶段不需要解决 |
| 影响范围 | P0 阶段影响小,P1/P2 阶段影响大 |
| 应对方案 | 1. P0 阶段先确保 DS 模式下基本功能正常 |
| 2. 设计时遵循 Replication 最佳实践,预留优化空间 | |
| 3. P1 阶段实现 AOI 兴趣区域管理 | |
| 4. P2 阶段进行大规模压力测试和优化 |
5.5 独自开发风险
| 项目 | 说明 |
|---|---|
| 风险等级 | 🟡 中 |
| 风险描述 | 独自开发没有代码审查,容易陷入设计过度或实现缺陷;长时间开发容易动力不足 |
| 影响范围 | 所有任务 |
| 应对方案 | 1. 严格遵循文档驱动开发,先设计后实现 |
| 2. 每个里程碑设置明确的验收标准 | |
| 3. 定期回顾和重构,保持代码质量 | |
| 4. 记录开发日志,追踪进度和问题 | |
| 5. 开发周期不限,避免赶工导致质量下降 |
6. 里程碑节点
里程碑 1: 基础框架就绪
目标: 项目能运行,角色能移动,摄像机正常
包含任务: T01 + T02 + T03
验收标准:
- UE5 项目编译运行
- 俯视角摄像机正常工作
- 角色能通过点击/摇杆/WASD 移动
- DS 模式下移动同步正常
- 角色有基础 Idle/Run 动画
交付物: 可运行的基础场景,角色可移动
里程碑 2: GAS 核心打通
目标: 技能能释放,有 CD 和蓝耗,能造成伤害
包含任务: T04 + T05 + T06
验收标准:
- ASC 正确初始化和复制
- AttributeSet 包含核心属性
- 能通过 GM 命令学习技能
- 技能能装配到 5 个槽位
- 技能能释放,有施法动画
- 技能有 CD,CD 期间不可释放
- 技能有蓝耗,蓝量不足不可释放
- 伤害计算公式正确
- 伤害飘字显示
交付物: 角色能释放技能打木桩(静态目标)
里程碑 3: 战斗闭环
目标: 能打怪,怪物能反击,完整的战斗循环
包含任务: T07 + T08 + T09
验收标准:
- 多种技能形态正常工作(单体/AOE/弹道/方向)
- Buff/Debuff 正确施加和移除
- 控制效果(眩晕/沉默/定身)正确生效
- 怪物能巡逻、追击、攻击
- 怪物能被击杀和重生
- 完整的战斗循环:接近→释放技能→怪物受伤→怪物反击→击杀/死亡
交付物: 完整的战斗原型,能打怪
里程碑 4: P0 完成
目标: 手机端可玩,所有 P0 功能验收通过
包含任务: T10 + T11 + T12
验收标准:
- 手机端虚拟摇杆和技能按钮正常操作
- PC 端键鼠操作正常
- 战斗 UI 完整(血条/蓝条/CD/飘字/Buff图标)
- DS 模式下所有功能正常
- 手机端达到 30FPS(中端设备)
- 无严重 Bug
- P0 全部 13 项验收标准通过
交付物: 可运行的 P0 战斗原型,手机端可玩
附录 A: P0 阶段技术决策记录
| 决策 | 选择 | 备选 | 理由 |
|---|---|---|---|
| ASC 挂载位置 | PlayerState | Character | 角色重建不丢失技能数据 |
| 技能数据来源 | DataTable | 硬编码/Blueprint | 配置驱动,易于扩展 |
| 输入系统 | EnhancedInput | 旧InputSystem | UE5 推荐方案,更灵活 |
| 移动方案 | CharacterMovementComponent | 自定义移动 | 内置客户端预测和同步 |
| 伤害计算 | GameplayEffectExecution | 自定义RPC | GAS 原生方案,与Buff系统集成 |
| 弹道实现 | Actor + ProjectileMovement | 纯计算 | 视觉表现更好,但需注意性能 |
| AI 系统 | BehaviorTree | 状态机 | 可视化编辑,易于调试 |
| 摄像机 | SpringArm + Camera | 自定义CameraManager | 简单可靠 |
附录 B: P0 阶段 GM 命令
| 命令 | 功能 | 用途 |
|---|---|---|
GM_LearnSkill <SkillID> |
学习指定技能 | 测试技能系统 |
GM_SetLevel <Level> |
设置角色等级 | 测试属性计算 |
GM_AddMP <Amount> |
增加蓝量 | 测试技能释放 |
GM_SpawnMonster <MonsterID> <Count> |
生成怪物 | 测试战斗 |
GM_GodMode |
无敌模式 | 测试技能效果 |
GM_ResetCooldown |
重置所有CD | 测试技能连招 |
GM_Damage <Amount> |
对自身造成伤害 | 测试死亡/复活 |
附录 C: P0 阶段测试用例
C.1 移动测试
| 用例ID | 测试内容 | 预期结果 |
|---|---|---|
| MOV-001 | PC端WASD移动 | 角色按方向移动 |
| MOV-002 | PC端右键点击移动 | 角色移动到目标点 |
| MOV-003 | 手机端虚拟摇杆移动 | 角色按摇杆方向移动 |
| MOV-004 | DS模式移动同步 | 服务端和客户端位置一致 |
| MOV-005 | 移动时角色朝向 | 角色面向移动方向 |
C.2 技能测试
| 用例ID | 测试内容 | 预期结果 |
|---|---|---|
| SKL-001 | 释放技能1 | 技能正常释放,有动画和特效 |
| SKL-002 | 释放后CD | 技能进入CD,按钮变灰 |
| SKL-003 | CD结束 | CD结束,按钮恢复可用 |
| SKL-004 | 蓝量不足释放 | 提示蓝量不足,技能不释放 |
| SKL-005 | 5个技能分别释放 | 5个技能都能正常释放 |
| SKL-006 | 技能装配/换装 | 能更换技能槽中的技能 |
| SKL-007 | 眩晕时释放技能 | 无法释放技能 |
| SKL-008 | 沉默时释放技能 | 无法释放技能 |
C.3 战斗测试
| 用例ID | 测试内容 | 预期结果 |
|---|---|---|
| CMB-001 | 技能命中怪物 | 怪物受伤,显示伤害飘字 |
| CMB-002 | 怪物HP归零 | 怪物死亡 |
| CMB-003 | 怪物追击玩家 | 怪物向玩家移动 |
| CMB-004 | 怪物攻击玩家 | 玩家受伤 |
| CMB-005 | Buff施加 | Buff图标显示,属性变化 |
| CMB-006 | Buff到期 | Buff图标消失,属性恢复 |
| CMB-007 | 控制效果 | 眩晕/沉默/定身正确生效 |
| CMB-008 | DoT伤害 | 持续伤害每跳正确 |