Add independent review reports for Minimap system (Rounds 8, 9, and 26)

- Round 8 report highlights improvements in architecture, editor usability, and data robustness, with a total score of 80/100.
- Round 9 report focuses on editor extension capabilities, identifying issues with room data indexing and layout editing, resulting in a score of 76/100.
- Round 26 report evaluates the system against commercial standards, noting new issues and confirming previous fixes, with a score of 95.8/100.
This commit is contained in:
2026-05-25 23:15:12 +08:00
parent e2bc324905
commit f74d7f1877
53 changed files with 6825 additions and 270 deletions

View File

@@ -0,0 +1,536 @@
# 小怪设计 — 程序开发文档 01
> 依据《小怪设计-动作需求表-01》整理供程序端实现参考。
> 包含状态机、AI 行为逻辑、技能规格、特殊机制说明。
---
## 目录
- [E001 草蛭](#e001-草蛭)
- [E002 簧蛭](#e002-簧蛭)
- [E003 幼蛭](#e003-幼蛭)
- [E004 蛭母小BOSS](#e004-蛭母小boss)
- [E005 肥蛭(精英怪)](#e005-肥蛭精英怪)
- [E006 讙](#e006-讙)
---
## E001 草蛭
### 基本信息
| 字段 | 内容 |
|--------|----------------------------------------------------------------------|
| 编号 | E001_CaoZhi |
| 类别 | 小怪 |
| 行动方式 | 地面爬行 |
| 核心机制 | 伪装待机 → 发现玩家 → 追击攻击;具备侦测范围触发开关 |
### 状态机
```
[Idle_Disguise] ──感知玩家──▶ [Skill_Start]
[Skill_Loop] ──丢失目标──▶ [Skill_End] ──▶ [Move_Patrol]
受到足够伤害
[Death]
[Move_Patrol] ──感知玩家──▶ [Skill_Start]
[Move_Patrol] ──到达边界──▶ [Flip] ──▶ [Move_Patrol]
```
### 状态列表
| AI状态标识符 | 动画Clip名Animator用 | 类型 | 说明 |
|--------------|----------------------|------|----------------------------------------------------|
| Idle_Disguise | Idle | 循环 | 蜷缩在地面,外观似带植物的石头;每隔随机时间轻微抽搐一次 |
| Move_Patrol | Move | 循环 | 低速爬行巡逻,可在平台边缘翻转 |
| Flip | Flip | 单次 | 转向后衔接 Move_Patrol |
| Skill_Start | Skill_Start | 单次 | 张口,覆盖口水粒子特效,切换至追击状态 |
| Skill_Loop | Skill_Loop | 循环 | 快速爬行追击玩家 |
| Skill_End | Skill_End | 单次 | 收回尖牙,切换回巡逻 |
| Death | Death | 单次 | 身体干瘪(需求表描述:身躯干瘪死亡),播放后移除 GameObject |
### AI 行为
```
感知条件:视线检测 OR 碰撞触发区(圆形半径建议可配置)
├── 未感知玩家 → Idle_Disguise默认或 Move_Patrol已激活后丢失目标
└── 感知玩家
├── 进入 Skill_Start一次性播放
└── 追击 Skill_Loop速度[追击速度] > [巡逻速度]
├── 追击途中碰到玩家 → 造成接触伤害(持续判定)
└── 超出感知范围 → Skill_End → Move_Patrol
E001 无主动技能CD再次进入感知范围立即触发追击
```
### 技能规格
| 技能 | 触发条件 | 伤害类型 | 攻击范围 | 备注 |
|------|----------|--------|-------------|-----------------------------------|
| 追击啃咬 | 进入感知范围 | 接触伤害 | 自身碰撞体Collider | Skill_Loop 期间碰撞盒始终开启;无弹道,纯移动追击 |
### 技术备注
- Idle 伪装期间建议关闭 NavAgent / 移动组件,仅保留感知触发器。
- 追击速度、感知范围、伪装抽搐间隔建议通过 ScriptableObject 配置。
- 死亡无专用受击-死亡过渡动画HP≤0 直接播放 Death。
### 快速参数表(策划待填写)
| 参数名 | 说明 | 参考值 |
|-------------------|-----------------------------|-------|
| `maxHP` | 最大生命值 | — |
| `moveSpeed` | 巡逻速度 | — |
| `chaseSpeed` | 追击速度Skill_Loop 期间) | — |
| `detectRadius` | 感知触发半径 | — |
| `contactDamage` | 接触伤害值 | — |
---
## E002 簧蛭
### 基本信息
| 字段 | 内容 |
|--------|--------------------------------------------------------------|
| 编号 | E002_HuangZhi |
| 类别 | 小怪 |
| 行动方式 | **固定位置**,无法移动,属于陷阱型 |
| 核心机制 | 藏于天花板 → 玩家经过检测区 → 钻出啃咬 → 悬挂可受击窗口 → 缩回 |
### 状态机
```
[Idle_Hidden] ──玩家进入触发区──▶ [Skill_Start]
[Skill_Loop] (悬挂,可受击)
冷却结束 / 玩家离开
[Skill_End] ──▶ [Idle_Hidden]
[任意状态] ──HP归零──▶ [Death]
```
### 状态列表
| 状态 | 动画名 | 类型 | 说明 |
|----------|------------|------|-----------------------------------------------|
| 隐藏待机 | Idle | 循环 | 岩壁上仅露出头部剪影,间歇蠕动 |
| 攻击发生 | Skill_Start | 单次 | 从岩壁钻出,身躯拉伸甩动,造成伤害 |
| 悬挂可受击 | Skill_Loop | 循环 | 身体悬挂岩壁轻微晃动;**此阶段碰撞盒开放,可被玩家攻击** |
| 缩回 | Skill_End | 单次 | 缩回岩壁,过渡到 Idle |
| 死亡 | Death | 单次 | 爆体溅出黏液,留下短截身体悬挂,关闭碰撞 |
### AI 行为
```
持续检测正下方(矩形感知区,宽度略大于自身碰撞体宽度)
├── 玩家未进入 → Idle_Hidden冷却计时重置
└── 玩家进入触发区 AND 当前为 Idle_Hidden
├── 进入 Skill_Start向下延伸开启攻击碰撞盒
├── Skill_Start 播放完毕 → Skill_Loop悬挂
│ ├── 悬挂持续时间到 → Skill_End → Idle_Hidden进入冷却
│ └── HP 归零 → Death
└── 冷却期间玩家再次进入触发区:忽略(等待冷却结束)
```
### 技能规格
| 技能 | 触发条件 | 伤害类型 | 攻击范围 | 攻击次数 | 备注 |
|------|---------------|--------|----------------------|------|----------------|
| 钻出啃咬 | 玩家进入正下方感知区 | 瞬时伤害 | Skill_Start 期间碰撞盒 | 1 次 | 悬挂期无攻击判定,仅可受击 |
### 技术备注
- 固定于特定平台点位,不需要 NavAgent。
- Skill_Loop 期间:攻击碰撞盒关闭,受击碰撞盒开启(可被玩家攻击)。
- 悬挂时长、冷却时长建议 ScriptableObject 配置。
- 死亡后保留部分身体 Sprite不完全消除可用单独的静态 Sprite 替换。
### 快速参数表(策划待填写)
| 参数名 | 说明 | 参考值 |
|-------------------|-----------------------|-------|
| `maxHP` | 最大生命值 | — |
| `attackDamage` | 钻出啃咬伤害值 | — |
| `hangDuration` | Skill_Loop 悬挂时长(秒)| — |
| `cooldownDuration`| 缩回后进入下次攻击的冷却(秒)| — |
| `detectWidth` | 感知区水平宽度 | — |
---
## E003 幼蛭
### 基本信息
| 字段 | 内容 |
|--------|---------------------------------------------------|
| 编号 | E003_YouZhi |
| 类别 | 小怪 |
| 行动方式 | 天花板吸附 → 掉落地面 → 地面爬行 |
| 核心机制 | 两种出现方式:①场景预置于天花板,战斗触发后掉落;②由 E005 肥蛭死亡时 Spawn极低生命值一击即死 |
### 状态机
```
[Idle_Ceiling] ──战斗区域激活──▶ [Fall] ← 场景预置路径
[Spawn_Point] ──肥蛭死亡生成──▶ [Fall] ← 肥蛭生成路径
落地检测
[Move] ──感知玩家──▶ [Skill]
[Move] ◀──丢失目标────┘
[任意状态] ──HP归零──▶ [Death]
```
### 状态列表
| 状态 | 动画名 | 类型 | 说明 |
|--------|-------|------|------------------------------------|
| 天花板待机 | Idle | 循环 | 吸附岩壁剪影,间歇蠕动 |
| 掉落 | Fall | 循环 | 旋转下落,直到落地触发 Move |
| 地面爬行 | Move | 循环 | 缓慢爬行(速度为基础移动速度) |
| 快速追击 | Skill | 循环 | 加速爬行追击(速度约 1.5× Move 速度),碰到玩家造成伤害 |
| 死亡 | Death | 单次 | 溅出少量酸液,身体干瘪,一击即死 |
### AI 行为
```
生成时默认处于 Idle_Ceiling
战斗区域激活 / 被生成 → Fall重力控制不受玩家输入影响
落地 →
├── 感知玩家 → Skill追击
│ ├── 接触玩家 → 造成伤害
│ └── 丢失玩家 → Move巡逻
└── 未感知玩家 → Move
```
### 技能规格
| 技能 | 触发条件 | 伤害类型 | 攻击范围 | 备注 |
|------|----------|--------|-----------|-------------|
| 快速追击 | 感知玩家 | 接触伤害 | 自身碰撞体 | 一击即死HP=1 |
### 技术备注
- Fall 阶段建议使用 Rigidbody 物理重力,不做路径导航。
- 一击即死HP 设为 1任意来源伤害均触发 Death。
- **出现方式双路支持**
- 预置路径:在关卡中放置 Idle_Ceiling 实例,战斗区域触发时激活 Fall
- 生成路径:由 E005 肥蛭死亡时调用 `SpawnEnemy(E003, position, count)` 生成,生成后直接进入 Fall 状态。
### 快速参数表(策划待填写)
| 参数名 | 说明 | 参考值 |
|-----------------|----------------------|-------|
| `maxHP` | 最大生命值(一击即死=1| 1 |
| `moveSpeed` | 落地后爬行速度 | — |
| `chaseSpeed` | 追击速度 | — |
| `detectRadius` | 感知半径 | — |
| `contactDamage` | 接触伤害值 | — |
---
## E004 蛭母小BOSS
### 基本信息
| 字段 | 内容 |
|--------|--------------------------------------------------------------------------|
| 编号 | E004_ZhiMu |
| 类别 | 小 BOSS |
| 行动方式 | 地面移动 |
| 核心机制 | 有出场剧情;具备三种技能(撕咬、头槌连段、酸液远程);死亡分两阶段(死前挣扎 → 爆体消散) |
### 状态机
```
[Static] ──战斗触发──▶ [Appear] ──完毕──▶ [Idle]
[Idle] ──AI 决策──┬──▶ [Skill01_Bite](撕咬)
├──▶ [Skill02_Start](头槌前摇)──▶ [Skill02_Loop]──▶ [Skill02_End]
├──▶ [Skill03_Acid](酸液喷吐)
└──▶ [Move] ──到达位置──▶ [Idle]
[Move] ──玩家跳至身后──▶ [Flip] ──▶ [Move / Idle]
[任意战斗状态] ──HP归零──▶ [Death_Pre] ──循环结束──▶ [Death]
```
### 状态列表
| 状态 | 动画名 | 类型 | 说明 |
|-------------|------------|------|------------------------------------------|
| 休眠静止 | Static | 循环 | 战斗未触发,牙齿收拢,头部低垂 |
| 出场 | Appear | 单次 | 吼叫示威,结束衔接 Idle |
| 战斗待机 | Idle | 循环 | 呼吸待机,触手轻微蠕动 |
| 移动 | Move | 循环 | 向玩家方向移动,调整攻击距离 |
| 转身 | Flip | 单次 | 玩家绕至身后时触发 |
| 撕咬 | Skill01 | 单次 | 近程,头部后蓄力后前突啃咬;前摇明显 |
| 头槌前摇 | Skill02_Start | 单次 | 头部蜷缩成球蓄力 |
| 头槌循环 | Skill02_Loop | 循环 | 反复砸地(单次砸地动作循环),可配置砸地次数 |
| 头槌结束 | Skill02_End | 单次 | 喘息硬直,**此阶段可受击,攻击不判定** |
| 酸液喷吐 | Skill_03 | 单次 | 嘴部抖动后向上喷出多团酸液,以抛物线散落 |
| 死亡前挣扎 | Death_Pre | 循环 | HP 归零后触发,僵直挣扎;持续固定时间后衔接 Death |
| 死亡 | Death | 单次 | 爆体,溅出黏液,消散 |
### AI 行为
```
战斗循环Idle 为决策节点):
1. 检测玩家距离
├── 玩家超出近战范围 → Move靠近
└── 玩家在近战范围内 → 技能选择
2. 技能选择(权重/CD轮转建议策划可配置
├── Skill01撕咬玩家在近距离且正面 → 近程突刺伤害CD[skill01CD]秒
├── Skill02头槌玩家在近中距离 → 多次砸地造成范围震地伤害CD[skill02CD]秒
└── Skill03酸液玩家距离较远/刚进入战斗 → 向玩家位置抛出多颗酸液弹CD[skill03CD]秒
3. 玩家绕后(跳跃至蛭母身后)→ 优先插入 Flip仅从 Idle 或 Move 状态触发
⚠️ 注Flip 不可打断正在施放的技能
```
### 技能规格
#### Skill01 — 撕咬
| 字段 | 值 |
|----------|------------------------|
| 攻击类型 | 近程瞬时 |
| 攻击范围 | 头部前方碰撞盒(宽×高可配置) |
| 伤害帧 | 动作到达最前伸位置时判定(单帧) |
| 前摇 | 较大(动画帧数见动作需求表) |
| 硬直(玩家) | 策划配置 |
#### Skill02 — 头槌
| 字段 | 值 |
|----------|----------------------------------|
| 攻击类型 | 范围震地 |
| 伤害范围 | 砸地落点附近圆形/矩形区域(建议策划配置半径) |
| 砸地次数 | 可配置(建议 24 次) |
| 每次间隔 | 由 Skill02_Loop 动画帧率决定 |
| 硬直窗口 | Skill02_End 阶段为硬直,期间关闭攻击盒,开放受击 |
#### Skill03 — 酸液喷吐
| 字段 | 值 |
|----------|--------------------------------------------------|
| 攻击类型 | 远程抛物弹道 |
| 弹数 | 多颗(可配置,建议 35 颗) |
| 落点分布 | 以玩家当前位置为中心,向两侧随机偏移散布(建议策划配置范围) |
| 弹道 | 抛物线(设置初速度与重力系数即可) |
| 落地效果 | 酸液溅射粒子 + 落地持续伤害区(建议策划决定是否留存伤害区域) |
### 技术备注
- Appear 动画播放期间暂停 AI完成后激活战斗循环。
- 技能 CD 和选择权重建议独立 ScriptableObject 配置。
- Death_Pre 结束后短暂白屏/闪光特效,再播放 Death。
- 转身Flip需检测玩家相对朝向仅在 Idle / Move 状态下每帧检测,技能执行中不检测。
### 快速参数表(策划待填写)
| 参数名 | 说明 | 参考值 |
|-------------------|---------------------------|-------|
| `maxHP` | 最大生命值 | — |
| `moveSpeed` | 移动速度 | — |
| `detectRange` | 感知距离 | — |
| `skill01Damage` | 撕咬伤害 | — |
| `skill01CD` | 撕咬冷却(秒) | — |
| `skill02HitCount` | 头槌砸地次数 | — |
| `skill02Damage` | 每次头槌伤害 | — |
| `skill02CD` | 头槌冷却(秒) | — |
| `skill02StaggerDuration` | Skill02_End 硬直时长 | — |
| `skill03Count` | 酸液弹数 | — |
| `skill03Damage` | 每颗酸液伤害 | — |
| `skill03CD` | 酸液冷却(秒) | — |
---
## E005 肥蛭(精英怪)
### 基本信息
| 字段 | 内容 |
|--------|------------------------------------------|
| 编号 | E005_FeiZhi |
| 类别 | 精英怪 |
| 行动方式 | 地面移动(移动缓慢,体型大) |
| 核心机制 | 死亡时在原位生成若干 E003 幼蛭;具备近程撕咬和远程酸液两种技能 |
### 状态机
```
[Idle] ──AI决策──┬──▶ [Move] ──到达位置──▶ [Idle]
├──▶ [Skill01_Bite](撕咬)──▶ [Idle]
└──▶ [Skill02_Acid](酸液)──▶ [Idle]
[任意战斗状态] ──HP归零──▶ [Death_Pre] ──播放完毕──▶ [Death](生成幼蛭 + 爆体)
```
### 状态列表
| 状态 | 动画名 | 类型 | 说明 |
|----------|----------|------|----------------------------------------------|
| 待机 | Idle | 循环 | 呼吸待机 |
| 移动 | Move | 循环 | 肥硕扭动,移动速度较低 |
| 撕咬 | Skill01 | 单次 | 近程前伸啃咬;攻击结束后有趴地硬直,再起身回 Idle |
| 酸液 | Skill02 | 单次 | 连续两次吐出酸液团(逻辑上循环两次单次动画,或直接做循环动画) |
| 死亡前挣扎 | Death_Pre | 循环 | HP 归零后触发,肚子膨胀蠕动,表现有东西即将钻出 |
| 死亡 | Death | 单次 | 肚子爆开,溅出酸液,同时 Spawn 幼蛭 |
### AI 行为
```
战斗循环:
检测玩家距离
├── 远距离 → Skill02酸液远程攻击或 Move 靠近CD[skill02CD]秒
└── 近距离 → Skill01撕咬CD[skill01CD]秒
死亡触发(特殊):
HP ≤ 0 → Death_Pre → Death
Death 动画关键帧事件(或 AnimationEvent触发
SpawnEnemies(E003_YouZhi, count=策划配置, position=自身位置)
```
### 技能规格
#### Skill01 — 撕咬
| 字段 | 值 |
|------|--------------------------------|
| 攻击范围 | 头部前方碰撞盒 |
| 伤害帧 | 最前伸位置单帧判定 |
| 后摇 | 趴地硬直后自动起身(硬直时长可配置,期间可受击,建议与 E004 Skill02_End 相同逻辑) |
#### Skill02 — 酸液喷吐
| 字段 | 值 |
|------|-------------------------------------|
| 弹数 | 2 次(每次一团) |
| 弹道 | 抛物线,落点为玩家方向前方(建议有随机偏移) |
| 落地效果 | 酸液溅射粒子(策划决定是否留持续伤害区) |
#### 死亡生成幼蛭
| 字段 | 值 |
|--------|--------------------------|
| 触发时机 | Death 动画指定帧AnimationEvent |
| 生成数量 | 可配置(建议 24 只) |
| 生成位置 | 自身位置 ± 随机小偏移 |
### 技术备注
- Skill01 后摇(趴地)阶段建议关闭攻击碰撞盒、开放受击碰撞盒。
- Death_Pre 到 Death 为必须完整播放,不可被打断(无敌帧)。
- 幼蛭生成逻辑建议用 AnimationEvent 调用,避免时序问题。
- ⚠️ **待策划确认**E005 肥蛭是否有专用 Flip转身动画需求表未标注程序暂按"无 Flip使用 Sprite 直接翻转"处理。
### 快速参数表(策划待填写)
| 参数名 | 说明 | 参考值 |
|-------------------|-----------------------|-------|
| `maxHP` | 最大生命值 | — |
| `moveSpeed` | 移动速度 | — |
| `detectRange` | 感知距离 | — |
| `skill01Damage` | 撕咬伤害 | — |
| `skill01CD` | 撕咬冷却(秒) | — |
| `skill01StaggerDuration` | 撕咬后趴地硬直时长(秒)| — |
| `skill02Count` | 酸液弹数2次 | 2 |
| `skill02Damage` | 每次酸液伤害 | — |
| `skill02CD` | 酸液冷却(秒) | — |
| `spawnCount` | 死亡时生成幼蛭数量 | — |
---
## E006 讙
### 基本信息
| 字段 | 内容 |
|--------|--------------------------------------------------|
| 编号 | E006_Huan |
| 类别 | 小怪 |
| 行动方式 | 地面巡逻 + 跳跃突进攻击 |
| 核心机制 | 发现玩家后向前跳跃爪击;跳跃位移由程序控制,动画只做原地滞空攻击动作 |
### 状态机
```
[Idle] ──感知玩家──▶ [Skill](循环,每次抵达玩家位置后判断是否继续追击)
[Idle] ──巡逻计时──▶ [Move] ──到达边界/计时结束──▶ [Flip] ──▶ [Move / Idle]
[Skill] ──丢失目标──▶ [Idle]
[任意状态] ──HP归零──▶ [Death]
```
### 状态列表
| 状态 | 动画名 | 类型 | 说明 |
|------|-------|------|------------------------------------------------------|
| 待机 | Idle | 循环 | 静止呼吸 |
| 巡逻 | Move | 循环 | 慢步巡逻 |
| 转身 | Flip | 单次 | 转向衔接 |
| 跳跃爪击 | Skill | 循环 | 动画做原地起跳 + 滞空爪击动作;程序负责在起跳时给予水平方向速度(向玩家方向冲刺) |
| 死亡 | Death | 单次 | 四肢瘫软倒地 |
### AI 行为
```
感知条件:视线检测(正面范围扇形)
├── 未感知 → Move 巡逻 / Idle 间歇站立
└── 感知玩家
├── 进入 Skill起跳前摇帧触发水平速度程序施加冲量
├── 滞空到达玩家附近或落地 → 造成伤害判定
└── 落地后:
├── 玩家仍在感知范围 → 等待 [attackInterval]秒 → 再次 Skill
└── 玩家离开范围 → 回到 Idle
⚠️ 落地后无专用着地动画(需求表未标注),程序直接切回 Idle 或 Move
```
### 技能规格
| 技能 | 触发条件 | 伤害类型 | 攻击范围 | 备注 |
|--------|----------|--------|------------------|-------------------------------------------|
| 跳跃爪击 | 感知玩家 | 瞬时伤害 | 爪部碰撞盒(滞空期间开启) | 动画仅原地,程序在动画起跳帧给 Rigidbody 施加水平冲量 |
### 技术备注
- 跳跃时机动画起跳帧AnimationEvent触发程序施加水平 + 垂直速度。
- 攻击碰撞盒仅在滞空爪击关键帧区间内开启。
- 死亡后尸体消散由程序控制(淡出/粒子),动画仅播放倒地。
- 多只讙建议使用同一 ScriptableObject 共享 AI 参数。
### 快速参数表(策划待填写)
| 参数名 | 说明 | 参考值 |
|------------------|--------------------------|-------|
| `maxHP` | 最大生命值 | — |
| `moveSpeed` | 巡逻速度 | — |
| `detectRange` | 感知距离(正面扇形半径) | — |
| `jumpForceX` | 起跳水平冲量 | — |
| `jumpForceY` | 起跳垂直冲量 | — |
| `attackDamage` | 爪击伤害值 | — |
| `attackInterval` | 落地到下次起跳的间隔(秒) | — |
---
## 通用开发规范
1. **状态机实现**:建议使用 `BaseGames` 框架中现有的状态机组件(参考 `BaseGames.Enemies.AI`)。
2. **伤害判定**:所有技能攻击碰撞盒统一通过 `HitboxComponent` 管理,开关由动画事件(`AnimationEvent`)驱动。
3. **AI 参数配置**:感知范围、速度、技能 CD、伤害值均放入对应 `EnemyData ScriptableObject`,禁止硬编码。
4. **死亡流程**HP ≤ 0 后禁用 AI 与移动,播放 Death 动画,动画结束后由对象池回收(或销毁)。
5. **特效时机**:粒子特效(溅液、酸液落点等)统一通过 `AnimationEvent` 调用 `VFXManager.Play(key)`
6. **受击处理**:本需求表中所有小怪均**无专用受击动画**(需求表未定义)。受击反馈统一使用:
- 程序层:短暂无敌帧 + 闪烁Hit Flash
- 音效层通用受击音效AudioManager 播放)
- 不打断当前动画;如需特定怪专用受击动作,请策划单独补充
7. **动画Clip命名 vs AI状态命名**:部分敌人的 AI 逻辑状态标识符与 Animator Clip 名称不同(如 E001 草蛭的 `Idle_Disguise` 状态对应 Clip 名 `Idle`),各角色章节的"状态列表"表格已分列"AI状态标识符"和"动画Clip名"两列,请以该表格为准实现,避免混淆。