chore: initial commit

This commit is contained in:
2026-05-08 11:04:00 +08:00
commit f55d2a57c3
6278 changed files with 866081 additions and 0 deletions

View File

@@ -0,0 +1,289 @@
# 07 · 敌人系统规范
> **所属文档集** [← 返回索引](./README.md)
> **摘要**敌人实体模型、AI 行为规范、Boss 系统设计与掉落体系。
---
## 目录
1. [设计原则](#1-设计原则)
2. [敌人实体模型](#2-敌人实体模型)
3. [AI 行为规范](#3-ai-行为规范)
4. [寻路与感知](#4-寻路与感知)
5. [Boss 系统](#5-boss-系统)
6. [电报系统(攻击预警)](#6-电报系统攻击预警)
7. [敌人分级体系](#7-敌人分级体系)
8. [掉落系统](#8-掉落系统)
---
## 1. 设计原则
| 原则 | 说明 |
|------|------|
| **可读性优先** | 每个攻击都有明确的预警(电报),让玩家有机会反应 |
| **弹反友好** | 大多数攻击标记为可弹反,鼓励玩家使用核心机制 |
| **行为数据化** | AI 行为通过数据配置组合,不硬编码 |
| **职责分离** | 移动、攻击、感知各为独立模块,互不依赖 |
---
## 2. 敌人实体模型
### 2.1 实体构成
```
EnemyEntity协调器
├── EnemyStats ← 属性HP、防御、速度等
├── AIController ← 行为决策BehaviorTree 或 FSM
├── MovementAgent ← 路径跟随与物理移动
├── CombatModule ← 攻击执行、HitArea 管理
├── HurtBox ← 受击响应
├── PerceptionModule ← 感知(视野、听觉、自定义触发器)
├── LootModule ← 死亡掉落处理
└── TelegraphSystem ← 攻击电报(预警视觉效果)
```
### 2.2 敌人属性模型
```
DataModel EnemyStatsData {
enemyId : ID
displayName : String
──────────────────────────────────
maxHP : Integer
defense : Number // 伤害减免0.0~1.0
poiseLevel : PoiseLevel // 霸体等级
──────────────────────────────────
moveSpeed : Number // 基础移动速度
detectionRange : Number // 视野/感知范围
attackRange : Number // 近战攻击范围
──────────────────────────────────
lootTableId : Ref<LootTableData> // 掉落表
geoReward : {min: Integer, max: Integer} // Geo 掉落范围
killCreditType : KillCreditType // 击杀积分类型(普通/精英/Boss
}
```
---
## 3. AI 行为规范
### 3.1 行为树节点类型
AI 行为通过**行为树Behavior Tree**组织,行为节点类型:
| 节点类型 | 符号 | 说明 |
|---------|------|------|
| 选择节点Selector| `?` | 依次尝试子节点,第一个成功即返回成功 |
| 序列节点Sequence| `→` | 依次执行子节点,所有成功才返回成功 |
| 条件节点Condition| `[C]` | 判断某个条件,返回成功/失败 |
| 动作节点Action| `[A]` | 执行一个具体行为 |
| 装饰节点Decorator| `{D}` | 修改子节点行为(如重复、反转、冷却)|
### 3.2 通用敌人行为树模板
```
RootSelector
├─ ? 死亡检测
│ └─ [C] HP <= 0 → [A] 播放死亡动画 → [A] 触发掉落 → [A] 销毁
├─ ? 受击响应
│ └─ [C] 正在受击 → [A] 受击动画(若霸体被打断)
├─ ? 攻击决策Selector
│ ├─ ? 近战攻击
│ │ └─ [C] 玩家在攻击范围内
│ │ → [C] 攻击冷却结束
│ │ → [A] 播放电报
│ │ → [A] 执行攻击
│ │
│ └─ ? 远程攻击
│ └─ [C] 玩家在视野内但超出近战范围
│ → [C] 远程攻击冷却结束
│ → [A] 播放电报
│ → [A] 发射弹射物
├─ ? 追击Sequence
│ ├─ [C] 已感知到玩家
│ └─ [A] 向玩家移动(路径跟随)
└─ ? 巡逻/待机Sequence
└─ [A] 执行巡逻路径(或原地待机)
```
### 3.3 AI 感知状态
| 状态 | 条件 | 行为 |
|------|------|------|
| `Idle`(待机)| 未感知到玩家 | 巡逻或原地等待 |
| `Alert`(警戒)| 听到声音或余光检测 | 转向检查,不主动追击 |
| `Chase`(追击)| 视野内确认玩家 | 向玩家移动 |
| `Combat`(战斗)| 玩家在攻击范围内 | 执行攻击序列 |
| `Stunned`(硬直)| 受到重击/被弹反 | 暂停所有行为 |
---
## 4. 寻路与感知
### 4.1 寻路规范
| 规范项 | 说明 |
|--------|------|
| 寻路类型 | 2D 导航网格NavMesh或路径点系统 |
| 更新频率 | 目标位置变化超过阈值时重新规划路径(不每帧更新)|
| 跳跃/下落 | 可配置是否允许跳跃/从平台下落追击 |
| 障碍物 | 动态障碍物(其他敌人)不重新规划路径,简单规避 |
### 4.2 感知规范
```
DataModel PerceptionConfig {
visionRange : Number // 视野半径
visionAngle : Number // 视野角度(正前方±角度)
hearingRange : Number // 听觉半径(玩家移动/攻击触发)
alertDuration : Duration // Alert 状态持续时长
lostTargetDelay : Duration // 失去视野到放弃追击的延迟
}
```
---
## 5. Boss 系统
### 5.1 Boss 实体模型
Boss 继承普通敌人的所有能力,附加以下扩展:
```
DataModel BossData extends EnemyStatsData {
bossName : String
arenaId : ID // 专属战斗场景
──────────────────────────────────────
phases : List<BossPhaseData> // 阶段列表(按顺序触发)
introSequenceId : ID // 入场演出序列
defeatSequenceId: ID // 失败演出序列
──────────────────────────────────────
bgmPhase1 : AudioID
bgmPhase2 : Optional<AudioID> // 阶段变更时切换音乐
}
DataModel BossPhaseData {
phaseIndex : Integer
hpThreshold : Number // 触发阶段变更的 HP 百分比0~1.0
availableAttacks: List<Ref<AttackPatternData>> // 该阶段可用攻击
attackWeights : Map<ID, Number> // 各攻击的选取权重
aggressionScale : Number // 攻击频率倍率
}
```
### 5.2 Boss 攻击模式模型
```
DataModel AttackPatternData {
patternId : ID
patternName : String
──────────────────────────────
telegraphType : TelegraphType // 电报类型
telegraphDuration: Duration // 电报持续时间
──────────────────────────────
attackType : BossAttackType // 攻击类型
executionParams : Map<String, Number> // 执行参数
cooldown : Duration // 攻击后冷却
──────────────────────────────
isParryable : Boolean // 是否可被玩家弹反
counterWindowId : Optional<ID> // 弹反后的脆弱窗口
}
```
### 5.3 Boss 阶段转换流程
```
Boss HP 降至 PhaseData.hpThreshold 以下
→ AIController 暂停(短暂无敌帧 0.5s
→ 播放相变动画/特效
→ 发出 OnBossPhaseChanged 事件bossId, newPhase
→ 更新可用攻击列表和攻击权重
→ 音频系统切换音乐(若配置了 bgmPhase2
→ 恢复 AIController
```
---
## 6. 电报系统(攻击预警)
所有攻击**必须**有电报,给玩家反应时间:
| 电报类型 | 视觉表现 | 适用场景 |
|---------|---------|---------|
| `PoseHold` | 攻击前摇姿势定格 | 近战重击 |
| `GroundIndicator` | 地面出现警告范围标记 | 落地冲击、AoE |
| `TrajectoryLine` | 显示弹射物飞行路径 | 精准弹射物 |
| `BodyGlow` | 敌人身体特定颜色发光 | 不可弹反:红色;可弹反:黄色 |
| `SoundCue` | 特定音效(与视觉结合)| 所有攻击必备 |
### 电报颜色规范
| 颜色 | 含义 |
|------|------|
| 黄色/金色 | 可弹反攻击 |
| 红色/橙色 | 不可弹反攻击 |
| 紫色 | 特殊/Boss 专属机制 |
| 白色 | 环境危险(非敌人攻击)|
---
## 7. 敌人分级体系
| 等级 | 名称 | AI 复杂度 | 霸体 | 典型特征 |
|------|------|----------|------|---------|
| T1 | 杂兵 | 简单2-3种行为| Fragile | 单一攻击,跑向玩家 |
| T2 | 普通敌人 | 中等3-5种行为| Standard | 有攻击组合,有简单规避 |
| T3 | 精英怪 | 较高5-7种行为| Armored | 有阶段变化,有独特机制 |
| T4 | Boss | 高多阶段完整AI| Boss | 多阶段、多攻击、电报复杂 |
---
## 8. 掉落系统
### 8.1 掉落表模型
```
DataModel LootTableData {
tableId : ID
entries : List<LootEntry>
guaranteedDrops : List<Ref<ItemData>> // 必掉物品(如 Boss 必掉能力道具)
}
DataModel LootEntry {
itemId : Ref<ItemData>
baseWeight : Number // 基础权重(相对概率)
minCount : Integer
maxCount : Integer
difficultyScale : Number // 难度缩放系数Easy 减少Hard 增加)
}
```
### 8.2 掉落概率计算
```
各 Entry 的实际权重 = baseWeight × 难度系数
总权重 = 所有 Entry 实际权重之和
某 Entry 概率 = 该 Entry 实际权重 / 总权重
保底机制:
若稀有物品连续 20 次未掉落 → 下次强制掉落
保底计数存入 SaveData跨死亡保留
```
### 8.3 掉落触发流程
```
OnEnemyDied 事件触发
→ 掉落系统读取死亡敌人的 LootTableData
→ 计算本次掉落结果(权重随机 + 保底检查)
→ 在死亡位置生成掉落物实体
→ Geo 直接加入玩家账户(不生成实体,减少拾取摩擦)
→ 特殊道具生成拾取实体,玩家走近自动拾取
```