Files
zeling_v2/Docs/Game/Design/小怪设计-程序开发文档-01.md
Joywayer f74d7f1877 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.
2026-05-25 23:15:12 +08:00

537 lines
27 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 小怪设计 — 程序开发文档 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名"两列,请以该表格为准实现,避免混淆。