# 小怪设计 — 程序开发文档 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 — 头槌 | 字段 | 值 | |----------|----------------------------------| | 攻击类型 | 范围震地 | | 伤害范围 | 砸地落点附近圆形/矩形区域(建议策划配置半径) | | 砸地次数 | 可配置(建议 2–4 次) | | 每次间隔 | 由 Skill02_Loop 动画帧率决定 | | 硬直窗口 | Skill02_End 阶段为硬直,期间关闭攻击盒,开放受击 | #### Skill03 — 酸液喷吐 | 字段 | 值 | |----------|--------------------------------------------------| | 攻击类型 | 远程抛物弹道 | | 弹数 | 多颗(可配置,建议 3–5 颗) | | 落点分布 | 以玩家当前位置为中心,向两侧随机偏移散布(建议策划配置范围) | | 弹道 | 抛物线(设置初速度与重力系数即可) | | 落地效果 | 酸液溅射粒子 + 落地持续伤害区(建议策划决定是否留存伤害区域) | ### 技术备注 - 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) | | 生成数量 | 可配置(建议 2–4 只) | | 生成位置 | 自身位置 ± 随机小偏移 | ### 技术备注 - 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名"两列,请以该表格为准实现,避免混淆。