10 KiB
10 KiB
07 · 敌人系统规范
所属文档集 ← 返回索引
摘要:敌人实体模型、AI 行为规范、Boss 系统设计与掉落体系。
目录
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 通用敌人行为树模板
Root(Selector)
├─ ? 死亡检测
│ └─ [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 直接加入玩家账户(不生成实体,减少拾取摩擦)
→ 特殊道具生成拾取实体,玩家走近自动拾取