角色能力,存档
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
# 架构文档索引 / Design 覆盖矩阵
|
||||
|
||||
> **建立日期**:2026-04-29
|
||||
> **对比对象**:`Docs/Design/`(74 份设计文档)←→ `Docs/Architecture/`(24 份架构文档)
|
||||
> **建立日期**:2026-04-29 **最后更新**:2026-05-17
|
||||
> **对比对象**:`Docs/Design/`(74 份设计文档)←→ `Docs/Architecture/`(25 份架构文档)
|
||||
> **用途**:查询某 Design 文档对应哪份 Architecture 文档及章节;开发 code review checklist
|
||||
|
||||
---
|
||||
@@ -37,10 +37,10 @@
|
||||
|---|------------|-----------------|------|------|
|
||||
| 01 | InputSystem | 04_InputModule | ✅ | 完整(含 RebindPanel/ConflictDetector §6) |
|
||||
| 02 | CameraSystem | **17_CameraModule** | ✅ | CameraStateController/RoomVisibleArea/CameraTriggerZone 全部定义 |
|
||||
| 03 | PlayerSystem | 05_PlayerModule | ✅ | 完整(含 SwimState、ShieldComponent 引用) |
|
||||
| 03 | PlayerSystem | 05_PlayerModule · **25_CharacterArchitectureOverview** | ✅ | 完整(含 SwimState、ShieldComponent 引用);25 为跨模块全景图 |
|
||||
| 04 | CombatSystem | 06_CombatModule | ✅ | 完整(含 ProjectileConfigSO/LinearProjectile/ParryableProjectile) |
|
||||
| 05 | ParrySystem | 06_CombatModule §4 | ✅ | 完整 |
|
||||
| 06 | EnemySystem | 07_EnemyModule | ✅ | 完整(含 LootTableSO/LootResolver/LootPickup) |
|
||||
| 06 | EnemySystem | 07_EnemyModule · **25_CharacterArchitectureOverview** | ✅ | 完整(含 LootTableSO/LootResolver/LootPickup);25 为跨模块全景图 |
|
||||
| 07 | FeedbackSystem | **18_VFXFeedbackModule** | ✅ | FeedbackConfigSO/VFXPool/HitFXSpawner 全部定义 |
|
||||
| 08 | WorldSystem | 08_WorldModule | ✅ | 完整(含 §11-15 MovingPlatform/MagicWall/SoftTerrain/PhantomInteractable) |
|
||||
| 09 | EditorExtensions | — | 📖 | 编辑器工具指南,无需独立 Architecture |
|
||||
|
||||
638
Docs/Architecture/25_CharacterArchitectureOverview.md
Normal file
638
Docs/Architecture/25_CharacterArchitectureOverview.md
Normal file
@@ -0,0 +1,638 @@
|
||||
# 25 · 角色系统架构全景图
|
||||
|
||||
> **命名空间** `BaseGames.Player`、`BaseGames.Player.States`、`BaseGames.Enemies`、`BaseGames.Enemies.AI`、`BaseGames.Boss`、`BaseGames.Combat`
|
||||
> **路径** `Assets/_Game/Scripts/Player/`、`Assets/_Game/Scripts/Enemies/`、`Assets/_Game/Scripts/Combat/`
|
||||
> **关联文档** [05_PlayerModule](05_PlayerModule.md) · [06_CombatModule](06_CombatModule.md) · [07_EnemyModule](07_EnemyModule.md) · [09_ProgressionModule](09_ProgressionModule.md) · [23_BossSkillModule](23_BossSkillModule.md)
|
||||
> **建立日期** 2026-05-17
|
||||
|
||||
本文档是跨模块的**角色系统实现全景图**,侧重三类角色(玩家 / 小怪 / Boss)在 Scene 中的节点结构、脚本职责划分、子系统数据流与相互协作关系。各模块深度细节请参阅上方关联文档。
|
||||
|
||||
---
|
||||
|
||||
## 目录
|
||||
|
||||
1. [程序集依赖总览](#1-程序集依赖总览)
|
||||
2. [玩家(Player)](#2-玩家-player)
|
||||
- 2.1 [Scene 节点结构](#21-scene-节点结构)
|
||||
- 2.2 [FSM 状态机](#22-fsm-状态机)
|
||||
- 2.3 [数值体系 PlayerStats](#23-数值体系-playerstats)
|
||||
- 2.4 [形态系统 Form System](#24-形态系统-form-system)
|
||||
- 2.5 [武器系统 Weapon System](#25-武器系统-weapon-system)
|
||||
- 2.6 [技能系统 Skill System](#26-技能系统-skill-system)
|
||||
- 2.7 [能力解锁 AbilityType Flags](#27-能力解锁-abilitytype-flags)
|
||||
- 2.8 [装备护符系统 Equipment / Charm](#28-装备护符系统-equipment--charm)
|
||||
3. [小怪(Enemy)](#3-小怪-enemy)
|
||||
- 3.1 [Scene 节点结构](#31-scene-节点结构)
|
||||
- 3.2 [状态机(POCO 状态)](#32-状态机poco-状态)
|
||||
- 3.3 [AI — Behavior Designer 节点库](#33-ai--behavior-designer-节点库)
|
||||
4. [Boss](#4-boss)
|
||||
- 4.1 [继承关系](#41-继承关系)
|
||||
- 4.2 [Scene 节点结构](#42-scene-节点结构)
|
||||
- 4.3 [技能执行流 BossSkillSO + BossSkillExecutor](#43-技能执行流-bossskillso--bossskillexecutor)
|
||||
- 4.4 [阶段切换](#44-阶段切换)
|
||||
5. [共享战斗层 Combat Module](#5-共享战斗层-combat-module)
|
||||
- 5.1 [核心接口](#51-核心接口)
|
||||
- 5.2 [HitBox → HurtBox 伤害流水线](#52-hitbox--hurtbox-伤害流水线)
|
||||
- 5.3 [状态效果系统](#53-状态效果系统)
|
||||
6. [数据驱动 ScriptableObject 体系](#6-数据驱动-scriptableobject-体系)
|
||||
7. [架构核心原则总结](#7-架构核心原则总结)
|
||||
|
||||
---
|
||||
|
||||
## 1. 程序集依赖总览
|
||||
|
||||
```
|
||||
BaseGames.Core
|
||||
BaseGames.Core.Events
|
||||
BaseGames.Core.Save
|
||||
│
|
||||
↓
|
||||
BaseGames.Combat ──────────────────────────────────────────────┐
|
||||
BaseGames.Combat.StatusEffects │
|
||||
│ │
|
||||
↓ ↓
|
||||
BaseGames.Player BaseGames.Enemies │
|
||||
BaseGames.Player.States BaseGames.Enemies.AI │
|
||||
BaseGames.Skills BaseGames.Enemies.Navigation │
|
||||
BaseGames.Equipment BaseGames.Enemies.Boss.Patterns │
|
||||
BaseGames.Parry │
|
||||
└────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
**原则**:下层程序集不得引用上层。`BaseGames.Combat` 仅依赖 `Core`,`Player` / `Enemies` 均依赖 `Combat` 而不互相依赖。跨层通信一律通过 `EventChannelSO` 或 `ServiceLocator` 完成。
|
||||
|
||||
---
|
||||
|
||||
## 2. 玩家(Player)
|
||||
|
||||
### 2.1 Scene 节点结构
|
||||
|
||||
```
|
||||
[Player] ← 根节点(空 GameObject,逻辑锚点)
|
||||
│
|
||||
├── PLY_Player ← 核心行为节点(所有主要组件挂于此)
|
||||
│ │
|
||||
│ │── PlayerController ← FSM 协调器(DefaultExecOrder=-100)
|
||||
│ │ IDamageable + IPoiseSource
|
||||
│ │── PlayerMovement ← 物理移动封装(DefaultExecOrder=-200)
|
||||
│ │ Rigidbody2D 操作 / 土狼时间 / 地面检测
|
||||
│ │── PlayerStats ← 数值管理(HP/灵魂/灵气/灵泉/LingZhu/能力Flags)
|
||||
│ │ ISaveable + IRestoreOnSave + IRewardTarget
|
||||
│ │── PlayerCombat ← 连击段 DamageSource 切换 / HitBox 激活接口
|
||||
│ │── FormController ← 三形态状态机(天魂/地魂/命魂)
|
||||
│ │── WeaponManager ← 依形态切换 ActiveWeapon + 实例化 HitBoxPrefab
|
||||
│ │── SkillManager ← 技能槽管理 / 冷却计时 / 资源消耗
|
||||
│ │── SpringSystem ← 灵泉治疗充能系统
|
||||
│ │── ParrySystem ← 弹反时序窗口(见 CombatModule §10)
|
||||
│ │── ShieldComponent ← 护盾吸收(IShieldable)
|
||||
│ │── PlayerWallDetector ← 蹬墙感应(贴墙方向 / 触发 WallSlide 条件)
|
||||
│ │── StatusEffectManager ← IStatusEffectable(火 / 毒 / 硬直效果接收)
|
||||
│ │── EquipmentManager ← 护符槽管理(Notch 容量体系)
|
||||
│ │── SkillModifierRegistry ← 护符注入的技能修改器(冷却/费用调节)
|
||||
│ │── AnimancerComponent ← 动画驱动
|
||||
│ │ Layer 0:全身状态动画(移动/攻击/受伤/死亡)
|
||||
│ │ Layer 1(Overlay):叠加层动画(灵泉/法术)
|
||||
│ │── InputBuffer ← 输入缓冲(RequireComponent by PlayerController)
|
||||
│ │── Rigidbody2D ← Dynamic,FreezeRotation,插值关闭
|
||||
│ └── CapsuleCollider2D ← isTrigger=false,碰撞体
|
||||
│
|
||||
├── HurtBox ← 受击盒(isTrigger=true,Layer=PlayerHurtBox)
|
||||
│ └── HurtBox.cs GetComponentInParent<IDamageable>() 注入
|
||||
│
|
||||
├── [WeaponSocket] ← HitBox 挂载点(WeaponManager 实例化目标)
|
||||
│ └── WeaponHitBoxInstance ← 由 WeaponSO.hitBoxPrefab 动态实例化/销毁
|
||||
│ └── HitBox ← Layer=PlayerHitBox,isTrigger=true
|
||||
│
|
||||
├── GroundCheck ← 地面检测 Transform(BoxOverlapNonAlloc 起点)
|
||||
│
|
||||
└── SkillHitBox_Slot ← 技能命中盒挂载点(SkillHitBoxInstance 实例化)
|
||||
```
|
||||
|
||||
> **命名规范**:根节点用 `[Player]`(方括号标识逻辑组节点),具体 GameObject 用 `PLY_` 前缀(PascalCase),子功能节点用 `[WeaponSocket]` 括号命名,检测点用描述性名称 `GroundCheck`。
|
||||
|
||||
---
|
||||
|
||||
### 2.2 FSM 状态机
|
||||
|
||||
`PlayerController` 持有 `Dictionary<Type, PlayerStateBase>` 状态字典,每帧驱动 `_currentState` 的 `OnStateUpdate / OnStateFixedUpdate`,并在 `TransitionTo<T>()` 时依次调用 `OnStateExit / OnStateEnter`。
|
||||
|
||||
```
|
||||
PlayerStateBase(抽象 POCO,不继承 MonoBehaviour)
|
||||
│ OnStateEnter / OnStateUpdate / OnStateFixedUpdate / OnStateExit
|
||||
│ virtual bool IsInvincible → DashState override true
|
||||
│ #if UNITY_EDITOR ValidTransitions → 转换白名单(调试用)
|
||||
│
|
||||
├── IdleState 落地重置 AirJumps;出口:Run / Jump / Dash / Attack / Spring
|
||||
├── RunState 水平位移 + 朝向;出口同 Idle + WallSlide
|
||||
├── JumpState 可变跳跃(松键截断 Y 速度)+ 土狼时间消耗
|
||||
├── FallState FallMultiplier 下落加速;贴墙→WallSlide
|
||||
├── DashState IsInvincible=true;地面冲刺 dashDistance / 冷却 dashCooldown
|
||||
├── AerialDashState 空中冲刺消耗 _aerialDashCount;落地重置次数
|
||||
├── WallSlideState wallSlideSpeed 减速下滑;Space → WallJump
|
||||
├── WallJumpState 弹离墙壁 X+Y 分量;wallJumpLockTime 方向锁定
|
||||
├── AttackState 3 段连击(Combo Window 计时);每段调 SetComboSegmentSource
|
||||
├── AirAttackState 空中攻击,HitBox 朝正前方激活
|
||||
├── UpAttackState 上劈,HitBox 朝正上方激活
|
||||
├── DownAttackState 下劈 + OnDownHitConfirmed → trampolineForce 蹦跳反弹
|
||||
├── HurtState hurtDuration 硬直;Initialize(DamageInfo) 注入伤害信息
|
||||
├── DeadState 冻结 Rigidbody2D;触发 _onPlayerDied EventChannelSO
|
||||
├── ParryState 弹反时序窗口(与 ParrySystem 协作)
|
||||
├── SpringState 治疗动画;高优先级保护窗口防打断
|
||||
└── SwimState 液体中自由移动(需解锁 AbilityType.Swim)
|
||||
```
|
||||
|
||||
**关键设计决策**:
|
||||
- 状态为 POCO 类,不持有 MonoBehaviour 生命周期开销,也不产生 GC(Dictionary 在 `Awake` 一次性填充)。
|
||||
- `PlayerController` 在 `TakeDamage` 中先查询 `_currentState.IsInvincible`,后查 `_stats.IsInvincible`(无敌帧窗口),双层保护互不依赖。
|
||||
- `#if UNITY_EDITOR` 转换白名单在 Editor 模式下帮助捕获非法状态跳转,运行时零开销剔除。
|
||||
|
||||
---
|
||||
|
||||
### 2.3 数值体系 PlayerStats
|
||||
|
||||
```
|
||||
PlayerStats
|
||||
├── ISaveable → 存读档(SaveManager 调用)
|
||||
├── IRestoreOnSave → 存档触发时恢复(如灵泉数量)
|
||||
└── IRewardTarget → RewardSO 颁奖接口(避免 Quest 直接依赖 Player 程序集)
|
||||
|
||||
运行时字段
|
||||
├── HP / MaxHP TakeDamage / Heal / InvincibleTimer
|
||||
├── SoulPower / Max 法术资源(攻击命中积累)
|
||||
├── SpiritPower / Max 灵气资源(自动回复,SpiriRegenTimer 驱动)
|
||||
├── SpringCharges / Max 灵泉治疗充能槽(SpringSystem 消耗)
|
||||
├── LingZhu 货币(击杀 / 收集 / 购买)
|
||||
├── AbilityType _unlockedAbilities [Flags] uint 位图,HasAbility(flag) O(1) 查询
|
||||
│
|
||||
├── 护符数值修改器
|
||||
│ ├── _flatModifiers[StatType] 固定值加成(如 +5 MaxHP)
|
||||
│ └── _percentModifiers[StatType] 百分比加成(如 +20% SoulPower)
|
||||
│
|
||||
├── AnimatorSpeedMultiplier 1f + _animatorSpeedBonus(护符注入攻速)
|
||||
├── SoulCostReduction 法术费用减免(护符叠加)
|
||||
│
|
||||
└── 难度缩放
|
||||
订阅 DifficultyChangedEventChannel
|
||||
→ 按当前 HP 比例重算 MaxHP(保持 HP 比例不跳变)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2.4 形态系统 Form System
|
||||
|
||||
```
|
||||
FormConfigSO(资产,Inspector 拖入 FormController)
|
||||
└── FormSO[] forms
|
||||
├── FormSO { formId="Form_Sky", formType=Sky, defaultWeapon=WeaponSO_SkyBlade }
|
||||
├── FormSO { formId="Form_Earth", formType=Earth, defaultWeapon=WeaponSO_EarthHammer }
|
||||
└── FormSO { formId="Form_Death", formType=Death, defaultWeapon=WeaponSO_DeathScythe }
|
||||
|
||||
FormController.SwitchForm(FormType)
|
||||
│
|
||||
├─ 1. IntEventChannelSO _onFormChanged.Raise(index)
|
||||
│ → SaveSystem 持久化 ActiveFormId
|
||||
│ → UI HUD 更新形态图标
|
||||
│
|
||||
├─ 2. C# event OnFormChanged
|
||||
│ → WeaponManager.HandleFormChanged() ← OnEnable 订阅,OnDisable 退订
|
||||
│
|
||||
└─ 3. VoidEventChannelSO _onSkillSetChanged.Raise()
|
||||
→ SkillHUD 刷新当前形态技能组图标
|
||||
```
|
||||
|
||||
**护符 Override 流**:护符装备时调用 `WeaponManager.SetOverride(formId, weaponSO)` 覆盖指定形态的默认武器;卸下时调用 `ClearOverride(formId)` 还原,无需修改 `FormSO` 资产。
|
||||
|
||||
---
|
||||
|
||||
### 2.5 武器系统 Weapon System
|
||||
|
||||
```
|
||||
WeaponSO(纯数据 SO)
|
||||
├── 连击动画 attack1/2/3/air/up/downClip (Animancer ClipTransition)
|
||||
├── 伤害来源 attack1/2/3/air/up/downSource (DamageSourceSO,各段独立配置)
|
||||
├── hitBoxPrefab → WeaponHitBoxInstance + HitBox 碰撞体
|
||||
└── soulPowerGain 命中后灵魂增加量(覆盖默认值)
|
||||
|
||||
WeaponManager(运行时)
|
||||
│
|
||||
│ FormController.OnFormChanged ──►
|
||||
│ ApplyWeapon(FormSO)
|
||||
│ ├── 检查 _overrides[formId](护符 Override 优先)
|
||||
│ └── SetDirectWeapon(WeaponSO)
|
||||
│ ├── Destroy 旧 HitBox GameObject
|
||||
│ ├── Instantiate 新 hitBoxPrefab 到 [WeaponSocket]
|
||||
│ └── OnWeaponChanged.Invoke(newWeapon)
|
||||
│ └── PlayerCombat 订阅:刷新 _currentHitBoxInstance 引用
|
||||
|
||||
PlayerCombat
|
||||
│
|
||||
├── SetComboSegmentSource(comboIndex) ← AttackState 每段开始时调用
|
||||
│ comboIndex 0/1/2 → attack1/2/3Source → HitBoxInstance.SetDamageSource
|
||||
│
|
||||
├── EnableWeaponHitBox(AttackDirection) ← 动画事件 / State 调用
|
||||
│ GetSourceByDir → Activate(dir, source, ownerTransform)
|
||||
│
|
||||
└── OnDownHitConfirmed ← DownAttackState 订阅
|
||||
命中时向上施加 trampolineForce
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2.6 技能系统 Skill System
|
||||
|
||||
```
|
||||
FormSkillSO(CreateAssetMenu: BaseGames/Skills/FormSkill)
|
||||
│
|
||||
├── Identity skillId / displayNameKey / icon
|
||||
├── Resource resourceType(SoulPower | SpiritPower)/ baseCost / cooldown
|
||||
├── Animation castAnimation(ClipTransition)/ castLockDuration(施放锁定秒数)
|
||||
├── Effect effectType(MeleeAoE / Projectile / BarrierAura / WraithDash /
|
||||
│ GroundDive / DragonKick / ShadowDecoy / DelayedExplosion)
|
||||
├── Projectile projectileConfig / isHoming / holdForContinuous
|
||||
├── Dash dashForce / dashDuration / isInvincibleDuringDash
|
||||
├── Explosion explosionDelay / explosionRadius
|
||||
├── Feedback castFeedback(FeedbackPresetSO)
|
||||
└── hitBoxPrefab → 近战/爆炸技能命中盒(SkillHitBoxInstance + HitBox)
|
||||
|
||||
SkillManager(BaseGames.Skills 程序集)
|
||||
├── FormSkillSO[] _slots 按 SkillSlotNames 枚举索引
|
||||
├── SkillModifierRegistry _mods 护符注入的冷却/费用修改器
|
||||
├── float[] _cooldownTimers 每槽独立冷却计时
|
||||
└── ExecuteSkill(slotIndex)
|
||||
├── 检查冷却 / 资源(baseCost - SoulCostReduction)
|
||||
├── PlayerStats.SpendResource(type, cost)
|
||||
├── Animancer.Play(castAnimation) + 锁定输入 castLockDuration 秒
|
||||
└── 依 effectType 分支执行:投射物 / AoE HitBox / Dash / 爆炸延迟 …
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2.7 能力解锁 AbilityType Flags
|
||||
|
||||
```csharp
|
||||
[Flags] enum AbilityType : uint
|
||||
{
|
||||
None = 0,
|
||||
// 移动
|
||||
WallCling = 1u << 0, // 贴墙悬挂
|
||||
WallJump = 1u << 1, // 墙跳
|
||||
Dash = 1u << 2, // 地面冲刺
|
||||
AirDash = 1u << 3, // 空中二段冲刺
|
||||
DoubleJump = 1u << 4, // 二段跳
|
||||
SuperJump = 1u << 5, // 聚气超跳
|
||||
Swim = 1u << 6, // 液体游泳
|
||||
Dive = 1u << 7, // 下劈
|
||||
// 法术
|
||||
Spell1/2/3 = 1u << 8~10,
|
||||
// 形态
|
||||
SpiritForm = 1u << 11,
|
||||
SpiritDash = 1u << 12,
|
||||
// 战斗
|
||||
Parry = 1u << 13,
|
||||
ChargeAttack = 1u << 14,
|
||||
DownSlash = 1u << 15,
|
||||
// 互动
|
||||
Interact = 1u << 16,
|
||||
FastTravel = 1u << 17,
|
||||
// 强化
|
||||
InvincibleDash = 1u << 18, // Dash 无敌帧强化
|
||||
}
|
||||
```
|
||||
|
||||
- `PlayerStats.HasAbility(flag)` → O(1) 位与运算,无分支列表遍历。
|
||||
- 状态类在 `OnStateEnter` 或 `GetNextState` 中调用 `Stats.HasAbility(AbilityType.WallJump)` 等判断是否允许转换。
|
||||
- `AbilityManager`(Progression 模块)解锁时调用 `PlayerStats.UnlockAbility(flag)` 并写入存档。
|
||||
|
||||
---
|
||||
|
||||
### 2.8 装备护符系统 Equipment / Charm
|
||||
|
||||
```
|
||||
CharmSO
|
||||
├── notchCost Notch 槽位消耗量
|
||||
└── ICharmEffect[] effects
|
||||
├── OnEquip(EquipmentContext)
|
||||
│ 可修改:PlayerStats 数值 / WeaponManager Override / SkillModifierRegistry
|
||||
└── OnUnequip(EquipmentContext)
|
||||
还原所有修改(避免副作用残留)
|
||||
|
||||
EquipmentContext(注入包,Awake 时构建)
|
||||
├── PlayerStats
|
||||
├── PlayerFeedback
|
||||
├── SkillModifierRegistry
|
||||
└── WeaponManager
|
||||
|
||||
EquipmentManager(ISaveable)
|
||||
├── _currentNotchCapacity 初始值来自 EquipmentConfigSO,可解锁扩容
|
||||
├── _usedNotches 缓存值(避免每次 LINQ Sum)
|
||||
├── TryEquipCharm(charm) 容量检查 → fx.OnEquip → 事件广播
|
||||
├── UnequipCharm(charm) fx.OnUnequip → 事件广播
|
||||
│
|
||||
└── 事件频道
|
||||
├── CharmEventChannelSO _onCharmEquipped
|
||||
├── CharmEventChannelSO _onCharmUnequipped
|
||||
└── VoidEventChannelSO _onEquipmentChanged → UI 刷新
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. 小怪(Enemy)
|
||||
|
||||
### 3.1 Scene 节点结构
|
||||
|
||||
```
|
||||
[Enemy_SpiderGuard] ← 根节点(挂 EnemyBase 或具体子类)
|
||||
│ EnemyBase(或 RangedEnemy / FlyingEnemy)
|
||||
│ ├── EnemyStats 运行时 HP / Defense / AttackCooldown
|
||||
│ │ Initialize(EnemyStatsSO) 注入;难度缩放订阅
|
||||
│ ├── EnemyMovement Rigidbody2D 封装
|
||||
│ │ MoveHorizontal / FaceTarget / Knockback / JumpTo
|
||||
│ ├── EnemyCombat 攻击范围 / 伤害触发(近战/弹幕调度)
|
||||
│ ├── EnemyFeedback 受击闪烁 / 音效 / HitStop / 受击特效
|
||||
│ ├── EnemyPoiseComponent IPoiseSource 实现(霸体等级声明)
|
||||
│ ├── AnimancerComponent
|
||||
│ ├── BehaviorTree Opsive Behavior Designer 资产绑定
|
||||
│ └── EnemyNavAgent IPathAgent 实现(PathBerserker2D waypoint/jump 寻路)
|
||||
│
|
||||
├── HurtBox isTrigger=true,Layer=EnemyHurtBox
|
||||
│
|
||||
├── HitBox_Melee isTrigger=true,Layer=EnemyHitBox
|
||||
│ └── HitBox.cs
|
||||
│
|
||||
└── BodyContactDamage(可选) 碰撞体直接造成接触伤害
|
||||
```
|
||||
|
||||
**子类扩展**:
|
||||
- `RangedEnemy`:额外持有 `ProjectileManager` 引用 / 弹幕发射逻辑覆盖
|
||||
- `FlyingEnemy`:禁用地面检测,使用独立飞行移动逻辑
|
||||
|
||||
---
|
||||
|
||||
### 3.2 状态机(POCO 状态)
|
||||
|
||||
```
|
||||
EnemyStateType(枚举)+ Dictionary<EnemyStateType, IEnemyState>
|
||||
|
||||
IEnemyState
|
||||
├── StateType 枚举值(字典键)
|
||||
├── Enter(EnemyBase owner)
|
||||
└── Exit(EnemyBase owner)
|
||||
|
||||
具体状态
|
||||
├── EnemyControlledState 正常 AI 驱动(Behavior Tree 运行中)
|
||||
├── EnemyHurtState 受击硬直(播放受击动画,短暂停止 BD)
|
||||
├── EnemyStaggerState 霸体破防强硬直(较长,期间 BD 暂停)
|
||||
└── EnemyDeadState 死亡(IsAlive=false / 关闭碰撞体 / 播放死亡动画 / 掉落战利品)
|
||||
```
|
||||
|
||||
**TakeDamage 伤害判定流**:
|
||||
|
||||
```
|
||||
EnemyBase.TakeDamage(DamageInfo)
|
||||
├── if Dead → return
|
||||
├── EnemyStats.TakeDamage(finalDamage)
|
||||
├── EnemyFeedback.OnHit(info) 受击视觉/音效反馈
|
||||
├── if HP <= 0 → Die()
|
||||
└── else
|
||||
├── 比较 info.PoiseBreak vs EnemyPoiseComponent.CurrentPoiseLevel
|
||||
├── PoiseBreak ≥ CurrentPoise → ForceState(Stagger)
|
||||
├── PoiseBreak < CurrentPoise → ForceState(Hurt)(仅 Feedback,不打断 BD)
|
||||
└── 霸体完全抵抗 → 仅 Feedback(受击特效,BD 不中断)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3.3 AI — Behavior Designer 节点库
|
||||
|
||||
所有 BD 节务类位于 `Assets/_Game/Scripts/Enemies/AI/`,前缀 `BD_`:
|
||||
|
||||
| 分类 | 任务类 | 功能 |
|
||||
|------|--------|------|
|
||||
| **感知** | `BD_IsPlayerVisible` | BatchLOSSystem 查询视线(批量 Raycast,Burst 加速) |
|
||||
| | `BD_IsPlayerInRange` | `EnemyStats.SqrDistanceToPlayer < range²`(避免 sqrt) |
|
||||
| | `BD_IsHPBelow` | `EnemyStats.CurrentHP / MaxHP < ratio` |
|
||||
| | `BD_IsNearEdge` | 边缘检测(防坠落巡逻) |
|
||||
| | `BD_IsGrounded` | 地面状态查询 |
|
||||
| | `BD_IsStateMatch` | 查询当前 EnemyStateType |
|
||||
| **移动** | `BD_MoveTo` | 目标点直线移动(EnemyNavAgent) |
|
||||
| | `BD_MoveToPlayer` | 追击玩家位置 |
|
||||
| | `BD_Patrol` | 往返巡逻(PatrolPoints[] 路径点) |
|
||||
| | `BD_JumpTo` | 抛物线跳跃到目标位置 |
|
||||
| | `BD_TeleportTo` | 瞬移(Boss 阶段过渡用) |
|
||||
| | `BD_StopMovement` | 停止水平速度 |
|
||||
| | `BD_FaceTarget` | 朝向玩家/目标 |
|
||||
| **战斗** | `BD_Attack` | 触发近战攻击(EnemyCombat) |
|
||||
| | `BD_CanAttack` | 攻击冷却检查(AttackCooldownTimer <= 0) |
|
||||
| | `BD_SpawnProjectile` | 生成投射物(ProjectileManager) |
|
||||
| | `BD_TelegraphAttack` | 激活 TelegraphSystem 预兆提示 |
|
||||
| **特殊** | `BD_SummonMinions` | 召唤小怪(Boss 用) |
|
||||
| | `BD_EnterPhase` | 调用 BossBase.EnterPhase(phase) |
|
||||
| | `BD_SetAlert` | 设置警觉状态标记(影响巡逻/追击切换) |
|
||||
| **动画** | `BD_PlayAnimation` | Animancer 播放指定 Clip |
|
||||
| | `BD_WaitForAnimation` | 等待当前动画播放完毕 |
|
||||
| **时序** | `BD_Wait` | 等待固定秒数 |
|
||||
| | `BD_WaitRandom` | 等待随机时长(min~max) |
|
||||
|
||||
`BatchLOSSystem`:单例系统,每帧收集所有 `ILOSRequester` 的视线查询,批量执行 Raycast(可选 Burst Job),结果写回各敌人缓存,避免 N 个敌人同帧各自独立 Physics2D.Raycast 的性能峰值。
|
||||
|
||||
---
|
||||
|
||||
## 4. Boss
|
||||
|
||||
### 4.1 继承关系
|
||||
|
||||
```
|
||||
MonoBehaviour
|
||||
└── EnemyBase(IDamageable / ILOSRequester)
|
||||
└── BossBase
|
||||
├── 多阶段切换:EnterPhase(int) + BossPhaseEventChannelSO 广播
|
||||
├── IsHPBelow(float ratio) → BD_IsHPBelow 轮询条件
|
||||
└── override Die() → _onBossFightEnded.Raise(true)
|
||||
└── [具体 Boss 类]
|
||||
override EnterPhase → 额外过渡逻辑(动画/无敌帧/BD 子树切换)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 4.2 Scene 节点结构
|
||||
|
||||
```
|
||||
[Boss_XxxGuardian]
|
||||
│ BossBase(具体 Boss 脚本,继承 BossBase)
|
||||
│ ├── EnemyStats / EnemyMovement / EnemyCombat / EnemyFeedback
|
||||
│ ├── BossSkillExecutor 接收 BD/Orchestrator 指令,执行 BossSkillSO 协程
|
||||
│ ├── WeakPointSystem 弱点激活窗口管理(BossSkillExecutor 技能后开启)
|
||||
│ ├── TelegraphSystem 攻击预兆提示(激光标线 / 范围高亮 / 地面警示)
|
||||
│ ├── BehaviorTree 含 BD_EnterPhase 的行为树资产
|
||||
│ └── AnimancerComponent
|
||||
│
|
||||
├── HurtBox 主体受击盒(Layer=EnemyHurtBox)
|
||||
│
|
||||
├── WeakPoint_Head 弱点受击盒
|
||||
│ └── HurtBox(弱点专属,WeakPointSystem 控制激活/关闭)
|
||||
│
|
||||
├── HitBox_Slam 近战攻击 HitBox(Layer=EnemyHitBox)
|
||||
├── HitBox_Sweep 横扫 HitBox(可与 BossSkillSO 绑定)
|
||||
│
|
||||
└── BossArenaBlocker(可选) 竞技场封锁触发器(Boss 战开始时封门)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 4.3 技能执行流 BossSkillSO + BossSkillExecutor
|
||||
|
||||
```
|
||||
BossSkillSO(CreateAssetMenu: BaseGames/Boss/BossSkill)
|
||||
├── skillId / displayName
|
||||
├── BossSkillType(枚举)
|
||||
├── AttackPatternSO
|
||||
│ ├── DamageSource(DamageSourceSO)
|
||||
│ ├── KnockbackAngle
|
||||
│ ├── 弹幕参数:ProjectilePrefab / Count / SpreadAngle / Speed
|
||||
│ ├── AoE 参数:Radius / Offset
|
||||
│ └── 时序:WindupDuration / ActiveDuration / RecoveryDuration
|
||||
├── VulnerabilityWindowDuration 技能结束后弱点暴露时长(秒)
|
||||
└── SkillSequenceSO(可选) 组合技序列(按顺序或随机排列多个 BossSkillSO)
|
||||
|
||||
BossSkillExecutor.ExecuteSkill(BossSkillSO)
|
||||
│ if _isExecuting → return
|
||||
│
|
||||
└── StartCoroutine(ExecuteSkillCoroutine)
|
||||
├── _onBossSkillStarted.Raise(BossSkillEvent)
|
||||
├── TelegraphSystem.ShowTelegraph(skill.pattern) 预兆提示激活
|
||||
├── WaitForSeconds(WindupDuration) 前摇等待
|
||||
├── 激活 HitBox[] / ProjectileManager.Spawn(pattern) 伤害输出
|
||||
├── WaitForSeconds(ActiveDuration) 活跃帧等待
|
||||
├── 关闭 HitBox / 清理弹幕
|
||||
├── WeakPointSystem.OpenWindow(VulnerabilityWindowDuration) 弱点窗口
|
||||
├── WaitForSeconds(RecoveryDuration) 后摇等待
|
||||
└── _onBossSkillEnded.Raise(BossSkillEvent)
|
||||
|
||||
WaitForSeconds 缓存:
|
||||
static Dictionary<float, WaitForSeconds> _wfsCache
|
||||
[RuntimeInitializeOnLoadMethod] ClearWFSCache()
|
||||
→ 避免协程每次 new WaitForSeconds 的 GC 分配
|
||||
```
|
||||
|
||||
**InterruptCurrentSkill()**:阶段切换时强制停止当前协程并调用 `FinishExecution()`,确保状态一致性。
|
||||
|
||||
---
|
||||
|
||||
### 4.4 阶段切换
|
||||
|
||||
```
|
||||
BD_IsHPBelow(每帧轮询)
|
||||
└── BossBase.IsHPBelow(ratio) = CurrentHP / MaxHP < ratio
|
||||
→ true 时 BD 子树激活 BD_EnterPhase
|
||||
|
||||
BD_EnterPhase → BossBase.EnterPhase(phase)
|
||||
├── _currentPhase = phase
|
||||
├── BossPhaseEventChannelSO _onBossPhaseChanged.Raise(BossPhaseEvent{BossId, Phase})
|
||||
│ → Boss HP 条分段动画(UI)
|
||||
│ → 音乐系统切换 BGM 段落
|
||||
│ → VFX 场景效果触发
|
||||
└── [子类重写 EnterPhase]
|
||||
├── BossSkillExecutor.InterruptCurrentSkill() 打断当前技能
|
||||
├── 切换 BD 行为树活跃子树(换招式库)
|
||||
├── 播放阶段过渡动画(Animancer)
|
||||
└── 短暂无敌帧(保护阶段切换不被秒杀)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. 共享战斗层 Combat Module
|
||||
|
||||
### 5.1 核心接口
|
||||
|
||||
| 接口 | 实现者 | 用途 |
|
||||
|------|--------|------|
|
||||
| `IDamageable` | `PlayerController` / `EnemyBase` | HurtBox 统一调用入口,解耦具体角色类型 |
|
||||
| `IPoiseSource` | `PlayerController`(返回 None)/ `EnemyPoiseComponent` | 霸体等级声明,TakeDamage 中比较 |
|
||||
| `IShieldable` | `ShieldComponent`(玩家专属) | 伤害先经护盾吸收,剩余量才走 TakeDamage |
|
||||
| `IStatusEffectable` | `StatusEffectManager` | 状态效果施加入口,Combat 程序集不直接引用 StatusEffects |
|
||||
| `IBreakable` | 可破坏机关 / 障碍物 | HitBox 命中非 HurtBox 对象时的分支处理 |
|
||||
| `IPathAgent` | `EnemyNavAgent` | EnemyBase 通过接口引用导航,避免对 Navigation 程序集的直接依赖 |
|
||||
|
||||
---
|
||||
|
||||
### 5.2 HitBox → HurtBox 伤害流水线
|
||||
|
||||
```
|
||||
HitBox.OnTriggerEnter2D(Collider2D other)
|
||||
├── 1. Layer 白名单过滤(仅命中 EnemyHurtBox / PlayerHurtBox)
|
||||
├── 2. _alreadyHit HashSet 防重复命中(同次激活期间)
|
||||
├── 3. other.GetComponentInParent<HurtBox>() 获取受击盒
|
||||
│
|
||||
└── HurtBox.ReceiveDamage(DamageInfo)
|
||||
├── 1. IsAlive 检查
|
||||
├── 2. IDamageable.IsInvincible 检查
|
||||
│ (冲刺无敌帧 / DeadState / Stats.InvincibleTimer)
|
||||
├── 3. IShieldable.AbsorbDamage(amount)
|
||||
│ 护盾优先吸收,返回穿透量
|
||||
├── 4. IPoiseSource 霸体等级比较
|
||||
│ DamageInfo.PoiseBreakLevel vs GetCurrentPoiseLevel()
|
||||
├── 5. DamageInfo.FinalDamage 计算(基础 - Defense)
|
||||
├── 6. IStatusEffectable.ApplyStatusEffect(DamageType)
|
||||
│ (Fire → FireEffect / Poison → PoisonEffect)
|
||||
├── 7. IDamageable.TakeDamage(info)
|
||||
│ → PlayerController / EnemyBase 状态机转换
|
||||
└── 8. HitConfirmedEventChannelSO.Raise(HitInfo)
|
||||
→ HUD 命中提示 / 灵魂增加 / HitStop 触发
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5.3 状态效果系统
|
||||
|
||||
```
|
||||
StatusEffectManager(IStatusEffectable)
|
||||
├── ApplyStatusEffect(DamageType type)
|
||||
│ → 查找或创建对应 StatusEffect 实例并激活
|
||||
│
|
||||
├── FireEffect 持续 DoT(Tick 扣 HP)/ 视觉火焰 VFX
|
||||
├── PoisonEffect 持续 DoT + 移动速度降低(可叠加层数)
|
||||
└── StaggerEffect 触发 EnemyStaggerState / 破霸体
|
||||
|
||||
StatusEffectEventChannelSO 广播效果开始/结束(UI 状态图标)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. 数据驱动 ScriptableObject 体系
|
||||
|
||||
| SO 类型 | 所属程序集 | 用途 |
|
||||
|---------|-----------|------|
|
||||
| `PlayerStatsSO` | `BaseGames.Player` | 玩家初始数值、最大值配置 |
|
||||
| `PlayerMovementConfigSO` | `BaseGames.Player` | 移动速度/加速/跳跃力/冲刺参数等 |
|
||||
| `PlayerAnimationConfigSO` | `BaseGames.Player` | 各状态动画 ClipTransition 集合 |
|
||||
| `FormConfigSO` / `FormSO` | `BaseGames.Player` | 形态列表 + 各形态默认武器 |
|
||||
| `WeaponSO` | `BaseGames.Player` | 武器连击动画/伤害来源/HitBox Prefab |
|
||||
| `FormSkillSO` | `BaseGames.Skills` | 技能全量配置(动画/资源/效果/HitBox) |
|
||||
| `CharmSO` / `EquipmentConfigSO` | `BaseGames.Equipment` | 护符效果列表 + Notch 容量初始值 |
|
||||
| `DamageSourceSO` | `BaseGames.Combat` | 伤害值/类型/霸体破防等级/击退参数 |
|
||||
| `ProjectileConfigSO` | `BaseGames.Combat` | 投射物速度/碰撞层/生命时长/弹幕参数 |
|
||||
| `EnemyStatsSO` | `BaseGames.Enemies` | 敌人 HP/Defense/速度/攻击冷却 |
|
||||
| `EnemyAnimationConfigSO` | `BaseGames.Enemies` | 敌人动画 Clip 集合 |
|
||||
| `AttackPatternSO` | `BaseGames.Enemies`(Boss) | 攻击图案:伤害/弹幕/AoE/时序 |
|
||||
| `BossSkillSO` | `BaseGames.Enemies`(Boss) | Boss 技能全量配置 |
|
||||
| `SkillSequenceSO` | `BaseGames.Enemies`(Boss) | Boss 组合技序列(有序/随机) |
|
||||
| `BossResourceConfigSO` | `BaseGames.Enemies`(Boss) | Boss 阶段资源(HP 阈值/技能池) |
|
||||
|
||||
**设计原则**:所有运行时组件在 `Awake` 中通过 `Initialize(SO)` 接收配置,与数据资产完全解耦,支持 Inspector 热替换和难度 A/B 测试,无需修改脚本代码。
|
||||
|
||||
---
|
||||
|
||||
## 7. 架构核心原则总结
|
||||
|
||||
| 原则 | 具体体现 |
|
||||
|------|---------|
|
||||
| **单一职责** | 移动 / 数值 / 战斗 / 动画各为独立 MonoBehaviour;`PlayerController` 仅负责 FSM 协调,不持有业务逻辑 |
|
||||
| **事件驱动** | `EventChannelSO`(广播,跨程序集零直接引用)+ C# event(点对点,同程序集高频回调)双轨并行 |
|
||||
| **数据与逻辑分离** | 所有配置数据存入 ScriptableObject;运行时组件只持有 SO 引用,数值修改在 SO 层完成 |
|
||||
| **接口隔离** | `IDamageable / IPoiseSource / IShieldable / IStatusEffectable / IBreakable / IPathAgent` 六大接口隔离具体实现 |
|
||||
| **状态不继承 MB** | `PlayerStateBase` 为 POCO 类,生命周期由 `PlayerController` 驱动,无 GC 开销 |
|
||||
| **能力位图** | `AbilityType [Flags] uint` 支持任意组合查询,O(1) 位与运算,无枚举列表遍历 |
|
||||
| **难度热切换** | `EnemyStats` / `PlayerStats` 均订阅 `DifficultyChangedEventChannel`,保持 HP 比例重算,运行时切换零重置 |
|
||||
| **护符副作用隔离** | `ICharmEffect.OnEquip / OnUnequip` 配对调用,每个效果负责自身还原,`EquipmentManager` 不持有修改记录 |
|
||||
| **GC 意识** | `WaitForSeconds` 协程缓存、`_alreadyHit HashSet` 复用、`SqrDistanceToPlayer`(避免 sqrt)、`BatchLOSSystem` 批量 Raycast |
|
||||
| **执行顺序管控** | `PlayerMovement -200` → `PlayerController -100` → 其余默认 0,确保物理写入先于状态机读取 |
|
||||
209
Docs/Game/Design/BOSS设计文档.md
Normal file
209
Docs/Game/Design/BOSS设计文档.md
Normal file
@@ -0,0 +1,209 @@
|
||||
# 《择灵》BOSS 设计文档
|
||||
|
||||
**文档版本:** 1.0
|
||||
**最后更新:** 2026-04-30
|
||||
**状态:** 进行中
|
||||
|
||||
---
|
||||
|
||||
## 一、囚牛 · 永宁湾的悲怆君主
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 名号 | 囚牛 |
|
||||
| 排行 | 龙长子 |
|
||||
| 大地图 | 永宁湾 |
|
||||
| BOSS 区域 | 听音阁 |
|
||||
| 外貌 | 人形,龙角偏牛角状,手持龙头月琴 |
|
||||
| 掌管物品(对应能力) | 地魂 → 地行术 |
|
||||
|
||||
**战斗机制:** 每次施放弹奏技能时,会先消失并瞬移至特定位置。
|
||||
|
||||
| 技能 | 属性 | 效果 |
|
||||
|------|------|------|
|
||||
| 宫音·落岩 | 土 | 震落 3-5 块石块 |
|
||||
| 商音·金刃 | 金 | 利刃飞向玩家,角度随玩家位置变化 |
|
||||
| 角音·缠藤 | 木 | 地面生长藤蔓,可摧毁 |
|
||||
| 徵音·星火 | 火 | 真火洒地,可点燃藤蔓 |
|
||||
| 羽音·冰枪 | 水 | 两道冰枪交叉飞射,落地减速 |
|
||||
|
||||
---
|
||||
|
||||
## 二、睚眦 · 竹海剑庐的野心武痴
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 名号 | 睚眦 |
|
||||
| 排行 | 龙次子 |
|
||||
| 大地图 | 竹海剑庐 |
|
||||
| BOSS 区域 | 睚眦殿 |
|
||||
| 外貌 | 武士打扮,斗笠遮面,狼首龙角,额有第三只眼(常态遮住);真实面目见结局二 |
|
||||
| 掌管物品(对应能力) | 英魄 → 登龙蹴 |
|
||||
|
||||
| 技能 | 效果 |
|
||||
|------|------|
|
||||
| 连斩 | 连续挥剑追击玩家 |
|
||||
| 一闪 | 蓄力横向斩击,贯穿整个屏幕 |
|
||||
| 转轮 | 旋转长剑,大范围追击 |
|
||||
| 瞬劈 | 瞬移至玩家上方,双手握剑刺下,接回旋斩 |
|
||||
| 乱舞 | 消失后显示轨迹,沿轨迹快速反复斩击(类似次元斩) |
|
||||
|
||||
---
|
||||
|
||||
## 三、嘲风 · 凤仙山的隐忍导师
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 名号 | 嘲风 |
|
||||
| 排行 | 龙三子 |
|
||||
| 大地图 | 凤仙山 |
|
||||
| BOSS 区域 | 山顶·嘲风道场 |
|
||||
| 外貌 | 白衣人形,面容斯文,手持折扇 |
|
||||
| 掌管物品(对应能力) | 天魂 → 裂空掌 |
|
||||
|
||||
| 技能 | 效果 |
|
||||
|------|------|
|
||||
| 挥扇攻击 | 收拢扇子进行近身三连击 |
|
||||
| 回旋扇 | 扔出旋转扇子飞向玩家,原地旋转后收回 |
|
||||
| 下砸攻击 | 瞬移至玩家上方下砸,落地后生成左右两道地面风刃弹道 |
|
||||
| 小龙卷 | 召唤两道小型龙卷风(倒三角形状,可跳跃越过)从左右向玩家移动 |
|
||||
| 大龙卷 | 在玩家位置召唤细长龙卷(上下同宽),出现前有气流汇聚提示 |
|
||||
| 升空(二阶段) | 升空引导巨大风石落下;风石有追踪引导线,落地后产生裂缝与上升气流;玩家击碎风石获得上升气流攻击;升空阶段持续三次,第三次有大龙卷随机出现 |
|
||||
|
||||
---
|
||||
|
||||
## 四、蒲牢 · 惊海的惊惧鸣吼者
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 名号 | 蒲牢 |
|
||||
| 排行 | 龙四子 |
|
||||
| 大地图 | 惊海 |
|
||||
| BOSS 区域 | 蒲牢钟楼 |
|
||||
| 外貌 | 四足龙角蟾蜍,背有尖刺,造型圆润,可召唤金钟法器 |
|
||||
| 掌管物品(对应能力) | 命魂 → 太虚斩 |
|
||||
|
||||
| 技能 | 效果 |
|
||||
|------|------|
|
||||
| 舌鞭 | 蓄力突然伸出长舌攻击玩家,攻击结束缩回(舌头伸出期间可被攻击) |
|
||||
| 跃击 | 向前跳跃后落地爪击一次 |
|
||||
| 缩甲 | 蜷缩成带刺的圆球旋转,期间免疫物理伤害,为滚球/弹球前摇 |
|
||||
| 弹球 | 缩成球后高高在画面中反复弹跳,每次落地震落几块落石 |
|
||||
| 钟鸣 | 召唤法器金钟,使用金钟对着前方持续吼叫造成直线音波攻击(类似狮吼功),被吼叫波及难以移动,躲在落石后可免受伤害 |
|
||||
| 滚球 | 缩成一团后从屏幕一端滚向另一端,会撞碎地面上所有落石,撞墙后有一定硬直 |
|
||||
| 钟落 | 施放法术使得金钟浮空并跟随玩家进行下砸攻击 |
|
||||
|
||||
---
|
||||
|
||||
## 五、狻猊 · 西域大漠的沉眠守望者
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 名号 | 狻猊 |
|
||||
| 排行 | 龙五子 |
|
||||
| 大地图 | 西域 |
|
||||
| BOSS 区域 | 沉沙殿(地下宫殿遗迹) |
|
||||
| 外貌 | 兽面人身,狮面龙角,脖颈鬃毛,上身赤身带大型佛珠,红色皮肤,使用烟斗与玲珑心为法器 |
|
||||
| 掌管物品(对应能力) | 天冲魄 → 漩灵击 |
|
||||
|
||||
| 技能 | 效果 |
|
||||
|------|------|
|
||||
| 灰积 | 使用烟斗吐出若干漂浮在空中的烟圈,烟圈会延迟引爆 |
|
||||
| 火球 | 吐出一个较为缓慢的小火球跟随玩家,一定时间后爆炸,转弯时有惯性 |
|
||||
| 地火 | 狻猊蓄力后迅速从一侧瞬身到另一侧,地面会延迟爆发一条条火柱(有等距间隔) |
|
||||
| 火拳 | 冲至玩家身边进行快速的连续烈焰拳击 |
|
||||
| 流火 | 释放 4 团火焰在空中散开抛物线落向玩家 |
|
||||
| 烈日射线 | 玲珑心漂浮至空中,有规律地向玩家发射火焰射线,同时狻猊自身周围有一圈圈的火焰漩涡阻止玩家靠近 |
|
||||
|
||||
---
|
||||
|
||||
## 六、赑屃与负屃 · 双龙山的碑文双圣(双 BOSS)
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 名号 | 赑屃(六子)、负屃(八子) |
|
||||
| 大地图 | 双龙山 |
|
||||
| BOSS 区域 | 双龙殿 |
|
||||
| 地貌 | 岩浆与火山 |
|
||||
| 掌管物品(对应能力) | 力魄 → 魂元爆(共有) |
|
||||
|
||||
### 赑屃
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 外貌 | 龙角巨龟,全身岩石质感,中景可见双爪和头部 |
|
||||
|
||||
| 技能 | 效果 |
|
||||
|------|------|
|
||||
| 千钧 | 单个巴掌重击地面,造成冲击波扩散至两端;拍打的单块地面被破坏(地块沉下去露出岩浆地形,一定时间后浮上新地形) |
|
||||
| 掌击 | 连续抬起爪子追随玩家位置击打,会破坏地形 |
|
||||
| 横扫 | 单个巴掌从一侧扫到另一侧 |
|
||||
| 山摇 | 两个巴掌从两侧合拢到中间拍击,同时造成落石坠落 |
|
||||
|
||||
### 负屃
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 外貌 | 书生文人形象,持大笔,前期站在赑屃身后的石碑顶端,中期加入战斗 |
|
||||
|
||||
| 技能 | 效果 |
|
||||
|------|------|
|
||||
| 挥笔(横) | 瞬移至场景中某位置,挥出横向长条形笔墨攻击 |
|
||||
| 挥笔(竖) | 瞬移至场景中某位置,挥出竖向长条形笔墨攻击 |
|
||||
| 挥笔(撇) | 瞬移至场景中某位置,挥出撇方向长条形笔墨攻击 |
|
||||
| 挥笔(捺) | 瞬移至场景中某位置,挥出捺方向长条形笔墨攻击 |
|
||||
| 墨点 | 瞬移至屏幕中间挥出数个墨点,墨点依次炸开 |
|
||||
|
||||
---
|
||||
|
||||
## 七、狴犴 · 昭明府的正义刑官
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 名号 | 狴犴 |
|
||||
| 排行 | 龙七子 |
|
||||
| 大地图 | 昭明府 |
|
||||
| BOSS 区域 | 刑堂 |
|
||||
| 外貌 | 白色鬃毛虎头龙角半兽人,本体与分身 |
|
||||
| 掌管物品(对应能力) | 气魄 → 残阴术 |
|
||||
|
||||
**战斗机制:** 战斗开始前以两只石像形态耸立在背景中;触发后褪去岩石,露出本体与分身跃入场景。只有攻击本体才能造成伤害。分身有完整攻击能力。本体与分身外观一致,需通过技能"判"时地面的影子来区分(分身无影)。
|
||||
|
||||
| 技能 | 效果 |
|
||||
|------|------|
|
||||
| 断 | 本体与分身同时从两侧跃至空中,向另一侧地面斜下冲刺,带闪电路径 |
|
||||
| 判 | 同时吟唱召唤巨大天雷轰下,期间地面显现本体的影子(分身无影) |
|
||||
| 告 | 单个 BOSS 横向冲刺,带闪电路径 |
|
||||
| 审 | 同时跳至中间下砸,产生地面电流朝两侧移动 |
|
||||
| 辩 | 本体与分身剧烈抖动后互换位置 |
|
||||
|
||||
---
|
||||
|
||||
## 八、螭吻 · 难海的吞水巨兽
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 名号 | 螭吻 |
|
||||
| 排行 | 龙九子 |
|
||||
| 大地图 | 难海 |
|
||||
| BOSS 区域 | 断龙桥(残破跨海石桥) |
|
||||
| 外貌 | 龙首鱼身,口阔噪粗 |
|
||||
| 掌管物品(对应能力) | 精魄 → 霸山拳 |
|
||||
|
||||
**战斗机制:** 水中与岸上切换。玩家只能在其上岸时攻击。
|
||||
|
||||
| 技能 | 效果 |
|
||||
|------|------|
|
||||
| ⚠️ 待补充 | 技能设计待完善 |
|
||||
|
||||
---
|
||||
|
||||
## 文档修订记录
|
||||
|
||||
| 版本 | 日期 | 修改内容 | 修改人 |
|
||||
|------|------|----------|--------|
|
||||
| 1.0 | 2026-04-30 | 初始版本,完成 8 位龙子 BOSS 设计(除螭吻技能外) | 游戏策划工作室 |
|
||||
|
||||
---
|
||||
|
||||
**📝 说明:** 本文档为《择灵》项目 BOSS 设计专项文档,后续将根据开发进度持续更新完善。
|
||||
194
Docs/Game/Design/主开发流程文档.md
Normal file
194
Docs/Game/Design/主开发流程文档.md
Normal file
@@ -0,0 +1,194 @@
|
||||
# 《择灵》主开发流程文档
|
||||
|
||||
**文档版本:** 2.4
|
||||
**最后更新:** 2026-04-30
|
||||
**状态:** 进行中
|
||||
|
||||
---
|
||||
|
||||
## 一、游戏概述
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 游戏名称 | 择灵 |
|
||||
| 游戏类型 | 2D 横版类银河恶魔城 |
|
||||
| 核心主题 | 身世并非宿命,选择定义自我 |
|
||||
| 主要平台 | PC / 主机 |
|
||||
|
||||
---
|
||||
|
||||
## 二、核心玩法机制
|
||||
|
||||
### 2.1 基础战斗系统
|
||||
|
||||
- 近战攻击 → 积累灵力 → 灵力施放魂技能
|
||||
- 魄技能 → 消耗充能点数(魄元),随时间自动恢复
|
||||
- 治疗道具 → 击杀小怪积累点数,消耗回复生命值
|
||||
|
||||
### 2.2 三魂七魄系统
|
||||
|
||||
| 系统 | 对应内容 |
|
||||
|------|------|
|
||||
| 三魂(天魂、地魂、命魂) | 三种可切换的魂形态 |
|
||||
| 七魄(天冲、灵慧、气、力、精、英、中枢) | 魄技能槽位 |
|
||||
| 主角 | 真正的中枢魄容器(游戏过程中不自知) |
|
||||
|
||||
### 2.3 魂形态与技能
|
||||
|
||||
#### 天魂形态(灵气操控型)
|
||||
|
||||
| 技能类型 | 技能名 | 效果描述 |
|
||||
|----------|--------|----------|
|
||||
| 魂技能 | 裂空掌 | 汇聚灵气掌击,中距离气波,范围伤害 + 击退 |
|
||||
| 魄技能·天冲魄 | 漩灵击 | 灵气漩涡护体,挡弹道 + 周身伤害,空中缓落 |
|
||||
| 魄技能·灵慧魄 | 灵踪弹 | 发射一颗跟踪灵球,长按可连续施放 |
|
||||
|
||||
#### 地魂形态(体术强化型)
|
||||
|
||||
| 技能类型 | 技能名 | 效果描述 |
|
||||
|----------|--------|----------|
|
||||
| 魂技能 | 地行术 | 遁入地面,持续消耗灵力,缓慢移动且无敌;松软地面不耗灵力不减速 |
|
||||
| 魄技能·精魄 | 霸山拳 | 地面范围伤害 + 震起灵石(挡远程),可与裂空掌联动击飞灵石 |
|
||||
| 魄技能·英魄 | 登龙蹴 | 升龙踢击,对空无敌,位移相当于三段跳 |
|
||||
|
||||
#### 命魂形态(分身辅助型)
|
||||
|
||||
| 技能类型 | 技能名 | 效果描述 |
|
||||
|----------|--------|----------|
|
||||
| 魂技能 | 太虚斩 | 灵体冲刺斩击,再次按键瞬移至灵体位置,可穿越魔法障壁 |
|
||||
| 魄技能·气魄 | 残阴术 | 后撤留灵体模仿攻击(伤害减半),破解延迟机关 |
|
||||
| 魄技能·力魄 | 魂元爆 | 原地留下魂元球,延迟爆炸 |
|
||||
|
||||
### 2.4 主角能力解锁节点
|
||||
|
||||
| 能力 | 获取时机 |
|
||||
|------|----------|
|
||||
| 普通冲刺 | 凤仙山·轮回之井,击败蛭妖之母 |
|
||||
| 二段跳 | 永宁湾·跳跳乐关卡 |
|
||||
| 裂空掌 | 击败嘲风后 |
|
||||
| 地行术 | 击败囚牛后 |
|
||||
| 霸山拳 | 击败螭吻后 |
|
||||
| 漩灵击 | 击败狻猊后 |
|
||||
| 灵踪弹 | 难海·跳跳乐(战斗技能) |
|
||||
| 太虚斩 | 击败蒲牢后(获得命魂形态) |
|
||||
| 冲刺无敌被动 | 获得太虚斩的同时(固定冷却) |
|
||||
| 登龙蹴 | 击败睚眦后 |
|
||||
| 残阴术 | 击败狴犴后 |
|
||||
| 魂元爆 | 击败赑屃和负屃后 |
|
||||
|
||||
---
|
||||
|
||||
## 三、游戏主线流程拓扑图
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
## 四、收集物品系统
|
||||
|
||||
### 4.1 基础属性碎片
|
||||
|
||||
| 碎片 | 初始上限 | 合成规则 | 地图总量 | 满收集效果 |
|
||||
|------|----------|----------|----------|------------|
|
||||
| **命脉**(生命) | 5 刻度 | 3 个 → +1 刻度 | 15 个 | 10 刻度 |
|
||||
| **碧灵**(灵力) | 6 刻度 | 3 个 → +1 刻度 | 18 个 | 12 刻度 |
|
||||
|
||||
### 4.2 仙酿系统
|
||||
|
||||
| 属性 | 初始值 | 升级方向 |
|
||||
|------|--------|----------|
|
||||
| 容量 | 3 口 | 3 → 5 → 7 口 |
|
||||
| 每口回复 | 3 刻度 | 3 → 4 → 5 刻度 |
|
||||
|
||||
- 充能:击杀怪物掉落「药尘」(每收集 20 个药尘补充 1 口仙酿,不同强度怪物掉落数量不同),装备法器「仁心坠」可增加杀敌掉落的药尘数量;存档点补满
|
||||
- 升级 NPC:玉林婆婆
|
||||
|
||||
**酿品(8 种):** 回灵散、破厄丹、金身玉液、凝元膏、玄甲霜、续脉露、疾风草、还气丸。
|
||||
|
||||
### 4.3 法宝系统
|
||||
|
||||
| 分类 | 作用 | 初始槽位 | 更换规则 |
|
||||
|------|------|----------|----------|
|
||||
| **法器** | 基础能力强化 | 2 槽 | 仅存档点 |
|
||||
| **宝器** | 魂魄技能强化 | 2 槽 | 仅存档点 |
|
||||
|
||||
**法器(15 种):** 踏云履、风雷佩、焚天珠、延生石、聚灵琮、仁心坠、续战牌、受气环、轻身铃、流云镯、贪财锁、凝气诀、珑、润灵佩、凝魄坠。
|
||||
|
||||
**宝器(15 种):** 玉扳指、冷金钿、风旋珠、扩风珠、霹雳珠、迅雷珠、土圭、雨花石、灵璧石、镇纸、飞星簪、轻燕钗、双鱼佩、鸣镝、返灵符。
|
||||
|
||||
---
|
||||
|
||||
## 五、BOSS 设计
|
||||
|
||||
| 排行 | 名号 | 掌管物品(对应能力) | 大地图 | BOSS 区域 | 外貌 |
|
||||
|------|------|---------------------|--------|-----------|------|
|
||||
| 三子 | 嘲风 | 天魂 → 裂空掌 | 凤仙山 | 山顶·嘲风道场 | 白衣人形,面容斯文,手持折扇 |
|
||||
| 长子 | 囚牛 | 地魂 → 地行术 | 永宁湾 | 听音阁 | 人形,龙角偏牛角,手持龙头月琴 |
|
||||
| 九子 | 螭吻 | 精魄 → 霸山拳 | 难海 | 断龙桥 | 龙首鱼身,口阔噪粗 |
|
||||
| 五子 | 狻猊 | 天冲魄 → 漩灵击 | 西域 | 沉沙殿 | 兽面人身,狮面龙角,红色皮肤,带佛珠,持烟斗与玲珑心 |
|
||||
| 四子 | 蒲牢 | 命魂 → 太虚斩 | 惊海 | 蒲牢钟楼 | 四足龙角蟾蜍,背有尖刺,可召唤金钟 |
|
||||
| 次子 | 睚眦 | 英魄 → 登龙蹴 | 竹海剑庐 | 睚眦殿 | 武士打扮,斗笠遮面,狼首龙角,额有第三只眼 |
|
||||
| 七子 | 狴犴 | 气魄 → 残阴术 | 昭明府 | 刑堂 | 白色鬃毛虎头龙角半兽人,本体与分身 |
|
||||
| 六子 | 赑屃 | 力魄 → 魂元爆 | 双龙山 | 双龙殿 | 龙角巨龟,岩石质感,中景可见双爪和头部 |
|
||||
| 八子 | 负屃 | 力魄 → 魂元爆 | 双龙山 | 双龙殿 | 书生文人,持大笔,前期站石碑顶端 |
|
||||
|
||||
---
|
||||
|
||||
## 六、剧情设定
|
||||
|
||||
### 6.1 世界观
|
||||
|
||||
第十位龙子黑麒麟拥有强大但不稳定的力量。睚眦崇尚秩序,派人刺激黑麒麟导致其失控摧毁村落。睚眦借此在九龙会议上主张封印。囚牛因永宁湾受损支持,狴犴因正义感支持,嘲风反对无效。九龙将黑麒麟魂魄封印于画中世界。嘲风暗中将黑麒麟的中枢魄抽出转世为龙女"灵",留下虚假玉蝉作障眼法。
|
||||
|
||||
### 6.2 龙子态度与被侵蚀情况
|
||||
|
||||
| 龙子 | 态度 | 被侵蚀 |
|
||||
|------|------|--------|
|
||||
| 囚牛 | 悲愤支持 | 是(悲伤后悔) |
|
||||
| 睚眦 | 主导封印 | 否(坚信正确) |
|
||||
| 嘲风 | 反对 | 是(愧疚) |
|
||||
| 蒲牢 | 被迫支持 | 是(恐惧) |
|
||||
| 狻猊 | 沉默支持 | 否 |
|
||||
| 赑屃 | 沉默支持 | 否 |
|
||||
| 狴犴 | 坚定支持 | 轻微 |
|
||||
| 负屃 | 弃权 | 否 |
|
||||
| 螭吻 | 弃权 | 是 |
|
||||
|
||||
---
|
||||
|
||||
## 七、多结局
|
||||
|
||||
| 结局 | 条件 | 流程 |
|
||||
|------|------|------|
|
||||
| **重封** | 未完成所有亡灵心愿,未觉醒身世 | 击败睚眦后进入画中世界,击败残躯修复封印 |
|
||||
| **真相** | 完成所有亡灵心愿,看到事件全貌 | 睚眦坚持己见,二番战,击败后进入画中世界击败残躯 |
|
||||
| **择灵(真结局)** | 完成所有亡灵心愿 + 觉醒身世 + 获得真正命魄 | 画中世界残躯幻化黑暗面,击败后怨念消散 |
|
||||
|
||||
---
|
||||
|
||||
## 八、待补充内容
|
||||
|
||||
| 模块 | 待补充项 | 优先级 |
|
||||
|------|----------|--------|
|
||||
| BOSS 设计 | 螭吻技能 | 高 |
|
||||
| 数值系统 | 技能数值、敌人数值、成长曲线 | 中 |
|
||||
| 关卡设计 | 各区域地图布局 | 中 |
|
||||
|
||||
---
|
||||
|
||||
## 文档修订记录
|
||||
|
||||
| 版本 | 日期 | 修改内容 | 修改人 |
|
||||
|------|------|----------|--------|
|
||||
| 1.0 | 2026-04-08 | 初始版本创建 | - |
|
||||
| 1.1 | 2026-04-28 | 新增第三章「收集物品系统」(属性碎片/仙酿/法宝) | 游戏策划工作室 |
|
||||
| 1.2 | 2026-04-29 | 更新收集物品至 v1.2:法器 15 种、宝器 15 种、酿品 8 种、仙酿充能机制调整、灵踪弹描述修正 | 游戏策划工作室 |
|
||||
| 2.0 | 2026-04-30 | 重构文档:调整章节编号、重写能力解锁节点表、新增主线流程拓扑图章节、移除米亚支线剧情待补充项、BOSS 掌管物品改为能力对应 | 游戏策划工作室 |
|
||||
| 2.1 | 2026-04-30 | 微调 | 游戏策划工作室 |
|
||||
| 2.2 | 2026-04-30 | 删除待补充内容中"剧情 米亚支线奖励及对话"条目 | 游戏策划工作室 |
|
||||
| 2.3 | 2026-04-30 | 第三章「游戏主线流程拓扑图」添加路线图图片 | 游戏策划工作室 |
|
||||
| 2.4 | 2026-04-30 | 调整仙酿药尘机制:20药尘/口,怪物掉落区分强度,仁心坠改为增加掉落量 | 游戏策划工作室 |
|
||||
|
||||
---
|
||||
|
||||
**📝 说明:** 本文档为《择灵》项目核心设计文档,后续将根据开发进度持续更新完善。
|
||||
215
Docs/Game/Design/收集物品设计.md
Normal file
215
Docs/Game/Design/收集物品设计.md
Normal file
@@ -0,0 +1,215 @@
|
||||
# 收集物品设计文档
|
||||
|
||||
> **项目:** 择灵
|
||||
> **文档类型:** 系统设计
|
||||
> **创建时间:** 2026-04-29
|
||||
> **版本:** v1.3
|
||||
|
||||
---
|
||||
|
||||
## 一、基础属性碎片
|
||||
|
||||
### 1.1 生命碎片 · 命脉
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|------|
|
||||
| **碎片名称** | 命脉 |
|
||||
| **碎片类型** | 基础属性碎片 |
|
||||
| **作用** | 提升生命上限 |
|
||||
| **合成规则** | 每集齐 **3 个** 命脉 → 生命上限 +1 刻度 |
|
||||
| **初始生命** | 5 刻度 |
|
||||
| **地图总量** | 15 个 |
|
||||
| **满收集效果** | 生命上限达到 **10 刻度** |
|
||||
|
||||
### 1.2 灵力碎片 · 碧灵
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|------|
|
||||
| **碎片名称** | 碧灵 |
|
||||
| **碎片类型** | 基础属性碎片 |
|
||||
| **作用** | 提升灵力上限 |
|
||||
| **合成规则** | 每集齐 **3 个** 碧灵 → 灵力上限 +1 刻度 |
|
||||
| **初始灵力** | 6 刻度 |
|
||||
| **地图总量** | 18 个 |
|
||||
| **满收集效果** | 灵力上限达到 **12 刻度** |
|
||||
|
||||
---
|
||||
|
||||
## 二、仙酿系统
|
||||
|
||||
### 2.1 基础机制
|
||||
|
||||
**治疗道具名称:仙酿**
|
||||
|
||||
#### 初始数据
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|------|
|
||||
| **饮用次数(容量)** | 3 口 |
|
||||
| **每口回复量** | 3 刻度(初始生命上限 5 刻度的 60%) |
|
||||
|
||||
#### 升级线路一:回复量
|
||||
|
||||
| 升级次数 | 每口回复量 |
|
||||
|----------|-----------|
|
||||
| 初始 | 3 刻度 |
|
||||
| 第一次升级 | 4 刻度 |
|
||||
| 第二次升级 | 5 刻度 |
|
||||
|
||||
#### 升级线路二:容量
|
||||
|
||||
| 升级次数 | 饮用次数 |
|
||||
|----------|---------|
|
||||
| 初始 | 3 口 |
|
||||
| 第一次升级 | 5 口 |
|
||||
| 第二次升级 | 7 口 |
|
||||
|
||||
> **说明:** 回复量与容量升级相互独立,玩家可自由选择优先方向。
|
||||
|
||||
#### 充能方式
|
||||
|
||||
| 充能方式 | 说明 |
|
||||
|----------|------|
|
||||
| **击杀怪物** | 掉落「药尘」(自动拾取),每收集 **20 个药尘** 自动补充 1 口仙酿。不同强度的怪物掉落不同数量的药尘 |
|
||||
| **存档点** | 触碰存档点时自动补满至当前最大容量 |
|
||||
|
||||
#### 升级方式
|
||||
|
||||
- 通过特定 **NPC(玉林婆婆)** 完成升级
|
||||
- 升级材料为**稀有收集物**
|
||||
|
||||
---
|
||||
|
||||
### 2.2 酿品系统(药方搭配)
|
||||
|
||||
**酿品**是散落于九域各处的稀有收集物,每种提供一种特殊药效。
|
||||
|
||||
#### 槽位系统
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|------|
|
||||
| **初始槽位** | 1 个药方槽位 |
|
||||
| **可升级次数** | 2 次 |
|
||||
| **最高槽位** | 3 个槽位 |
|
||||
|
||||
#### 搭配规则
|
||||
|
||||
- 玩家可从已收集的酿品中,自由选择搭配放入槽位
|
||||
- 每次服用仙酿时,所有已放入槽位的酿品效果**同时生效**
|
||||
- 槽位升级通过 NPC(玉林婆婆)完成
|
||||
|
||||
#### 酿品列表(共 8 种)
|
||||
|
||||
| 编号 | 酿品名称 | 效果描述 |
|
||||
|------|----------|----------|
|
||||
| 1 | **回灵散** | 服用时额外恢复少量灵力 |
|
||||
| 2 | **破厄丹** | 服用后短时间内增加伤害 |
|
||||
| 3 | **金身玉液** | 服用后获得短暂无敌 |
|
||||
| 4 | **凝元膏** | 服用后短时间内灵力消耗减少 |
|
||||
| 5 | **玄甲霜** | 服用后产生一个护盾,抵挡一次伤害 |
|
||||
| 6 | **续脉露** | 增加治疗总量,但回血改为缓慢恢复 |
|
||||
| 7 | **疾风草** | 服用后短时间内攻击速度提升 |
|
||||
| 8 | **还气丸** | 服用后立即回复一格魄元(魄技能充能点数) |
|
||||
|
||||
---
|
||||
|
||||
## 三、法宝系统
|
||||
|
||||
### 3.1 基础设定
|
||||
|
||||
#### 分类
|
||||
|
||||
| 分类 | 作用 | 说明 |
|
||||
|------|------|------|
|
||||
| **法器** | 提升角色基础能力 | 移速、攻速、资源获取、防御等 |
|
||||
| **宝器** | 提升魂魄技能效果 | 增强特定魂魄技能的威力或范围 |
|
||||
|
||||
#### 槽位系统
|
||||
|
||||
| 属性 | 初始值 | 说明 |
|
||||
|------|--------|------|
|
||||
| **法器槽位** | 2 槽 | 可通过探索收集获得额外槽位 |
|
||||
| **宝器槽位** | 2 槽 | 可通过探索收集获得额外槽位 |
|
||||
|
||||
#### 更换规则
|
||||
|
||||
- 法宝**仅可在存档点更换**
|
||||
|
||||
---
|
||||
|
||||
### 3.2 法器列表(15 种)
|
||||
|
||||
| 编号 | 名称 | 效果描述 |
|
||||
|------|------|----------|
|
||||
| 1 | **踏云履** | 增加移动速度 |
|
||||
| 2 | **风雷佩** | 增加攻击速度 |
|
||||
| 3 | **焚天珠** | 略微增加所有技能伤害(不区分魂技和魄技) |
|
||||
| 4 | **延生石** | 增加受伤后的无敌时间 |
|
||||
| 5 | **聚灵琮** | 增加每次攻击获得的灵力 |
|
||||
| 6 | **仁心坠** | 增加杀敌掉落的药尘数量 |
|
||||
| 7 | **续战牌** | 三魂切换后的一定时间内,魂技能灵力消耗减少 |
|
||||
| 8 | **受气环** | 受到伤害时获得少量灵力 |
|
||||
| 9 | **轻身铃** | 减少冲刺的冷却时间 |
|
||||
| 10 | **流云镯** | 减少使用仙酿后的硬直时间 |
|
||||
| 11 | **贪财锁** | 增加敌人掉落货币的数量 |
|
||||
| 12 | **凝气诀** | 魄元(魄技能充能点数)充能时间缩短 20% |
|
||||
| 13 | **珑** | 受到攻击时有 10% 的概率完全减免该次伤害 |
|
||||
| 14 | **润灵佩** | 随时间缓慢恢复灵力值 |
|
||||
| 15 | **凝魄坠** | 击杀敌人后略微增加魄元的充能进度 |
|
||||
|
||||
---
|
||||
|
||||
### 3.3 宝器列表(15 种)
|
||||
|
||||
按编号顺序排列。
|
||||
|
||||
| 编号 | 名称 | 对应技能 | 效果描述 |
|
||||
|------|------|----------|----------|
|
||||
| 1 | **玉扳指** | 裂空掌 | 提升裂空掌的距离 |
|
||||
| 2 | **冷金钿** | 裂空掌 | 裂空掌击中敌人后带有减速效果 |
|
||||
| 3 | **风旋珠** | 漩灵击 | 增加漩灵击的持续时间 |
|
||||
| 4 | **扩风珠** | 漩灵击 | 增加漩灵击的攻击范围 |
|
||||
| 5 | **霹雳珠** | 灵踪弹 | 灵踪弹伤害略微降低,但击中后额外产生范围伤害 |
|
||||
| 6 | **迅雷珠** | 灵踪弹 | 灵踪弹的飞行速度提升 |
|
||||
| 7 | **土圭** | 地行术 | 施展地行术时的灵力持续消耗减少 |
|
||||
| 8 | **雨花石** | 地行术 | 削弱地行术施放期间的减速效果 |
|
||||
| 9 | **灵璧石** | 地行术 | 地行术期间会缓慢回复生命值 |
|
||||
| 10 | **镇纸** | 地行术 | 结束地行术状态时钻出地面可造成小范围震击 |
|
||||
| 11 | **飞星簪** | 登龙蹴 | 增加登龙蹴的空中无敌时间 |
|
||||
| 12 | **轻燕钗** | 太虚斩 | 太虚斩瞬移后短暂时间内增加移速和攻速 |
|
||||
| 13 | **双鱼佩** | 残阴术 | 增加残阴术灵体造成的伤害 |
|
||||
| 14 | **鸣镝** | 残阴术 | 灵体消失时额外引发一次爆炸 |
|
||||
| 15 | **返灵符** | 残阴术 | 残阴术攻击也会回复本体的灵力值 |
|
||||
|
||||
---
|
||||
|
||||
## 附录:系统关联说明
|
||||
|
||||
### 各系统之间的关系
|
||||
|
||||
```
|
||||
基础属性碎片
|
||||
├── 命脉 → 生命上限(影响仙酿回复效果)
|
||||
└── 碧灵 → 灵力上限(影响技能和法宝使用频率)
|
||||
|
||||
仙酿系统
|
||||
├── 基础回复 → 生存保障
|
||||
├── 升级线路 → 玩法风格选择(回复量 vs 容量)
|
||||
└── 酿品搭配 → 战斗策略扩展
|
||||
|
||||
法宝系统
|
||||
├── 法器 → 角色基础能力强化
|
||||
└── 宝器 → 魂魄技能特化
|
||||
```
|
||||
|
||||
### 设计要点
|
||||
|
||||
1. **属性碎片**:通过收集驱动探索,满收集后属性翻倍,鼓励玩家探索地图
|
||||
2. **仙酿系统**:升级路线独立,玩家可根据自身玩法风格选择偏回复量或偏容量
|
||||
3. **酿品搭配**:3 个槽位 × 8 种酿品 = 丰富的策略组合,增加重玩价值
|
||||
4. **法宝系统**:法器偏通用能力,宝器偏技能特化,两者互补形成 Build 多样性
|
||||
5. **魄元机制**:魄技能充能点数独立于灵力,随时间自动恢复,受法器「凝气诀」和「凝魄坠」等影响
|
||||
|
||||
---
|
||||
|
||||
_文档维护:游戏策划工作室_
|
||||
60
Docs/Game/Design/魂蝶收集方案.md
Normal file
60
Docs/Game/Design/魂蝶收集方案.md
Normal file
@@ -0,0 +1,60 @@
|
||||
# 《择灵》魂蝶收集方案
|
||||
|
||||
**文档版本:** 1.0
|
||||
**最后更新:** 2026-04-30
|
||||
**状态:** 进行中
|
||||
|
||||
---
|
||||
|
||||
## 一、设定
|
||||
|
||||
黑麒麟被封印时,其灵力与记忆碎片凝结为**魂蝶**,飘散于九域各地。魂蝶半透明,翅缘泛幽蓝微光,多栖息于古战场、墓碑、废墟等有执念之处。
|
||||
|
||||
素娘是当年遇难的绣娘,化为"引蝶人",知晓每只魂蝶所在。她在幽梦林中等待灵的到访。**需获得命魂被动"亡语"后才能与她交互**。
|
||||
|
||||
## 二、捕获
|
||||
|
||||
- 全地图共 **48 只**。
|
||||
- 靠近魂蝶(约两个身位)时播放轻柔振翅声,音量随距离增大。捕获时播放"叮"声。
|
||||
- 靠近后魂蝶受惊飞起,在固定圆形区域内盘旋,追逐触碰即可捕获。
|
||||
|
||||
## 三、兑换地点
|
||||
|
||||
**幽梦林**:隐藏洞窟,入口位于绝龙岭外围区域(首次路过时可探索)。洞内长满发光萤草,中央一池清泉。
|
||||
|
||||
## 四、奖励
|
||||
|
||||
按累计捕获总数逐级解锁,与素娘对话领取。
|
||||
|
||||
| 捕获数 | 奖励 |
|
||||
|--------|------|
|
||||
| 3 | 金钱 × 300 |
|
||||
| 6 | 生命碎片 × 1(命脉) |
|
||||
| 9 | 法器(待定) |
|
||||
| 12 | 酿品 · 回灵散 |
|
||||
| 15 | 金钱 × 500 |
|
||||
| 18 | 灵力碎片 × 1(碧灵) |
|
||||
| 21 | 宝器(待定) |
|
||||
| 24 | 生命碎片 × 1 |
|
||||
| 27 | 法器(待定) |
|
||||
| 30 | 酿品 · 破厄丹 |
|
||||
| 33 | 金钱 × 800 |
|
||||
| 36 | 灵力碎片 × 1 |
|
||||
| 39 | 宝器(待定) |
|
||||
| 42 | 生命碎片 × 1 |
|
||||
| 45 | 法器(待定)— 地图标记剩余魂蝶大致区域 |
|
||||
| 48 | 酿品 · 金身玉液 + 全收集成就 |
|
||||
|
||||
> 法器/宝器具体效果待补充。酿品效果见《收集物品设计文档》。
|
||||
|
||||
---
|
||||
|
||||
## 文档修订记录
|
||||
|
||||
| 版本 | 日期 | 修改内容 | 修改人 |
|
||||
|------|------|----------|--------|
|
||||
| 1.0 | 2026-04-30 | 初始版本,移除幽梦林特定能力入口要求,精简冗余文字 | 游戏策划工作室 |
|
||||
|
||||
---
|
||||
|
||||
**📝 说明:** 本文档为《择灵》项目魂蝶收集系统设计文档。
|
||||
@@ -72,7 +72,7 @@
|
||||
| 固定距离 & 时长 | 冲刺距离与持续时间**固定**,不受 `Move` 输入幅度影响 |
|
||||
| 重力暂停 | 冲刺期间垂直速度归零且重力暂停,冲刺结束后恢复正常重力 |
|
||||
| 无无敌帧 | 基础冲刺**无无敌帧**,无法穿越实体敌人和障碍物(升级为无敌冲刺后获得无敌帧) |
|
||||
| 空中冲刺次数 | 空中仅可使用 **一次**;落地或成功蹬墙后立即恢复 |
|
||||
| 空中冲刺次数 | 空中仅可使用 **一次**;**落地**或**下劈命中(Pogo)**后立即恢复 |
|
||||
| 冷却 | 冲刺结束后存在极短冷却时间(约 **0.4 秒**),防止地面连续冲刺 |
|
||||
| 冲刺后速度 | 冲刺结束后**不继承**冲刺速度,直接恢复为正常移动速度 |
|
||||
|
||||
|
||||
213
Docs/Tuning/PlayerJumpDash_Tuning.md
Normal file
213
Docs/Tuning/PlayerJumpDash_Tuning.md
Normal file
@@ -0,0 +1,213 @@
|
||||
# 玩家跳跃 / 冲刺手感调参指南
|
||||
|
||||
**配置文件**:`Assets/_Game/ScriptableObjects/Player/PlayerMovementConfig.asset`
|
||||
**对应脚本**:`PlayerMovementConfigSO.cs`
|
||||
**影响状态**:`JumpState` · `FallState` · `DashState` · `AerialDashState`
|
||||
|
||||
---
|
||||
|
||||
## 一、跳跃系统
|
||||
|
||||
### 1.1 物理模型概述
|
||||
|
||||
跳跃分为三段,每段使用不同的有效重力:
|
||||
|
||||
```
|
||||
vy ↑
|
||||
│ ╭──╮ ← ② 顶点悬停段:|vy| < ApexThreshold,
|
||||
│ ╯ ╰╮ 重力 = DefaultGravityScale × ApexGravityMultiplier
|
||||
│ ╯ ╰──── ← ③ 下落段(FallState):
|
||||
│╯ 重力 = DefaultGravityScale(由 Unity 施加)
|
||||
│ ↑ ① 上升段 + FallGravityMult 额外速度叠加
|
||||
────┼──────────────→ 时间
|
||||
```
|
||||
|
||||
| 阶段 | 激活状态 | 有效重力 |
|
||||
|---|---|---|
|
||||
| ① 上升 | `JumpState`(|vy| ≥ ApexThreshold) | `9.81 × DefaultGravityScale` |
|
||||
| ② 顶点悬停 | `JumpState`(|vy| < ApexThreshold) | `9.81 × DefaultGravityScale × ApexGravityMultiplier` |
|
||||
| ③ 下落 | `FallState` | `9.81 × DefaultGravityScale` + `9.81 × (FallGravityMult−1) / FixedDeltaTime` |
|
||||
|
||||
---
|
||||
|
||||
### 1.2 参数说明与推荐值
|
||||
|
||||
#### 基础重力
|
||||
|
||||
| 参数 | 类型 | 当前默认 | 推荐(高速手感) | 说明 |
|
||||
|---|---|---|---|---|
|
||||
| `DefaultGravityScale` | float | 3.0 | **6.0** | Rigidbody2D 的 gravityScale。越高上升减速越快、跳跃弧线越短促。**这是影响整体跳跃节奏的最核心参数。** |
|
||||
|
||||
> ⚠️ 修改 `DefaultGravityScale` 后必须同步调整 `JumpForce`,否则弹跳高度会改变。
|
||||
|
||||
#### 跳跃初速
|
||||
|
||||
| 参数 | 类型 | 当前默认 | 推荐(高速手感) | 说明 |
|
||||
|---|---|---|---|---|
|
||||
| `JumpForce` | float | 19.0 | **24.0** | 按下跳跃键瞬间赋予的垂直速度(单位/秒)。 |
|
||||
| `DoubleJumpForce` | float | 19.0 | **24.0** | 二段跳/空中追加跳的垂直速度。通常与 JumpForce 保持一致以获得等高跳跃。 |
|
||||
|
||||
**跳跃高度速查公式**(忽略顶点悬停段):
|
||||
|
||||
$$H_{apex} \approx \frac{JumpForce^2}{2 \times 9.81 \times DefaultGravityScale}$$
|
||||
|
||||
| DefaultGravityScale | JumpForce = 19 | JumpForce = 24 |
|
||||
|---|---|---|
|
||||
| 3.0 | ≈ 6.1 单位 | ≈ 9.8 单位 |
|
||||
| 5.0 | ≈ 3.7 单位 | ≈ 5.9 单位 |
|
||||
| 6.0 | ≈ 3.1 单位 | ≈ 4.9 单位 |
|
||||
|
||||
#### 顶点悬停
|
||||
|
||||
| 参数 | 类型 | 当前默认 | 推荐(高速手感) | 说明 |
|
||||
|---|---|---|---|---|
|
||||
| `ApexThreshold` | float | 3.0 | **3.0** | 当 \|垂直速度\| 低于此值时触发悬停。单位:单位/秒。 |
|
||||
| `ApexGravityMultiplier` | float [0,1] | 0.3 | **0.3** | 悬停期间重力系数。0 = 完全停止;1 = 无效果。 |
|
||||
|
||||
**调整方向**:
|
||||
- 想要更明显的"飘"感 → 调高 `ApexThreshold`(更早进入悬停)或调低 `ApexGravityMultiplier`
|
||||
- 想要更紧实干脆 → 调低 `ApexThreshold`(接近 0 等于关闭功能)
|
||||
|
||||
#### 下落段
|
||||
|
||||
| 参数 | 类型 | 当前默认 | 推荐(高速手感) | 说明 |
|
||||
|---|---|---|---|---|
|
||||
| `FallGravityMult` | float | 3.5 | **2.5** | 在 FallState 中每 FixedUpdate 额外叠加的速度量 = `9.81 × (FallGravityMult−1) × fixedDeltaTime`。注意:已有 DefaultGravityScale 提供基础重力,此值是**叠加量**,不是总倍率。 |
|
||||
| `MaxFallSpeed` | float | 22.0 | **28.0** | 终端速度(最大下落速度,单位/秒)。防止无限加速。 |
|
||||
|
||||
> 💡 `DefaultGravityScale = 6` 时,基础下落加速度已达 `58.9 m/s²`,`FallGravityMult` 只需设 2.5(额外 14.7 m/s²)即可达到总体 `73.6 m/s²` 的快速下落,等效重力倍率约 **7.5×**。`FallGravityMult` 不需要再设很高。
|
||||
|
||||
#### 变高跳(松键截断)
|
||||
|
||||
| 参数 | 类型 | 当前默认 | 推荐(高速手感) | 说明 |
|
||||
|---|---|---|---|---|
|
||||
| `JumpCutMultiplier` | float [0,1] | 0.35 | **0.35** | 松开跳跃键时将当前垂直速度乘以此值。越小 → 短跳越矮,跳跃高度范围越大。 |
|
||||
| `CoyoteTime` | float | 0.12 | **0.10** | 离开平台边缘后仍可起跳的宽限时间(秒)。 |
|
||||
|
||||
#### 最小 / 最大跳跃高度配置方法
|
||||
|
||||
跳跃分**短按**(立即松键,速度被截断)和**长按**(全程按住,达到最大高度):
|
||||
|
||||
**高度计算公式**(忽略顶点悬停段微小修正):
|
||||
|
||||
$$H_{max} = \frac{JumpForce^2}{2 \times 9.81 \times DefaultGravityScale}$$
|
||||
|
||||
$$H_{min} = \frac{(JumpForce \times JumpCutMultiplier)^2}{2 \times 9.81 \times DefaultGravityScale} = H_{max} \times JumpCutMultiplier^2$$
|
||||
|
||||
**反向推导(已知目标高度求参数)**:
|
||||
|
||||
$$JumpForce = \sqrt{2 \times 9.81 \times DefaultGravityScale \times H_{max}}$$
|
||||
|
||||
$$JumpCutMultiplier = \sqrt{\frac{H_{min}}{H_{max}}}$$
|
||||
|
||||
**不同比例对应的 JumpCutMultiplier 参考表**(DefaultGravityScale = 6):
|
||||
|
||||
| 目标 H_max | 目标 H_min | 比例 | JumpForce | JumpCutMultiplier |
|
||||
|---|---|---|---|---|
|
||||
| 5.0 单位 | 1.25 单位 | 1:4 | 24.3 | **0.50** |
|
||||
| 5.0 单位 | 0.80 单位 | 1:6 | 24.3 | **0.41** |
|
||||
| 5.0 单位 | 0.50 单位 | 1:10 | 24.3 | **0.32** |
|
||||
| 4.0 单位 | 0.60 单位 | 1:7 | 21.7 | **0.39** |
|
||||
|
||||
> 💡 当前推荐值 `JumpCutMultiplier = 0.35` 对应约 **1:8** 的高度比,短按跳跃约为长按的 12%,手感短促有力。
|
||||
> 若希望短按有一个明显可见的小跳(约 1 格高),比例控制在 **1:4 ~ 1:5**,`JumpCutMultiplier ≈ 0.45 ~ 0.50`。
|
||||
|
||||
---
|
||||
|
||||
### 1.3 推荐参数组合
|
||||
|
||||
以下三组参数可直接在 SO 中录入作为起点:
|
||||
|
||||
| 风格 | DefaultGravityScale | JumpForce | ApexThreshold | ApexGravityMultiplier | FallGravityMult | JumpCutMultiplier |
|
||||
|---|---|---|---|---|---|---|
|
||||
| **高速紧实(类空洞骑士)** | 6.0 | 24.0 | 3.0 | 0.30 | 2.5 | 0.35 |
|
||||
| **标准平台(居中)** | 4.5 | 21.0 | 2.5 | 0.35 | 3.0 | 0.40 |
|
||||
| **漂浮感(慢节奏)** | 3.0 | 19.0 | 4.0 | 0.20 | 2.0 | 0.50 |
|
||||
|
||||
---
|
||||
|
||||
### 1.4 跳跃节奏速查(高速紧实组合)
|
||||
|
||||
使用 `DefaultGravityScale=6, JumpForce=24, ApexThreshold=3, ApexGravityMultiplier=0.3` 时:
|
||||
|
||||
- 上升段时长(vy: 24 → 3):`(24−3) / (9.81×6) ≈ 0.357s`
|
||||
- 顶点悬停时长(vy: 3 → 0,重力×0.3):`3 / (9.81×6×0.3) ≈ 0.170s`
|
||||
- 总上升时长:`≈ 0.53s`
|
||||
- 顶点高度:`≈ 5.0 单位`
|
||||
- 下落至起跳点时长(总重力 ~73.6 m/s²):`≈ 0.37s`
|
||||
- **总跳跃时长:≈ 0.90s**
|
||||
|
||||
---
|
||||
|
||||
## 二、冲刺系统
|
||||
|
||||
### 2.1 物理模型概述
|
||||
|
||||
```
|
||||
地面冲刺: ──────────────────────► 结束 → 双轴速度归零 → Idle/Fall
|
||||
重力关闭 DashSpeed ZeroVelocity() + 恢复重力
|
||||
|
||||
空中冲刺: ──────────────────────► 结束 → 双轴速度归零 → FallState(垂直坠落)
|
||||
重力关闭 DashSpeed ZeroVelocity() + 恢复重力
|
||||
```
|
||||
|
||||
**两者使用完全相同的 `DashSpeed` × `DashDuration`,冲刺距离由设计保证一致。**
|
||||
若实测感觉有差异,是地面摩擦/碰撞响应造成的视觉误差,不影响实际数值距离。
|
||||
|
||||
**结束行为差异**(设计意图,非 bug):
|
||||
|
||||
| | 地面冲刺结束 | 空中冲刺结束 |
|
||||
|---|---|---|
|
||||
| 速度处理 | **`ZeroVelocity()`** — 双轴立即归零 | **`ZeroVelocity()`** — 双轴立即归零 |
|
||||
| 视觉效果 | 角色在冲刺末端原位停止 | 角色在原位瞬间停止,垂直坠落 |
|
||||
| 撞墙提前结束 | 同上,`ZeroVelocity()` + 恢复重力 | 同左 |
|
||||
|
||||
### 2.2 参数说明与推荐值
|
||||
|
||||
| 参数 | 类型 | 当前默认 | 推荐(类空洞骑士) | 说明 |
|
||||
|---|---|---|---|---|
|
||||
| `DashSpeed` | float | 25.0 | **22.0** | 冲刺水平速度(单位/秒)。影响单次冲刺位移 = `DashSpeed × DashDuration`。 |
|
||||
| `DashDuration` | float | 0.35 | **0.30** | 冲刺持续时长(秒)。 |
|
||||
| `DashCooldown` | float | 0.60 | **0.50** | 落地后到可再次冲刺的等待时长(秒)。 |
|
||||
| `MaxAerialDashes` | int | 1 | **1** | 每次腾空可使用的空中冲刺次数,落地重置。 |
|
||||
|
||||
**单次冲刺水平位移速查**:
|
||||
|
||||
| DashSpeed | DashDuration | 水平位移 |
|
||||
|---|---|---|
|
||||
| 25.0 | 0.35s | **8.75 单位** |
|
||||
| 22.0 | 0.30s | **6.60 单位** |
|
||||
| 20.0 | 0.32s | **6.40 单位** |
|
||||
|
||||
> 💡 项目网格如果是 1 unit = 1 格,推荐控制冲刺位移在 **6-8 格**;过长会导致跳过障碍物布局。
|
||||
|
||||
### 2.3 无敌帧参数
|
||||
|
||||
| 参数 | 类型 | 推荐值 | 说明 |
|
||||
|---|---|---|---|
|
||||
| `DashInvincibilityDuration` | float | 0.20 | 冲刺无敌窗口时长(秒)。仅为前段,窗口结束前角色仍在冲刺中可被打断。 |
|
||||
| `DashInvincibilityCooldown` | float | 0.90 | 无敌帧专属冷却(秒)。CD 内再次冲刺不获得无敌,防止连冲无限无敌。 |
|
||||
|
||||
> ⚠️ 无敌功能还依赖 `PlayerStats` 中的 `HasAbility(InvincibleDash)` 能力解锁,未解锁时此参数无效。
|
||||
|
||||
---
|
||||
|
||||
## 三、常见调参问题排查
|
||||
|
||||
| 现象 | 可能原因 | 排查方向 |
|
||||
|---|---|---|
|
||||
| 跳跃感觉很"飘",落地慢 | `DefaultGravityScale` 过低,或 `FallGravityMult` 过低 | 调高 DefaultGravityScale(→5-6),同步调高 JumpForce |
|
||||
| 顶点没有悬停感 | `ApexThreshold` 过低或 `ApexGravityMultiplier` 过高 | 调高 ApexThreshold(→3-5),调低 ApexGravityMultiplier(→0.2-0.3) |
|
||||
| 短按跳跃与长按高度差不明显 | `JumpCutMultiplier` 过高 | 调低至 0.25-0.35 |
|
||||
| 空中冲刺结束后角色向前飞 | 旧版本 bug(已修复):AerialDashState 结束时未归零速度 | 确认使用当前版本代码 |
|
||||
| 冲刺距离太长,穿越关卡障碍 | `DashSpeed × DashDuration` 过大 | 降低 DashSpeed 或 DashDuration |
|
||||
| 冲刺 CD 太长,影响流畅感 | `DashCooldown` 过高 | 降至 0.4-0.5s |
|
||||
| 离开平台边缘后无法起跳 | `CoyoteTime` 太短 | 调高至 0.10-0.15s |
|
||||
|
||||
---
|
||||
|
||||
## 四、修改历史
|
||||
|
||||
| 日期 | 修改内容 |
|
||||
|---|---|
|
||||
| 2026-05-17 | 初版:新增顶点悬停参数(`ApexThreshold` / `ApexGravityMultiplier`);修复空中冲刺结束速度未归零问题;`JumpCutMultiplier` 默认值从 0.45 调整为 0.35 |
|
||||
21
Docs/Tuning/README.md
Normal file
21
Docs/Tuning/README.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# Tuning — 开发者参数配置指南
|
||||
|
||||
本文件夹收录各系统的**运行时参数配置说明**,面向关卡设计师与开发者,说明每组参数的物理含义、调整方向以及推荐初始值。
|
||||
|
||||
所有参数均在对应的 ScriptableObject 中配置,无需修改代码。
|
||||
|
||||
---
|
||||
|
||||
## 目录
|
||||
|
||||
| 文件 | 覆盖系统 |
|
||||
|---|---|
|
||||
| [PlayerJumpDash_Tuning.md](PlayerJumpDash_Tuning.md) | 玩家跳跃 / 冲刺手感参数 |
|
||||
|
||||
---
|
||||
|
||||
## 通用约定
|
||||
|
||||
- **单位**:Unity 世界空间单位(1 unit ≈ 1 米,项目中约等于 1 个格子宽)
|
||||
- **帧率**:Physics FixedUpdate 默认 50Hz(0.02s/步)
|
||||
- **重力**:`Physics2D.gravity.y = -9.81`,各重力相关参数均以此为基准倍率
|
||||
@@ -69,6 +69,7 @@
|
||||
| [10_Manual_ProgressionSystem.md](10_Manual_ProgressionSystem.md) | 技能/护符/任务/成就/商店/形态切换 | Play Mode 手动 |
|
||||
| [11_Manual_UIAudioVFX.md](11_Manual_UIAudioVFX.md) | HUD、UI 面板、音频 Mixer、VFX/Feedback | Play Mode 手动 |
|
||||
| [12_Manual_CameraSystem.md](12_Manual_CameraSystem.md) | 区域相机切换、CinemachineConfiner、屏幕抖动 | Play Mode 手动 |
|
||||
| [13_Manual_PlayerAbilities_Skills.md](13_Manual_PlayerAbilities_Skills.md) | 攻击三连击/上劈/下劈Pogo/空中攻击、抓墙/蹬墙跳、二段跳、无敌冲刺、三形态切换、三套资源、灵泉使用/充能、魂技能/魄技能、弹反 | Play Mode 手动 |
|
||||
|
||||
---
|
||||
|
||||
|
||||
937
Docs/Verification/13_Manual_PlayerAbilities_Skills.md
Normal file
937
Docs/Verification/13_Manual_PlayerAbilities_Skills.md
Normal file
@@ -0,0 +1,937 @@
|
||||
# 手动测试 13 · 玩家能力与技能系统
|
||||
|
||||
> **测试类型**:Unity Editor 手动测试(Play Mode)
|
||||
> **覆盖模块**:`BaseGames.Player`、`BaseGames.Player.States`、`BaseGames.Skills`
|
||||
> **依赖组件**:`PlayerController`、`PlayerMovement`、`PlayerStats`、`PlayerCombat`、`FormController`、`SkillManager`、`SpringSystem`、`ParrySystem`
|
||||
> **场景要求**:包含玩家 Prefab 的测试场景,至少一块地面平台、一面垂直墙、若干测试用敌人
|
||||
|
||||
---
|
||||
|
||||
## 快速工具
|
||||
|
||||
| 工具 | 用途 | 菜单路径 |
|
||||
|------|------|----------|
|
||||
| **Place Player** | 放置完整玩家 GameObject | `BaseGames → Scene → Place → Player` |
|
||||
| **Place Ground Platform** | 放置地面平台(Layer=Ground) | `BaseGames → Scene → Place → Ground Platform` |
|
||||
| **Place Obstacle (Static)** | 放置垂直墙壁(用于抓墙测试) | `BaseGames → Scene → Place → Obstacle (Static)` |
|
||||
| **Place Test Enemy** | 放置静止测试用敌人(带 HurtBox) | `BaseGames → Scene → Place → Test Enemy` |
|
||||
| **Place Room Camera** | 放置 Cinemachine 相机 | `BaseGames → Scene → Place → Room Camera` |
|
||||
|
||||
---
|
||||
|
||||
## 场景搭建要求
|
||||
|
||||
在运行所有测试前,请确认以下清单:
|
||||
|
||||
| 检查项 | 说明 | ✓ |
|
||||
|--------|------|---|
|
||||
| 玩家 Prefab 已放置 | 带 `PlayerController`、`PlayerMovement`、`PlayerStats`、`PlayerCombat`、`FormController`、`SkillManager`、`SpringSystem`、`ParrySystem`、`HurtBox`、`AnimancerComponent`、`WeaponManager` | ☐ |
|
||||
| 地面平台 | Layer = `Ground`,至少一块宽平台 | ☐ |
|
||||
| 垂直墙壁 | Layer = `Ground`,高度 ≥ 4 格,用于抓墙/蹬墙跳测试 | ☐ |
|
||||
| 测试用敌人 | 带 `HurtBox`、`EnemyBase`,初始静止,用于攻击/Pogo/灵泉充能测试 | ☐ |
|
||||
| InputReaderSO | 已绑定 `_inputReader` 字段 | ☐ |
|
||||
| PlayerMovementConfigSO | 已绑定,含跳跃/冲刺/墙壁相关参数 | ☐ |
|
||||
| PlayerAnimationConfigSO | 已绑定,含所有动画 Clip 资产 | ☐ |
|
||||
| FormConfigSO | 已绑定到 `FormController._config`,三形态 SO 已配置 | ☐ |
|
||||
| SkillManager._formSkillSets | Inspector 中已配置三个 `FormSkillSet`,每项指定对应形态的三个技能 SO | ☐ |
|
||||
| SkillManager._formController | Inspector 中已绑定 `FormController` 引用 | ☐ |
|
||||
| Physics2D Layer 矩阵 | PlayerHitBox ↔ EnemyHurtBox、Player ↔ Ground 碰撞均已开启 | ☐ |
|
||||
| Console 无红色 Error | 进入 Play Mode 前 Error = 0 | ☐ |
|
||||
|
||||
---
|
||||
|
||||
## 目录
|
||||
|
||||
1. [MT-ABILITY-01:地面三连击与攻击缓冲](#mt-ability-01地面三连击与攻击缓冲)
|
||||
2. [MT-ABILITY-02:上劈(地面 / 空中)](#mt-ability-02上劈地面--空中)
|
||||
3. [MT-ABILITY-03:下劈与 Pogo 弹起](#mt-ability-03下劈与-pogo-弹起)
|
||||
4. [MT-ABILITY-04:空中水平攻击](#mt-ability-04空中水平攻击)
|
||||
5. [MT-ABILITY-05:攻击取消窗口](#mt-ability-05攻击取消窗口)
|
||||
6. [MT-ABILITY-06:抓墙与高度记忆机制](#mt-ability-06抓墙与高度记忆机制)
|
||||
7. [MT-ABILITY-07:蹬墙跳(背墙跳 / 对墙跳)](#mt-ability-07蹬墙跳背墙跳--对墙跳)
|
||||
8. [MT-ABILITY-08:二段跳](#mt-ability-08二段跳)
|
||||
9. [MT-ABILITY-09:无敌冲刺](#mt-ability-09无敌冲刺)
|
||||
10. [MT-ABILITY-10:三形态切换](#mt-ability-10三形态切换)
|
||||
11. [MT-ABILITY-11:三套资源系统](#mt-ability-11三套资源系统)
|
||||
12. [MT-ABILITY-12:灵泉使用](#mt-ability-12灵泉使用)
|
||||
13. [MT-ABILITY-13:灵泉充能(击杀积累)](#mt-ability-13灵泉充能击杀积累)
|
||||
14. [MT-ABILITY-14:魂技能施放](#mt-ability-14魂技能施放)
|
||||
15. [MT-ABILITY-15:魄技能施放(技能 1 / 2)](#mt-ability-15魄技能施放技能-1--2)
|
||||
16. [MT-ABILITY-16:弹反系统](#mt-ability-16弹反系统)
|
||||
|
||||
---
|
||||
|
||||
## MT-ABILITY-01:地面三连击与攻击缓冲
|
||||
|
||||
**目的**:验证地面三段连击的前摇/有效帧/后摇三阶段、HitBox 激活时序、攻击缓冲机制。
|
||||
|
||||
### 前置条件
|
||||
|
||||
- 玩家站于地面
|
||||
- 在玩家攻击范围内放置测试用敌人
|
||||
|
||||
### 步骤 A:三段连击完整触发
|
||||
|
||||
1. 进入 Play Mode
|
||||
2. 玩家站立地面,按 **Attack 键**(默认 `J`)
|
||||
|
||||
**预期**:
|
||||
- 播放第 1 段攻击动画(`AnimationConfigSO.GroundAttacks[0]`)
|
||||
- 动画前摇结束时 HitBox 激活(可在 Scene 视图 Gizmos 中观察 HitBox 矩形出现)
|
||||
- 命中敌人后敌人 HP 减少,玩家方向上有微小横向反嵈位移
|
||||
|
||||
3. 动画进入后摇阶段后(有效帧结束),再次按 **Attack 键**
|
||||
|
||||
**预期**:
|
||||
- 无缝衔接第 2 段攻击动画(`GroundAttacks[1]`)
|
||||
- 第 2 段 HitBox 重新激活
|
||||
|
||||
4. 同样方式触发第 3 段
|
||||
|
||||
**预期**:
|
||||
- 播放 `GroundAttacks[2]`,第三段攻击完成后动画自然结束
|
||||
- 玩家返回 `IdleState` 或 `RunState`
|
||||
|
||||
### 步骤 B:攻击缓冲(后摇内预输入)
|
||||
|
||||
1. 按下 **Attack 键** 触发第 1 段攻击
|
||||
2. **在后摇期间**(有效帧结束前后)提前再次按 **Attack 键**
|
||||
|
||||
**预期**:
|
||||
- 第 1 段后摇结束后**自动**衔接第 2 段,无需再次按键
|
||||
- 缓冲窗口内的输入被 `InputBuffer` 记录并消耗
|
||||
|
||||
### 步骤 C:攻击中断复位
|
||||
|
||||
1. 第 1 段攻击完成后等待后摇完全结束(约 1.5 秒不操作)
|
||||
2. 再次按 **Attack 键**
|
||||
|
||||
**预期**:
|
||||
- 从第 1 段重新开始,而非继续第 2 段(连击计数已重置)
|
||||
|
||||
| 检查点 | 期望 | ✓ |
|
||||
|--------|------|---|
|
||||
| 三段动画各不相同 | 三段 Clip 依次切换 | ☐ |
|
||||
| HitBox 仅在有效帧激活 | 前摇期间无碰撞,Gizmos 不显示 HitBox | ☐ |
|
||||
| 命中反嵈 | 命中敌人时玩家微小位移(打击感) | ☐ |
|
||||
| 攻击缓冲生效 | 后摇内按键可自动续接下一段 | ☐ |
|
||||
| 连击计数超时重置 | 久未续接后从第 1 段重新开始 | ☐ |
|
||||
| Console 无 Error | 0 个红色 Error | ☐ |
|
||||
|
||||
---
|
||||
|
||||
## MT-ABILITY-02:上劈(地面 / 空中)
|
||||
|
||||
**目的**:验证上劈的组合键判定(Move Y 轴正向 + Attack)、向上 HitBox 激活、空中向下反嵈。
|
||||
|
||||
### 前置条件
|
||||
|
||||
- 在玩家正上方位置放置测试用敌人(调高 Y 坐标)
|
||||
|
||||
### 步骤 A:地面上劈
|
||||
|
||||
1. 玩家站立地面
|
||||
2. 按住 **Move 上方向键**(`W` 或上方向键,Y 轴正向),同时按 **Attack 键**
|
||||
|
||||
**预期**:
|
||||
- 触发上劈动画(`AnimationConfigSO.UpAttack` 对应 Clip)
|
||||
- HitBox 在角色**正上方**激活(Scene 视图 Gizmos 可见)
|
||||
- 命中正上方敌人,敌人 HP 减少
|
||||
- 玩家仍停留地面,无明显上移(地面上劈无空中反嵈)
|
||||
|
||||
### 步骤 B:空中上劈与向下反嵈
|
||||
|
||||
1. 跳跃至空中
|
||||
2. 在空中按住 **Move 上方向键** + **Attack 键**
|
||||
|
||||
**预期**:
|
||||
- 触发上劈动画
|
||||
- **玩家 Y 轴速度减少约 3(向下反嵈)**,可在 Inspector → `Rigidbody2D.velocity.y` 观察到短暂下移
|
||||
- 上劈动画结束后进入 `FallState`
|
||||
- 命中敌人后敌人 HP 减少
|
||||
|
||||
### 步骤 C:Move Y 阈值边界
|
||||
|
||||
1. 空中仅按轻推上方向(Y 轴输入 < 0.5),同时按 **Attack 键**
|
||||
|
||||
**预期**:
|
||||
- 触发普通空中水平攻击,而非上劈(Y 阈值未达到 0.5 不判定为上劈)
|
||||
|
||||
| 检查点 | 期望 | ✓ |
|
||||
|--------|------|---|
|
||||
| 地面上劈 HitBox 在上方 | Scene Gizmos 可见上方碰撞盒 | ☐ |
|
||||
| 空中上劈向下反嵈 | velocity.y 降低约 3,玩家微向下位移 | ☐ |
|
||||
| Y 轴阈值正确 | 轻推不触发上劈 | ☐ |
|
||||
| 动画正确 | 播放上劈专属 Clip | ☐ |
|
||||
|
||||
---
|
||||
|
||||
## MT-ABILITY-03:下劈与 Pogo 弹起
|
||||
|
||||
**目的**:验证下劈仅限空中触发、向下速度施加、命中 Pogo 弹起机制(重置空中能力)、未命中继续下落。
|
||||
|
||||
### 前置条件
|
||||
|
||||
- 玩家位于测试敌人正上方(高度 ≥ 3 格)
|
||||
- 测试敌人带有 `HurtBox` 组件
|
||||
|
||||
### 步骤 A:空中下劈命中 Pogo
|
||||
|
||||
1. 跳跃至测试敌人正上方
|
||||
2. 按住 **Move 下方向键**(`S` 或下方向键,Y 轴负向),同时按 **Attack 键**
|
||||
|
||||
**预期**:
|
||||
- 触发下劈动画(`AnimationConfigSO.DownAttack` 对应 Clip)
|
||||
- 玩家 Y 轴速度被设为约 `-18`,快速向下冲击
|
||||
- 下方 HitBox 激活
|
||||
- **命中敌人后**:玩家立即向上弹起(`Pogo Jump`,高度固定),与普通跳跃力度相似
|
||||
- Pogo 触发后空中冲刺次数重置(`_airDashUsed = false`)
|
||||
- Pogo 触发后空中跳跃次数重置(`AirJumpsLeft` 恢复为最大值)
|
||||
|
||||
### 步骤 B:空中下劈未命中
|
||||
|
||||
1. 在空旷区域(无敌人/无特殊物体)跳跃
|
||||
2. 空中使用下劈
|
||||
|
||||
**预期**:
|
||||
- 下劈动画和向下速度正常
|
||||
- **未命中任何目标**:玩家**不弹起**,继续受重力下落至地面
|
||||
- 落地后进入 `IdleState`
|
||||
|
||||
### 步骤 C:地面下劈无效
|
||||
|
||||
1. 玩家站立地面
|
||||
2. 按住 **Move 下方向键** + **Attack 键**
|
||||
|
||||
**预期**:
|
||||
- **触发普通地面水平攻击**(或无响应),不触发下劈
|
||||
- 下劈判定限制在空中状态 `!IsGrounded`
|
||||
|
||||
### 步骤 D:Pogo 后续接二段跳
|
||||
|
||||
1. 解锁二段跳(`PlayerStats.UnlockAbility(AbilityType.DoubleJump)`,可在 Inspector 勾选)
|
||||
2. 空中下劈命中 Pogo 弹起
|
||||
3. 弹起途中按 **Jump 键**
|
||||
|
||||
**预期**:
|
||||
- Pogo 重置空中跳跃次数,可再次使用二段跳
|
||||
|
||||
| 检查点 | 期望 | ✓ |
|
||||
|--------|------|---|
|
||||
| 仅限空中触发 | 地面不触发下劈 | ☐ |
|
||||
| 向下冲击速度 | velocity.y ≈ -18 | ☐ |
|
||||
| 命中 Pogo 弹起 | 玩家向上弹起,高度固定 | ☐ |
|
||||
| Pogo 重置冲刺次数 | Pogo 后可再次空中冲刺 | ☐ |
|
||||
| Pogo 重置跳跃次数 | Pogo 后可再次二段跳(已解锁时) | ☐ |
|
||||
| 未命中不弹起 | 继续下落至地面 | ☐ |
|
||||
|
||||
---
|
||||
|
||||
## MT-ABILITY-04:空中水平攻击
|
||||
|
||||
**目的**:验证空中水平攻击(`AirAttackState`)的触发条件、单次攻击、动画、结束返回 FallState。
|
||||
|
||||
### 步骤 A:空中普通攻击
|
||||
|
||||
1. 跳跃至空中
|
||||
2. 按 **Attack 键**(不按方向,或左右方向,Y 轴绝对值 < 0.5)
|
||||
|
||||
**预期**:
|
||||
- 触发空中水平攻击动画(`AnimationConfigSO.AirAttack`)
|
||||
- HitBox 在角色侧面激活(`AttackDirection.Air`)
|
||||
- 动画完成后进入 `FallState`,继续下落
|
||||
- 命中敌人 HP 减少
|
||||
|
||||
### 步骤 B:空中攻击不循环
|
||||
|
||||
1. 空中连续多次按 **Attack 键**
|
||||
|
||||
**预期**:
|
||||
- 空中攻击为单次,不进行连段
|
||||
- 每次须等动画结束后重新输入才能再次攻击
|
||||
|
||||
| 检查点 | 期望 | ✓ |
|
||||
|--------|------|---|
|
||||
| 触发空中攻击动画 | 播放 AirAttack Clip | ☐ |
|
||||
| HitBox 侧面激活 | Scene Gizmos 可见侧面碰撞盒 | ☐ |
|
||||
| 结束后 FallState | 攻击完成后继续下落,不卡住 | ☐ |
|
||||
| 单次不循环 | 无法连续多段空中攻击 | ☐ |
|
||||
|
||||
---
|
||||
|
||||
## MT-ABILITY-05:攻击取消窗口
|
||||
|
||||
**目的**:验证攻击后摇期间的取消窗口允许通过跳跃/冲刺打断攻击动作。
|
||||
|
||||
### 步骤 A:攻击后跳跃取消
|
||||
|
||||
1. 地面攻击触发第 1 段
|
||||
2. 在**有效帧结束后、后摇结束前**(取消窗口期间)按 **Jump 键**
|
||||
|
||||
**预期**:
|
||||
- 立即从 `AttackState` 转入 `JumpState`
|
||||
- 不必等待后摇完全结束即可起跳
|
||||
- 取消窗口关闭后(后摇末尾)按 Jump 则无法打断
|
||||
|
||||
### 步骤 B:攻击后冲刺取消
|
||||
|
||||
1. 地面攻击触发第 1 段
|
||||
2. 在取消窗口期间按 **Dash 键**
|
||||
|
||||
**预期**:
|
||||
- 立即进入 `DashState`,打断后摇
|
||||
|
||||
### 步骤 C:取消窗口外不可取消
|
||||
|
||||
1. 地面攻击触发第 1 段
|
||||
2. 在**前摇期间**(有效帧之前)按 **Jump 键**
|
||||
|
||||
**预期**:
|
||||
- 跳跃**无效**,必须等待取消窗口开放后才可取消
|
||||
|
||||
| 检查点 | 期望 | ✓ |
|
||||
|--------|------|---|
|
||||
| 取消窗口内可跳跃 | Jump 立即打断后摇 | ☐ |
|
||||
| 取消窗口内可冲刺 | Dash 立即打断后摇 | ☐ |
|
||||
| 前摇内无法取消 | Jump/Dash 在前摇期间无响应 | ☐ |
|
||||
|
||||
---
|
||||
|
||||
## MT-ABILITY-06:抓墙与高度记忆机制
|
||||
|
||||
**目的**:验证触发条件、无需持续按键维持、高度记忆防无限攀爬逻辑(正常模式静止 / 受限模式下滑)。
|
||||
|
||||
### 前置条件
|
||||
|
||||
- 在玩家右侧放置高度 ≥ 6 格的垂直墙壁(Layer=Ground)
|
||||
|
||||
### 步骤 A:基本抓墙触发
|
||||
|
||||
1. 向右跳跃,在空中接触右侧墙壁
|
||||
2. 按住 **Move 右方向键**(朝向墙壁方向,X 轴正向)
|
||||
|
||||
**预期**:
|
||||
- 进入 `WallSlideState`
|
||||
- 播放抓墙动画
|
||||
- **松开方向键**后角色仍保持抓墙状态(无需持续按键)
|
||||
|
||||
### 步骤 B:主动松墙
|
||||
|
||||
1. 抓墙状态下按下 **Move 左方向键**(反方向键)
|
||||
|
||||
**预期**:
|
||||
- 立即解除抓墙,进入 `FallState`
|
||||
|
||||
### 步骤 C:正常模式(抓墙高度 ≤ wallGrabY)—— 静止悬挂
|
||||
|
||||
1. 跳跃至墙壁中部,触发抓墙(记录 `wallGrabY`)
|
||||
2. 松开方向键,观察角色是否移动
|
||||
|
||||
**预期**:
|
||||
- 角色**静止悬挂**,Y 坐标不变
|
||||
- 可以在此状态触发蹬墙跳
|
||||
|
||||
### 步骤 D:受限模式(抓墙高度 > wallGrabY)—— 持续下滑且无法蹬墙跳
|
||||
|
||||
1. 在 C 的基础上,直接跳跃后**更高处再次贴墙**(同一面墙,但 Y 坐标高于 `wallGrabY`)
|
||||
2. 触发抓墙,松开方向键
|
||||
|
||||
**预期**:
|
||||
- 角色**持续向下滑动**(受限模式)
|
||||
- **无法触发蹬墙跳**(按 Jump 键无效)
|
||||
|
||||
> **💡 操作技巧**:从地面站立后直接跳上更高位置并贴墙,此时 Y > wallGrabY(因为上一次落地已重置),也可以先蹬墙跳到更高处再贴同一面墙来制造 Y > wallGrabY 的情况。
|
||||
|
||||
### 步骤 E:落地重置 wallGrabY
|
||||
|
||||
1. 完成 C 的抓墙后蹬墙跳离墙,落地
|
||||
2. 再次跳跃贴同一面墙(高度与 C 中相同)
|
||||
|
||||
**预期**:
|
||||
- 落地后 `wallGrabY` 已重置,该高度重新进入**正常模式**(静止悬挂,可蹬墙跳)
|
||||
|
||||
### 步骤 F:贴另一面墙重置 wallGrabY
|
||||
|
||||
1. 在步骤 C 中抓右侧墙壁后,蹬墙跳至左侧墙壁
|
||||
2. 在左侧墙壁比之前更高处抓墙
|
||||
|
||||
**预期**:
|
||||
- 切换到另一面墙壁时 `wallGrabY` 重置为新值
|
||||
- 该高度为正常模式(可静止,可蹬墙跳)
|
||||
|
||||
| 检查点 | 期望 | ✓ |
|
||||
|--------|------|---|
|
||||
| 朝墙方向键触发抓墙 | 接触墙 + 朝墙输入 → WallSlideState | ☐ |
|
||||
| 无需持续按键 | 松开方向键后仍保持抓墙 | ☐ |
|
||||
| 反向键松墙 | FallState | ☐ |
|
||||
| 正常模式静止 | Y 坐标不变,不下滑 | ☐ |
|
||||
| 受限模式下滑 | 高于 wallGrabY 时持续下滑 | ☐ |
|
||||
| 受限模式无蹬墙跳 | Jump 键在受限模式无效 | ☐ |
|
||||
| 落地重置 | 落地后 wallGrabY 清零 | ☐ |
|
||||
| 换墙重置 | 抓另一面墙时记录新 wallGrabY | ☐ |
|
||||
|
||||
---
|
||||
|
||||
## MT-ABILITY-07:蹬墙跳(背墙跳 / 对墙跳)
|
||||
|
||||
**目的**:验证背墙跳(Away)和对墙跳(Toward)的方向判定与施力、视为第一段跳、可变高度支持。
|
||||
|
||||
### 前置条件
|
||||
|
||||
- 玩家处于正常抓墙状态(高度 ≤ wallGrabY,可触发蹬墙跳)
|
||||
|
||||
### 步骤 A:背墙跳(Away Jump)
|
||||
|
||||
1. 抓右侧墙壁,**不按任何水平方向键**(或按左键,即反方向)
|
||||
2. 按 **Jump 键**
|
||||
|
||||
**预期**:
|
||||
- 玩家朝**远离右墙方向**弹出(向左上方),播放 WallJumpAway 动画
|
||||
- 弹出后有约 0.2-0.3 秒的水平输入锁定(`_inputLockTimer`),锁定结束后可自由控制水平方向
|
||||
- `AirJumpsLeft` 恢复(视为第一段跳)
|
||||
|
||||
### 步骤 B:对墙跳(Toward Jump)
|
||||
|
||||
1. 抓右侧墙壁,按住 **Move 右方向键**(朝墙方向)
|
||||
2. 按 **Jump 键**
|
||||
|
||||
**预期**:
|
||||
- 玩家朝**朝向右墙方向弹出**(向右上方),施力偏向竖直,水平分量较小
|
||||
- 播放 WallJumpToward 动画
|
||||
- 同样视为第一段跳,`AirJumpsLeft` 恢复
|
||||
|
||||
### 步骤 C:蹬墙跳后可接二段跳(已解锁时)
|
||||
|
||||
1. 背墙跳后,在空中再次按 **Jump 键**
|
||||
|
||||
**预期**:
|
||||
- 若已解锁二段跳,此时可触发二段跳(`AirJumpsLeft > 0`)
|
||||
- 若未解锁,按 Jump 无效
|
||||
|
||||
### 步骤 D:蹬墙跳可变高度
|
||||
|
||||
1. 背墙跳后立即松开 **Jump 键**
|
||||
|
||||
**预期**:
|
||||
- 跳跃高度降低(同普通跳跃可变高度,提前松键截断上升速度)
|
||||
|
||||
### 步骤 E:受限模式下无蹬墙跳
|
||||
|
||||
1. 使玩家抓墙高度 > wallGrabY(受限模式)
|
||||
2. 按 **Jump 键**
|
||||
|
||||
**预期**:
|
||||
- 蹬墙跳不触发(按 Jump 在受限模式无反应)
|
||||
|
||||
| 检查点 | 期望 | ✓ |
|
||||
|--------|------|---|
|
||||
| 背墙跳方向正确 | 远离墙壁斜上方弹出 | ☐ |
|
||||
| 对墙跳方向正确 | 朝墙壁斜上方弹出,更偏垂直 | ☐ |
|
||||
| 输入锁定(背墙跳) | 弹出后短时无法控制水平方向 | ☐ |
|
||||
| 视为第一段跳 | AirJumpsLeft 重置 | ☐ |
|
||||
| 可接二段跳 | 蹬墙跳后可再次按 Jump(已解锁) | ☐ |
|
||||
| 可变高度 | 提前松键降低弹跳高度 | ☐ |
|
||||
| 受限模式无效 | 受限抓墙时 Jump 无响应 | ☐ |
|
||||
|
||||
---
|
||||
|
||||
## MT-ABILITY-08:二段跳
|
||||
|
||||
**目的**:验证二段跳的解锁门控、空中二次起跳、高度低于一段跳、可变高度支持。
|
||||
|
||||
### 前置条件
|
||||
|
||||
- 在 `PlayerStats` Inspector 中确认 `AbilityType.DoubleJump` 是否已解锁
|
||||
- **步骤 A 使用未解锁状态,步骤 B 及以后需先解锁**
|
||||
|
||||
### 步骤 A:未解锁时空中 Jump 无效
|
||||
|
||||
1. 确认二段跳**未解锁**(`AbilityFlags` 中无 `DoubleJump`)
|
||||
2. 跳跃至空中
|
||||
3. 在下落途中按 **Jump 键**
|
||||
|
||||
**预期**:
|
||||
- Jump 无效,不产生二次跳跃
|
||||
|
||||
### 步骤 B:解锁后空中二段跳
|
||||
|
||||
1. 在 Inspector 中勾选 `DoubleJump` 解锁(或调用 `Stats.UnlockAbility(DoubleJump)` 通过 Console)
|
||||
2. 跳跃至空中,在最高点前或下落时按 **Jump 键**
|
||||
|
||||
**预期**:
|
||||
- 触发二段跳动画(`DoubleJump` Clip)
|
||||
- 玩家再次向上弹起,高度明显低于一段跳
|
||||
- `AirJumpsLeft` 由 1 减为 0
|
||||
|
||||
3. 二段跳后再次按 **Jump 键**
|
||||
|
||||
**预期**:
|
||||
- 无响应(`AirJumpsLeft == 0`,无更多空中跳跃机会)
|
||||
|
||||
### 步骤 C:二段跳可变高度
|
||||
|
||||
1. 二段跳后立即松开 **Jump 键**
|
||||
|
||||
**预期**:
|
||||
- 跳跃高度降低(提前松键截断上升速度)
|
||||
|
||||
### 步骤 D:落地重置二段跳次数
|
||||
|
||||
1. 使用二段跳后落地
|
||||
2. 再次跳跃,在空中按 **Jump 键**
|
||||
|
||||
**预期**:
|
||||
- `AirJumpsLeft` 已重置(落地时 `ResetAirJumps()` 调用),可再次使用二段跳
|
||||
|
||||
| 检查点 | 期望 | ✓ |
|
||||
|--------|------|---|
|
||||
| 未解锁时无效 | 空中 Jump 无响应 | ☐ |
|
||||
| 解锁后可二段跳 | 空中第二次 Jump 触发 | ☐ |
|
||||
| 二段跳高度低于一段 | 弹起高度明显更低 | ☐ |
|
||||
| 二段跳次数限制 | 第三次 Jump 无响应 | ☐ |
|
||||
| 可变高度 | 提前松键降低高度 | ☐ |
|
||||
| 落地后重置 | 落地后可再次二段跳 | ☐ |
|
||||
|
||||
---
|
||||
|
||||
## MT-ABILITY-09:无敌冲刺
|
||||
|
||||
**目的**:验证无敌冲刺的解锁门控、冲刺期间无敌帧(不受伤害)、独立冷却机制。
|
||||
|
||||
### 前置条件
|
||||
|
||||
- 在 `PlayerStats` Inspector 中确认 `AbilityType.InvincibleDash` 是否已解锁
|
||||
- 在测试场景中放置一个会持续攻击的测试敌人(或使用调试工具手动给玩家造成伤害)
|
||||
|
||||
### 步骤 A:未解锁时冲刺无无敌帧
|
||||
|
||||
1. 确认无敌冲刺**未解锁**
|
||||
2. 在敌人攻击范围内进行冲刺
|
||||
|
||||
**预期**:
|
||||
- 冲刺期间受到伤害,进入 `HurtState`(基础冲刺无无敌帧)
|
||||
|
||||
### 步骤 B:解锁后冲刺无敌帧
|
||||
|
||||
1. 解锁 `InvincibleDash`
|
||||
2. 在敌人攻击方向上冲刺穿越
|
||||
|
||||
**预期**:
|
||||
- 冲刺期间**不受伤害**(`Stats.IsInvincible == true` 持续 `DashInvincibilityDuration` 约 0.20s)
|
||||
- 无敌期间 Inspector 中 `IsInvincible` 字段为 true
|
||||
- 无敌帧结束后恢复正常受伤判定
|
||||
|
||||
### 步骤 C:无敌冲刺独立冷却
|
||||
|
||||
1. 无敌冲刺后立即再次冲刺
|
||||
|
||||
**预期**:
|
||||
- 第 2 次冲刺可正常触发(冲刺本身冷却 ≈ 0.4s)
|
||||
- 但第 2 次冲刺**无无敌帧**(无敌帧有独立冷却,需等待更长时间恢复)
|
||||
- Inspector 中 `_invincibilityCooldownTimer > 0` 时不授予无敌
|
||||
|
||||
| 检查点 | 期望 | ✓ |
|
||||
|--------|------|---|
|
||||
| 未解锁无无敌 | 冲刺中受伤进入 HurtState | ☐ |
|
||||
| 解锁后有无敌帧 | 冲刺期间 IsInvincible=true,不受伤 | ☐ |
|
||||
| 无敌帧持续时间 | 约 0.20s 后 IsInvincible 变 false | ☐ |
|
||||
| 独立冷却 | 短时间内第 2 次冲刺无无敌帧 | ☐ |
|
||||
|
||||
---
|
||||
|
||||
## MT-ABILITY-10:三形态切换
|
||||
|
||||
**目的**:验证三形态切换的输入响应、武器/动画随形态更新、技能集随形态更新。
|
||||
|
||||
### 前置条件
|
||||
|
||||
- `FormConfigSO` 中三个 FormSO(天魂/地魂/命魂)已配置,各有不同武器 Prefab
|
||||
- `SkillManager._formSkillSets` 数组已填写三形态对应的技能 SO
|
||||
- `WeaponManager` 已绑定 `FormController`
|
||||
|
||||
### 步骤 A:切换至天魂(SwitchSkyForm)
|
||||
|
||||
1. 进入 Play Mode,玩家默认形态
|
||||
2. 按 **SwitchSkyForm 键**(默认 `1`)
|
||||
|
||||
**预期**:
|
||||
- `FormController.CurrentForm.formType == TianHun`
|
||||
- 武器切换到天魂武器 Prefab(`WeaponManager.ActiveWeapon` 更新)
|
||||
- `SkillManager` 中 `_soulSkill`、`_spirit1`、`_spirit2` 替换为天魂对应技能
|
||||
- HUD 形态颜色/图标更新(若已实现 UI 订阅)
|
||||
- Console 无 Error
|
||||
|
||||
### 步骤 B:切换至地魂(SwitchEarthForm)
|
||||
|
||||
1. 按 **SwitchEarthForm 键**(默认 `2`)
|
||||
|
||||
**预期**:同 A,武器和技能集更换为地魂版本。
|
||||
|
||||
### 步骤 C:切换至命魂(SwitchDeathForm)
|
||||
|
||||
1. 按 **SwitchDeathForm 键**(默认 `3`)
|
||||
|
||||
**预期**:同 A,武器和技能集更换为命魂版本。
|
||||
|
||||
### 步骤 D:切换后攻击使用新武器
|
||||
|
||||
1. 切换形态后立即攻击
|
||||
|
||||
**预期**:
|
||||
- HitBox 来自新形态武器实例
|
||||
- 伤害值使用新形态武器 `WeaponSO.Damage`
|
||||
|
||||
### 步骤 E:重复切换同一形态
|
||||
|
||||
1. 当前已在天魂,再次按 **SwitchSkyForm 键**
|
||||
|
||||
**预期**:
|
||||
- 无副作用(不重复切换,也不报错)
|
||||
- `OnFormChanged` 事件视实现可能不触发(取决于 `FormController` 是否有相同形态判断)
|
||||
|
||||
| 检查点 | 期望 | ✓ |
|
||||
|--------|------|---|
|
||||
| 形态正确更新 | CurrentForm.formType 对应键值 | ☐ |
|
||||
| 武器随形态切换 | WeaponManager.ActiveWeapon 更新 | ☐ |
|
||||
| 技能集随形态切换 | SkillManager _soulSkill/_spirit1/_spirit2 更新 | ☐ |
|
||||
| 攻击使用新武器 | 新武器 HitBox 生效 | ☐ |
|
||||
| Console 无 Error | 0 个红色 Error | ☐ |
|
||||
|
||||
---
|
||||
|
||||
## MT-ABILITY-11:三套资源系统
|
||||
|
||||
**目的**:验证灵力、魄元、灵泉次数三者相互独立、各自消耗/恢复逻辑。
|
||||
|
||||
### 步骤 A:灵力(SoulPower)—— 攻击积累
|
||||
|
||||
1. 在 Inspector 中观察 `PlayerStats._currentSoulPower`(初始 = 0)
|
||||
2. 攻击命中测试敌人多次
|
||||
|
||||
**预期**:
|
||||
- 每次命中后 `_currentSoulPower` 增加
|
||||
- 不影响 `_currentSpiritPower` 和 `_currentSpringCharges`
|
||||
|
||||
3. 消耗至 0(触发魂技能,见 MT-ABILITY-14)
|
||||
|
||||
**预期**:
|
||||
- `_currentSoulPower` 降低
|
||||
- `_currentSpiritPower` 不变
|
||||
|
||||
### 步骤 B:魄元(SpiritPower)—— 时间恢复
|
||||
|
||||
1. 使 `_currentSpiritPower` 低于上限(触发魄技能消耗)
|
||||
2. 等待约 3 秒
|
||||
|
||||
**预期**:
|
||||
- `_currentSpiritPower` 每秒自动增加(`SpiritRegenRate` 配置值)
|
||||
- 不影响 `_currentSoulPower` 和 `_currentSpringCharges`
|
||||
|
||||
### 步骤 C:灵泉次数(SpringCharges)—— 三者独立
|
||||
|
||||
1. 攻击积累灵力,同时魄元自然恢复,灵泉次数保持不变
|
||||
|
||||
**预期**:
|
||||
- 三个字段**完全独立变动**,互无影响
|
||||
|
||||
| 检查点 | 期望 | ✓ |
|
||||
|--------|------|---|
|
||||
| 灵力随攻击命中增加 | 每次命中 SoulPower 增加 | ☐ |
|
||||
| 魄元随时间自动恢复 | 未满时 SpiritPower 逐秒增加 | ☐ |
|
||||
| 三者独立 | 任一变化不影响其他两项 | ☐ |
|
||||
|
||||
---
|
||||
|
||||
## MT-ABILITY-12:灵泉使用
|
||||
|
||||
**目的**:验证灵泉使用的前置条件(地面 + 有充能)、HP 恢复、Overlay 动画、充能消耗。
|
||||
|
||||
### 前置条件
|
||||
|
||||
- `PlayerStats._currentSpringCharges > 0`(至少 1 次充能)
|
||||
- 玩家 HP 不满(降低 HP 以观察回复效果)
|
||||
|
||||
### 步骤 A:地面使用灵泉
|
||||
|
||||
1. 玩家站立地面(`IsGrounded == true`)
|
||||
2. HP 低于上限
|
||||
3. 按 **UseSpring 键**(默认 `E`)
|
||||
|
||||
**预期**:
|
||||
- 播放 Overlay 动画(Layer 1 叠加于 Base Layer 之上),不打断移动动画
|
||||
- `_currentSpringCharges` 减少 1
|
||||
- `PlayerStats.CurrentHP` 增加(`SpringHealAmount` 配置值)
|
||||
- 动画结束后玩家返回正常状态
|
||||
|
||||
### 步骤 B:空中使用灵泉无效
|
||||
|
||||
1. 跳跃至空中(`IsGrounded == false`)
|
||||
2. 按 **UseSpring 键**
|
||||
|
||||
**预期**:
|
||||
- **无响应**(`OnUseSpring` 检测到非地面,直接返回)
|
||||
|
||||
### 步骤 C:充能为 0 时无效
|
||||
|
||||
1. 确认 `_currentSpringCharges == 0`
|
||||
2. 地面按 **UseSpring 键**
|
||||
|
||||
**预期**:
|
||||
- **无响应**(充能为 0 时不进入 `SpringState`)
|
||||
|
||||
### 步骤 D:Overlay 动画不打断移动
|
||||
|
||||
1. 地面移动中按 **UseSpring 键**
|
||||
|
||||
**预期**:
|
||||
- 使用灵泉 Overlay 动画在 Layer 1 播放
|
||||
- 玩家可继续移动(Layer 0 移动动画继续)
|
||||
|
||||
| 检查点 | 期望 | ✓ |
|
||||
|--------|------|---|
|
||||
| 地面使用成功 | HP 增加,ChargesCount 减 1 | ☐ |
|
||||
| 空中无效 | 空中按键无任何响应 | ☐ |
|
||||
| 充能为 0 无效 | 无充能时按键无响应 | ☐ |
|
||||
| Overlay 动画叠加 | Layer 1 动画播放,Layer 0 不中断 | ☐ |
|
||||
|
||||
---
|
||||
|
||||
## MT-ABILITY-13:灵泉充能(击杀积累)
|
||||
|
||||
**目的**:验证 `SpringSystem` 通过 EVT_EnemyDied 事件积累点数、达到阈值后自动增加灵泉次数。
|
||||
|
||||
### 前置条件
|
||||
|
||||
- 场景内有可被击杀的测试敌人
|
||||
- `SpringSystem` 组件挂在玩家或管理器 GameObject 上,`_onEnemyDied` 字段已绑定 `EVT_EnemyDied` SO 事件资产
|
||||
- 在 Inspector 中调低 `PlayerStatsSO.SpringKillThreshold`(如设为 2)以方便观察
|
||||
|
||||
### 步骤 A:击杀积累点数
|
||||
|
||||
1. 攻击并击杀第 1 个测试敌人
|
||||
|
||||
**预期**:
|
||||
- EVT_EnemyDied 事件触发
|
||||
- `PlayerStats._springKillPoints` 增加 1(可在 Inspector 观察)
|
||||
|
||||
2. 再次击杀一个敌人
|
||||
|
||||
**预期**:
|
||||
- `_springKillPoints` 增加至阈值
|
||||
- 自动调用 `RestoreSpringCharges(1)`,`_currentSpringCharges` 增加 1
|
||||
- `_springKillPoints` 清零
|
||||
|
||||
### 步骤 B:充能上限限制
|
||||
|
||||
1. 将 `_currentSpringCharges` 调至上限(`MaxSpringCharges`)
|
||||
2. 继续击杀敌人
|
||||
|
||||
**预期**:
|
||||
- `_springKillPoints` 继续积累
|
||||
- 当 `_currentSpringCharges == MaxSpringCharges` 时,`RestoreSpringCharges` 不超过上限
|
||||
|
||||
### 步骤 C:存档点恢复次数至上限
|
||||
|
||||
1. 消耗 1 次灵泉
|
||||
2. 与测试场景中的存档点 GameObject 交互(或调用 `Stats.RestoreOnSave()`)
|
||||
|
||||
**预期**:
|
||||
- `_currentSpringCharges` 恢复至 `MaxSpringCharges`
|
||||
- `_springKillPoints` 清零(存档点重置积累点)
|
||||
|
||||
| 检查点 | 期望 | ✓ |
|
||||
|--------|------|---|
|
||||
| EVT_EnemyDied 触发点数积累 | 击杀后 _springKillPoints 增加 | ☐ |
|
||||
| 达阈值自动 +1 次充能 | 积累满后 ChargesCount 增加,点数清零 | ☐ |
|
||||
| 充能不超上限 | MaxSpringCharges 限制 | ☐ |
|
||||
| 存档点恢复至上限 | ChargesCount = MaxSpringCharges | ☐ |
|
||||
|
||||
---
|
||||
|
||||
## MT-ABILITY-14:魂技能施放
|
||||
|
||||
**目的**:验证 `SkillManager` 响应 SoulSkill 输入、消耗灵力、播放技能动画、冷却限制。
|
||||
|
||||
### 前置条件
|
||||
|
||||
- 当前形态已配置 `FormSkillSet.soulSkill`(有效的 `FormSkillSO` 资产)
|
||||
- `PlayerStats._currentSoulPower` 达到技能消耗量以上
|
||||
|
||||
### 步骤 A:灵力充足时施放魂技能
|
||||
|
||||
1. 攻击敌人积累足够灵力(`_currentSoulPower ≥ soulSkill.Cost`)
|
||||
2. 按 **SoulSkill 键**(默认 `Q`)
|
||||
|
||||
**预期**:
|
||||
- 技能动画播放(`FormSkillSO.animationClip`)
|
||||
- `_currentSoulPower` 减少 `soulSkill.Cost`
|
||||
- 技能特效实例化(若 `FormSkillSO` 中配置了 VFX)
|
||||
- 技能进入冷却(`_cooldowns[soulSkill]` 开始计时)
|
||||
|
||||
### 步骤 B:冷却中无法再次施放
|
||||
|
||||
1. 技能施放后立即再次按 **SoulSkill 键**
|
||||
|
||||
**预期**:
|
||||
- 无响应(冷却剩余 `> 0` 时拒绝施放)
|
||||
|
||||
### 步骤 C:灵力不足时无法施放
|
||||
|
||||
1. `_currentSoulPower < soulSkill.Cost`(可通过消耗后立即尝试)
|
||||
2. 按 **SoulSkill 键**
|
||||
|
||||
**预期**:
|
||||
- 无响应(灵力不足,`SkillManager` 内部判断拒绝)
|
||||
|
||||
### 步骤 D:形态切换后技能变更
|
||||
|
||||
1. 切换到另一个形态
|
||||
2. 按 **SoulSkill 键**
|
||||
|
||||
**预期**:
|
||||
- 施放的是**新形态**的魂技能(不同动画、不同效果)
|
||||
|
||||
| 检查点 | 期望 | ✓ |
|
||||
|--------|------|---|
|
||||
| 灵力充足时施放成功 | 动画播放,SoulPower 减少 | ☐ |
|
||||
| 冷却中无法施放 | 再次按键无响应 | ☐ |
|
||||
| 灵力不足无法施放 | 资源不足时无响应 | ☐ |
|
||||
| 形态切换后使用新技能 | 切换形态后施放新形态魂技能 | ☐ |
|
||||
|
||||
---
|
||||
|
||||
## MT-ABILITY-15:魄技能施放(技能 1 / 2)
|
||||
|
||||
**目的**:验证 `SpiritSkill1`/`SpiritSkill2` 的消耗魄元、独立冷却、形态切换更新。
|
||||
|
||||
### 前置条件
|
||||
|
||||
- 当前形态已配置 `FormSkillSet.spiritSkill1` 和 `spiritSkill2`
|
||||
- `PlayerStats._currentSpiritPower` 充足
|
||||
|
||||
### 步骤 A:施放魄技能 1
|
||||
|
||||
1. 按 **SpiritSkill1 键**(默认 `R`,长按触发 Start,松开触发 Cancelled)
|
||||
|
||||
**预期**:
|
||||
- 技能动画播放
|
||||
- `_currentSpiritPower` 减少 `spiritSkill1.Cost`
|
||||
- 若技能为蓄力型,按住触发蓄力动画,松开触发释放
|
||||
|
||||
### 步骤 B:施放魄技能 2
|
||||
|
||||
1. 按 **SpiritSkill2 键**(默认 `F`)
|
||||
|
||||
**预期**:
|
||||
- 施放魄技能 2(不同动画/效果)
|
||||
- 消耗独立的魄元量(`spiritSkill2.Cost`)
|
||||
|
||||
### 步骤 C:技能 1 和技能 2 冷却独立
|
||||
|
||||
1. 依次施放技能 1 和技能 2
|
||||
|
||||
**预期**:
|
||||
- 技能 1 冷却中**不影响**技能 2 的施放(`_cooldowns` 字典各自独立计时)
|
||||
|
||||
### 步骤 D:魄元自动恢复后可再次施放
|
||||
|
||||
1. 魄技能消耗魄元后等待恢复
|
||||
2. 再次施放
|
||||
|
||||
**预期**:
|
||||
- 魄元恢复至足够后可再次施放(`SpiritRegenRate` 自动回复)
|
||||
|
||||
| 检查点 | 期望 | ✓ |
|
||||
|--------|------|---|
|
||||
| 技能 1 施放成功 | 动画播放,SpiritPower 减少 | ☐ |
|
||||
| 技能 2 施放成功 | 不同动画,SpiritPower 减少 | ☐ |
|
||||
| 冷却独立 | 技能 1 冷却不阻止技能 2 | ☐ |
|
||||
| 形态切换后使用新技能 | 新形态的魄技能 1/2 生效 | ☐ |
|
||||
| 魄元恢复后可再施放 | 等待后 SpiritPower 恢复,可用 | ☐ |
|
||||
|
||||
---
|
||||
|
||||
## MT-ABILITY-16:弹反系统
|
||||
|
||||
**目的**:验证 `ParrySystem`/`ParryState` 的触发窗口、弹反成功判定、灵力奖励、护盾恢复。
|
||||
|
||||
### 前置条件
|
||||
|
||||
- 场景中有能发动近战攻击的测试敌人(或使用 Debug 工具手动触发弹反机会)
|
||||
- `ParrySystem` 已绑定 `InputReaderSO`
|
||||
- `ShieldComponent` 已配置(若需验证护盾恢复)
|
||||
|
||||
### 步骤 A:弹反触发与成功
|
||||
|
||||
1. 敌人发起攻击时,在攻击即将命中前按下**弹反键**(`Parry`,默认 `K`)
|
||||
|
||||
**预期**:
|
||||
- 进入 `ParryState`,播放弹反动画
|
||||
- 若在弹反窗口内成功拦截敌人攻击:
|
||||
- 弹反命中判定成功,敌人受到弹反反馈(硬直或被弹飞)
|
||||
- `PlayerStats._currentSoulPower` 增加(`ParryInfo.SoulGained`)
|
||||
- `ShieldComponent.OnParrySuccess()` 调用(护盾恢复)
|
||||
- 玩家**不受任何伤害**(弹反期间有效)
|
||||
|
||||
### 步骤 B:弹反窗口外受伤
|
||||
|
||||
1. 弹反动画开始后**等待窗口结束**(约 0.2-0.3s 后),此时再受到敌人攻击
|
||||
|
||||
**预期**:
|
||||
- 玩家正常受伤,进入 `HurtState`(弹反窗口已关闭)
|
||||
|
||||
### 步骤 C:空弹反(无敌人攻击)
|
||||
|
||||
1. 地面不受攻击时按弹反键
|
||||
|
||||
**预期**:
|
||||
- 播放弹反动画
|
||||
- 弹反窗口结束后自动返回 `IdleState`
|
||||
- 无报错,无副作用
|
||||
|
||||
| 检查点 | 期望 | ✓ |
|
||||
|--------|------|---|
|
||||
| 弹反动画播放 | ParryState 正确进入 | ☐ |
|
||||
| 弹反成功不受伤 | 窗口内拦截,玩家 HP 不减少 | ☐ |
|
||||
| 灵力奖励 | SoulPower 增加 SoulGained 值 | ☐ |
|
||||
| 护盾恢复 | ShieldComponent.OnParrySuccess 调用 | ☐ |
|
||||
| 窗口外受伤 | 窗口关闭后受攻击进入 HurtState | ☐ |
|
||||
| 空弹反无副作用 | 无敌人攻击时弹反后正常返回 Idle | ☐ |
|
||||
|
||||
---
|
||||
|
||||
## 附录 A:Inspector 调试辅助字段
|
||||
|
||||
以下字段在 Play Mode 下可在 Inspector 中实时观察,便于调试:
|
||||
|
||||
| GameObject | 组件 | 字段 | 含义 |
|
||||
|-----------|------|------|------|
|
||||
| Player | `PlayerController` | `_dbg_CurrentState` | 当前 FSM 状态名 |
|
||||
| Player | `PlayerController` | `_dbg_IsGrounded` | 是否落地 |
|
||||
| Player | `PlayerController` | `_dbg_AirJumpsLeft` | 剩余空中跳跃次数 |
|
||||
| Player | `PlayerController` | `_dbg_CanDash` | 当前是否可冲刺 |
|
||||
| Player | `PlayerController` | `_dbg_IsInvincible` | 当前是否无敌 |
|
||||
| Player | `PlayerStats` | `_currentHP` | 当前 HP |
|
||||
| Player | `PlayerStats` | `_currentSoulPower` | 当前灵力 |
|
||||
| Player | `PlayerStats` | `_currentSpiritPower` | 当前魄元 |
|
||||
| Player | `PlayerStats` | `_currentSpringCharges` | 当前灵泉次数 |
|
||||
| Player | `PlayerStats` | `_springKillPoints` | 当前灵泉积累点 |
|
||||
| Player | `FormController` | `CurrentForm` | 当前形态 SO |
|
||||
| Player | `SkillManager` | `_soulSkill` | 当前魂技能 |
|
||||
| Player | `SkillManager` | `_spirit1` | 当前魄技能 1 |
|
||||
| Player | `SkillManager` | `_spirit2` | 当前魄技能 2 |
|
||||
|
||||
---
|
||||
|
||||
## 附录 B:常见问题排查
|
||||
|
||||
| 问题现象 | 可能原因 | 排查步骤 |
|
||||
|---------|---------|---------|
|
||||
| 攻击无 HitBox 效果 | WeaponManager 武器未实例化 | Inspector 检查 `WeaponManager.ActiveHitBoxInstance` 是否为 null |
|
||||
| 形态切换后技能未更新 | `SkillManager._formController` 未赋值 | 确认 Inspector 中已拖入 `FormController` 引用,并检查 `_formSkillSets` 数组长度 ≥ 3 |
|
||||
| 灵泉使用无响应 | `UseSpringEvent` 未绑定 | 检查 `InputReaderSO` 中 UseSpring Action 名称拼写,确认 PlayerController 已订阅 |
|
||||
| 抓墙后立即滑落 | WallDetector 未检测到墙 | 检查墙壁 Layer 是否为 `Ground`,`PlayerWallDetector` 的 `wallLayer` 掩码包含该 Layer |
|
||||
| 蹬墙跳无效 | 受限模式(高于 wallGrabY) | 在受限模式(下滑状态)时蹬墙跳设计上不可用,属预期行为 |
|
||||
| 魄技能冷却独立验证失败 | 技能 SO 资产共用同一实例 | 确认技能 1、技能 2 使用的是**不同** `FormSkillSO` 资产(不同 `.asset` 文件) |
|
||||
| Pogo 未弹起 | DownAttackState `OnDownHitConfirmed` 未订阅 | 检查 `PlayerCombat._currentHitBoxInstance` 是否正确订阅,Console 查看 `HandleWeaponChanged` 是否调用 |
|
||||
| Console 出现 NullReferenceException | Inspector 中某 SO/组件字段未赋值 | 运行时在 `PlayerController.Awake` 的 `Debug.Assert` 输出中查看具体缺失字段 |
|
||||
Reference in New Issue
Block a user