怪物
海怪是航行途中的主要战斗威胁:从遭遇区刷出,游荡逼近玩家船,优先冲撞船上武器,死亡后掉落怪物尸体;五种代表性怪物各自把一个战斗考点“写在身上”。
怪物(海怪)是玩家船在海上航行时遭遇的敌对生物,阵营固定为 Enemy(BaseMonster.cs)。它们在游戏循环中承担“外循环战斗压力”的角色:玩家驶入遭遇区后,时间轴按秒刷出怪群(见 遭遇与刷怪),怪物游荡接近、冲撞或远程吐射攻击船体与船员,玩家用船载武器还击(见 武器与弹药),击杀后掉落怪物尸体(见 战利品与掉落)。
当前共 9 种怪物类型(MonsterType.cs):基础三件套 Normal(普通怪)/ Elite(精英怪)/ Boss1,预留的 Boss2,以及五种“教学考点”代表怪:
| 类型 | 中文名 | 设计考点(写在护甲/行为/外观上) |
|---|---|---|
| SteelHorseshoe | 钢壳鲎 | 物理护甲怎么破:厚物理甲、无元素甲无抗性,逼玩家用破甲/穿透/霜蚀脆化 |
| BlazeSerpent | 炽鳞蛇 | 用什么元素:火抗 85%(火点不上),逼玩家换冰/毒 |
| GlideRay | 游曳鳐 | 怎么打中移动目标:无甲薄皮,高速绕圈 + 远程吐射,考验提前量 |
| BarnacleSwarm | 藤壶群 | 怎么高效清群:无甲无抗的脆皮,靠数量压制 |
| AbyssBeast | 渊海兽 | 全套综合:厚双甲 + 全元素抗性,破物理甲后露出弱点 |
所有怪物运行时共用同一个预制 Assets/Resources/Monster/NormalMonster.prefab,生成时按类型在运行时改色、改尺寸来区分(MonsterVisual.cs):
| 类型 | 色调 (RGB) | 尺寸乘子 |
|---|---|---|
| SteelHorseshoe | 哑光厚甲灰 (0.45, 0.47, 0.5) | ×1.2 |
| BlazeSerpent | 橙红炽热 (1, 0.45, 0.15) | ×1.0 |
| GlideRay | 纤细青蓝 (0.4, 0.85, 1) | ×0.8 |
| BarnacleSwarm | 密集小体褐 (0.55, 0.4, 0.3) | ×0.6 |
| AbyssBeast | 巨型暗紫 (0.35, 0.2, 0.45) | ×2.0 |
| 其余类型 | 白色(不改色) | ×1.0 |
AI 状态机
Section titled “AI 状态机”每只怪物由五状态有限状态机驱动(MonsterStateMachine.cs),每帧更新。转换表(MonsterStateTransitionTests.cs 全表锁定):
| 状态 | 进入条件 | 状态内行为 | 退出条件 | 允许转往 |
|---|---|---|---|---|
| Spawning(出生中) | 工厂创建怪物后强制进入(绕过转换校验) | 碰撞体关闭、模型隐藏、不可被攻击/不可被武器锁定、不检测玩家 | 累计 1.5 秒后自动转 Idle(SpawningState.cs 常量 FadeInSeconds) |
Idle、Death |
| Idle(待机/游荡) | 出生 1.5 秒后;或攻击/后退中失去玩家 | 区域内短距离游荡(带武器偏向);进入后先等待 2.0 秒才开始检测玩家(IdleState.cs 常量 IDLE_WAIT_TIME),防止刚后退完立刻再冲 |
等待期满且玩家在检测半径内 → Attack | Attack、Death |
| Attack(攻击) | 玩家进入检测半径 | 选定目标(武器优先,负载均衡)→ 以 2.5 倍速冲撞或绕圈吐射;每 0.2 秒追踪目标,目标位移超 3 米则重新设定冲撞点 | ① 冲撞移动结束 → Retreat;② 玩家离开检测半径 → Idle;③ 攻击超过 5 秒超时 → Retreat(AttackState.cs) |
Retreat、Idle、Death |
| Retreat(后退) | 攻击完成(撞到或移动到位) | 沿“远离玩家”方向以 2.0 倍速后退 RetreatDistance 米(不受游荡区边界限制,仅在 XZ 平面计算) | ① 后退完成且玩家仍在检测半径 → Attack(形成攻击循环);② 后退完成且玩家已离开 → Idle;③ 1.0 秒内未能开始后退 → Idle(RetreatState.cs) |
Attack、Idle、Death |
| Death(死亡) | 血量归零(任何状态都可强转入) | 掉落处理 → 播放死亡特效 → 0.1 秒后销毁游戏物体(BaseMonster.cs) |
终态,不可退出 | 无 |
任何状态都不能正常转入 Spawning,因此出生时由 MonsterFactory.cs 用强制切换进入。
- 每帧计算怪物到玩家(Tag 为
Player的物体,即玩家船)的直线距离,距离 ≤ DetectionRadius(CSV 配置,单位米)即视为“玩家在范围内”(BaseMonster.cs)。 - 没有视线遮挡判定,纯距离球形检测。
- Spawning 期间检测被整体抑制,避免出生瞬间被远程锁定或刚出现就冲船。
待机游荡(Idle)
Section titled “待机游荡(Idle)”怪物被生成后绑定到一个游荡区(遭遇区适配的 IMonsterIdleZone),游荡规则(BaseMonster.cs、NormalMonster.cs):
- 每隔 PatrolInterval ± 0.5 秒(随机扰动)发起一次游荡移动,单步距离为 2 米 ~ 安全半径之间随机。
- 安全半径 = min(PatrolRadius, 到区域边界距离 − 0.5 米);安全半径 < 1 米或采样 5 次都落在区域外时,改为直接把游荡目标取为区域内随机点(区域半径的 50%~80% 处,最多重试 10 次,仍失败则取区域中心),怪物正常移动过去(无瞬移)。
- 怪物在区域外时,以 2.0 倍速快速返回区域。
- 武器偏向:游荡目标方向会向“最近的船载武器”方向插值,偏向强度 0.4(
IdleState.cs常量WEAPON_BIAS_STRENGTH),即 游荡方向 = Lerp(随机方向, 朝武器方向, 0.4),游荡距离不变——怪群会自然地越逛越靠近武器。
攻击目标选择(武器威胁负载均衡)
Section titled “攻击目标选择(武器威胁负载均衡)”进入 Attack 状态时,怪物先向 WeaponThreatService.cs 申请一个“最优武器目标”;申请不到(船上没有可用武器)才退而攻击玩家船位置:
武器评分 = 距离因子 × 1.0 + 锁定数因子 × 2.0 + 随机数(−0.3 ~ +0.3),评分最低者当选 其中 距离因子 = clamp01(怪物到武器距离 / 100 米),锁定数因子 = clamp01(已锁定该武器的怪物数 / 10)
- 权重(距离 1.0 / 锁定数 2.0 / 随机 ±0.3)是
WeaponThreatService的 Inspector 序列化字段(挂在场景物体上可调);归一化基准 100 米 / 10 只是代码常量。 - 武器列表每 2 秒从
BuildingRegistry刷新一次(Inspector 字段_refreshInterval)。 - 锁定会登记到服务端,怪物退出 Attack 状态或死亡时解锁;武器中途被拆毁时,怪物自动改为攻击玩家船。
攻击方式与判定
Section titled “攻击方式与判定”近战冲撞(Normal / Elite / Boss1 / 钢壳鲎 / 炽鳞蛇 / 藤壶群)
Section titled “近战冲撞(Normal / Elite / Boss1 / 钢壳鲎 / 炽鳞蛇 / 藤壶群)”- 以 2.5 倍移动速度(代码常量
ATTACK_SPEED_MULTIPLIER,NormalMonster.cs)直线冲向目标点(匀速,无缓动)。 - 冲撞途中每 0.05 秒(Inspector 字段
collisionCheckInterval)向移动方向发射球形射线(球半径 1 米、射线长 10 米,NormalMonster.prefab序列化值),命中 ShipBuilding 层且命中距离 ≤ 0.3 米(prefab 序列化值shipCollisionDistance)判定为撞击;物理碰撞和触发器进入作为补充判定。 - 撞击结算(
NormalMonster.cs): - 撞击后立即停止移动并转入 Retreat。
远程吐射(游曳鳐 / 渊海兽)
Section titled “远程吐射(游曳鳐 / 渊海兽)”行为风格由类型查表(MonsterBehaviorStyle.cs):
| 类型 | 移动风格 | 攻击风格 | 理想交战距离 |
|---|---|---|---|
| GlideRay | 绕圈(Orbit) | 远程吐射 | 8 米 |
| AbyssBeast | 直冲(Charge) | 远程吐射 | 10 米 |
| 其余全部 | 直冲(Charge) | 近战冲撞 | 2 米 |
- 绕圈机动(
MonsterManeuver.cs、NormalMonster.cs):与目标距离 < 理想距离 × 80% 时先后撤到理想距离;否则沿以目标为圆心、理想距离为半径的圆每步推进 20 度。绕圈也使用 2.5 倍攻击速度档。 - 吐射判定(
NormalMonster.cs):玩家距离 ≤ AttackRange(CSV)才会开火;按目标当前速度解算提前量瞄点(InterceptSolver),弹体初速 15 米/秒、吐射间隔 1.5 秒(两者为NormalMonster序列化字段的代码默认值,prefab 未覆盖);弹道发射瞬间锁定,不追踪,目标继续机动即脱靶。 - 命中率减益:怪物若中了命中率减益(弹药附带,见 元素与状态效果),瞄点随机偏移半径 = (1 − 命中率乘子) × 4 米。
- 弹体:优先用 Inspector 配置的弹体预制;未配置时运行时生成兜底小球(直径 0.3、无碰撞体),走通用
Bullet.cs结算——兜底弹体基础伤害为 Bullet 默认值 10,同样不读 CSV 的 Attack。 - 麻痹打断定身期间(见下文)暂停吐射与转向。
移动速度档位
Section titled “移动速度档位”所有移动用补间驱动(匀速直线),实际速度 = CSV MoveSpeed × 档位乘子(NormalMonster.cs 代码常量):
| 移动类型 | 乘子 | 场景 |
|---|---|---|
| Patrol 巡逻 | ×1.0 | Idle 游荡 |
| Attack 攻击 | ×2.5 | 冲撞、绕圈 |
| Retreat 后退 | ×2.0 | 攻击后脱离 |
| ReturnToArea 返回区域 | ×2.0 | 游荡出界快速返回 |
转向耗时 0.5 秒(prefab 序列化字段 rotationDuration)。
受击、护甲与元素抗性
Section titled “受击、护甲与元素抗性”怪物初始化时按类型挂载战斗档案(双护甲池 + 四元素抗性,目标类别为“生物”),数值全部硬编码在 MonsterCombatProfile.cs(代码常量,注释明确“设计阶段手写、后续可迁移 CSV”):
| 类型 | 物理护甲 | 元素护甲 | 火抗 | 冰抗 | 毒抗 | 电抗 |
|---|---|---|---|---|---|---|
| Normal | 0 | 0 | 0 | 0 | 0 | 0 |
| Elite | 30 | 20 | 0 | 0 | 0 | 0 |
| Boss1 / Boss2 | 60 | 40 | 30% | 30% | 30% | 0 |
| SteelHorseshoe | 80 | 0 | 0 | 0 | 0 | 0 |
| BlazeSerpent | 10 | 20 | 85% | 0 | 0 | 0 |
| GlideRay | 0 | 0 | 0 | 0 | 0 | 0 |
| BarnacleSwarm | 0 | 0 | 0 | 0 | 0 | 0 |
| AbyssBeast | 100 | 80 | 30% | 30% | 30% | 30% |
- 护甲是可被打掉的“护甲值池”(先扣甲再扣血,破甲联动等结算规则见 伤害与护甲)。
- 渊海兽专属“破甲露弱点”(
NormalMonster.cs):物理护甲池被打到 0 的瞬间(一次性触发),元素护甲池立刻清零、全身变红(RGB 1, 0.35, 0.35)提示全面受创。 - 怪物受元素命中会叠加元素状态层数,全身按主导元素着色(
StatusEffectVisual,挂载于初始化时)。
元素状态与减益对怪物行为的影响
Section titled “元素状态与减益对怪物行为的影响”怪物移动速度实际乘子(NormalMonster.cs 属性 LocomotionScale):
移动乘子 = 元素动作效率 × 麻痹打断定身乘子 × 移动减益乘子
各分量(数值出自 StatusTuning.cs,机制详见 元素与状态效果):
| 来源 | 1 层 | 2 层 | 3 层 | 说明 |
|---|---|---|---|---|
| 冷冻(冰)减速 | −30% | −60% | −90% | 冻结质变时直接归零(完全定身) |
| 麻痹(电)减速 | −10% | −25% | −50% | 与冷冻减速相乘叠加 |
| 麻痹打断几率 | 10% | 25% | 50% | 每 0.6 秒判定一次,命中则瞬时定身 0.35 秒,期间暂停移动、攻击、吐射 |
另有三类平行减益(由特种弹药施加,取最强值、到时恢复,CombatDebuffState.cs):移动减益(直接乘进移动乘子)、攻击减益(缩放撞船伤害与船员溅射,乘子为 0 时本次撞击不造成伤害)、命中减益(吐射脱靶半径,见上文)。
生成入口只有一个:MonsterFactory.cs 的 CreateMonster(遭遇区时间轴与开发者工具都走这条路),流程:读 CSV 静态配置 → 实例化共用预制 → 按类型应用外观 → 初始化(满血、挂护甲档案与元素状态控制器)→ 强制进入 Spawning。生成调度本身(哪个区、什么时间、刷什么)由遭遇系统负责,详见 遭遇与刷怪,与本页相关的要点:
- 刷新位置在船的本地坐标系采样:左右 ±35 米、前方 50 米、后方 10 米的矩形内,拒绝距船 20 米以内的点(防贴脸),拒绝陆地与区外点,同批怪物间最小间距取 CSV 的 MinDistanceBetweenMonsters,每个位置最多采样 20 次(
DirectionalSpawnDirector.cs、EncounterSpawnConstants.cs)。 - 刷新数量来自遭遇时间轴
EncounterTimelines.csv的 count 参数与压力地板(存活数低于地板值且距上次强制刷新 ≥ 3 秒时补刷 Normal ×1),CSV 中的 MinSpawnCount / MaxSpawnCount 两列当前没有任何运行时消费者。 - 消失途径共三种(
ZoneArenaSession.cs、DespawnEnforcer.cs):- 被玩家击杀:走完整死亡流程(掉落 + 0.1 秒后销毁)。
- 距离消失:每 0.5 秒检查一次,距玩家船 > 100 米(代码常量
DespawnRange)的怪被直接处死——注意也会走死亡流程并在原地掉落。 - 离区清理:玩家离开遭遇区、会话结束时全部处死。
死亡流程(BaseMonster.cs → DropManager.cs):
- 掷骰 Random(0, 100),结果 ≤ DropChance(CSV,百分比)则掉落;当前所有怪 DropChance = 100,必掉。
- 掉落物 ID(CSV DropItemId,当前全部为
MonsterCorpse)经映射表DropItemMapping.asset(Unity 资产,Inspector 配置)解析为预制件——当前映射到DropTest.prefab,在怪物死亡位置实例化。 - 拾取与入库见 战利品与掉落。
Boss 海怪(独立脚本,未启用)
Section titled “Boss 海怪(独立脚本,未启用)”BossMonster.cs 是一套独立于五状态机的手摆 Boss(Roaming / Combat / Dead 三态自驱动):沿场景中手工指定的路径点巡游(每 300 秒换点),玩家进入 40 米检测圈后进入战斗,每 3 秒冷却向玩家位置冲锋一次,死亡时广播 Boss 被击败消息(含海域归属国,供 阵营与外交 结算)、隐藏模型并在 600 秒后于随机路径点满血重生。全部数值为 Inspector 序列化字段:HP 1000 / 攻击 30 / 检测 40 米 / 速度 1.5 米每秒 / 巡游间隔 300 秒 / 重生 600 秒 / 攻击冷却 3 秒。
注意区分:遭遇时间轴 boss_kraken 里刷的 type=Boss1 走的是普通怪物工厂——共用预制 + Boss1 的 CSV 行 + Boss 护甲档案,行为与普通冲撞怪相同;BossMonster.cs 脚本本身当前没有出现在任何场景或预制中(见已知限制)。
| 公式 | 出处 |
|---|---|
| 撞船伤害 = round(10 × 攻击力减益乘子),固定基数 10 | NormalMonster.cs(代码常量) |
| 船员溅射伤害 = max(1, round(Attack ÷ 2 × 攻击减益 × (1 − 距离/3))),半径 3 米 | NormalMonster.cs(代码常量) |
| 武器目标评分 = clamp01(距离/100)×1.0 + clamp01(锁定数/10)×2.0 + rand(±0.3),最低者当选 | WeaponThreatService.cs |
| 游荡方向 = Lerp(随机方向, 朝最近武器方向, 0.4) | IdleState.cs / WeaponThreatService.cs |
| 游荡安全半径 = min(PatrolRadius, 到边界距离 − 0.5 米),单步 2 米起 | BaseMonster.cs |
| 下次游荡时刻 = 当前 + PatrolInterval + rand(±0.5 秒) | BaseMonster.cs |
| 移动乘子 = 元素动作效率 × 麻痹定身乘子 × 移动减益乘子 | NormalMonster.cs |
| 吐射脱靶偏移半径 = (1 − 命中率乘子) × 4 米 | NormalMonster.cs |
| 绕圈:距离 < 理想距离×0.8 先后撤,否则每步沿圆推进 20 度 | NormalMonster.cs / MonsterManeuver.cs |
CSV 列含义(StaticMonsterConfig.csv,15 列)
Section titled “CSV 列含义(StaticMonsterConfig.csv,15 列)”| 列 | 类型 | 单位 | 用途 |
|---|---|---|---|
| MonsterId | string | — | 行 ID(当前与类型同名) |
| MonsterType | 枚举 | — | 对应 MonsterType 枚举值 |
| MaxHP | int | 点 | 最大血量(出生满血) |
| Attack | int | 点 | 攻击力——当前仅用于船员溅射(÷2)与 Inspector 显示,撞船伤害不读它 |
| DetectionRadius | float | 米 | 玩家检测半径(进攻触发距离) |
| AttackRange | float | 米 | 攻击距离门槛(远程怪开火距离;近战怪只影响朝向调用) |
| RetreatDistance | float | 米 | 攻击后的后退距离 |
| MoveSpeed | float | 米/秒 | 基础移动速度(再乘档位乘子) |
| PatrolRadius | float | 米 | 游荡半径上限 |
| PatrolInterval | float | 秒 | 游荡间隔(±0.5 秒扰动) |
| MinSpawnCount | int | 只 | 当前无运行时消费者 |
| MaxSpawnCount | int | 只 | 当前无运行时消费者 |
| MinDistanceBetweenMonsters | float | 米 | 同批刷新时怪物间最小间距 |
| DropItemId | string | — | 掉落物映射键(当前全部 MonsterCorpse) |
| DropChance | float | 百分比 0-100 | 掉落概率(当前全部 100) |
难度数据集对比(none / easy / hard)
Section titled “难度数据集对比(none / easy / hard)”运行时默认读取 Assets/StreamingAssets/DataSets/monsters/none/StaticMonsterConfig.csv(生成代码 StaticMonsterConfig.cs 内置路径);开发者工具的场景预设(ScenarioLoader.cs,monsters 轴)可整套切换到 easy / hard。三套数据集只有 Normal / Elite / Boss1 三行有差异,五种代表怪的行完全相同:
| 怪物 | 字段 | none | easy | hard |
|---|---|---|---|---|
| Normal | 整行 | 不存在(刷 Normal 会因查不到配置而失败,等于关闭普通怪) | 存在 | 存在 |
| Normal | MaxHP / Attack | — | 50 / 5 | 200 / 20 |
| Normal | DetectionRadius / AttackRange | — | 25 / 2 | 50 / 3 |
| Normal | MoveSpeed / PatrolRadius / PatrolInterval | — | 2 / 6 / 5 | 5 / 10 / 2 |
| Normal | Min~MaxSpawnCount / 间距 | — | 1~10 / 2 | 5~50 / 2 |
| Elite | MaxHP / Attack | 1 / 0(站桩沙包) | 200 / 15 | 400 / 35 |
| Elite | DetectionRadius / RetreatDistance / MoveSpeed / PatrolRadius | 1 / 1 / 1 / 1 | 60 / 12 / 6 / 10 | 60 / 12 / 6 / 10 |
| Boss1 | MaxHP / Attack | 1 / 0(站桩沙包) | 500 / 30 | 1200 / 70 |
| Boss1 | DetectionRadius / RetreatDistance / MoveSpeed / PatrolRadius | 1 / 1 / 1 / 1 | 80 / 15 / 4 / 12 | 80 / 15 / 4 / 12 |
五种代表怪(三套数据集相同,CSV 配置表,可直改):
| 怪物 | MaxHP | Attack | 检测半径 | 攻击范围 | 后退距离 | 移速 | 巡逻半径 | 巡逻间隔 | Min~Max 刷新数* | 间距 | 掉落 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| SteelHorseshoe 钢壳鲎 | 120 | 8 | 25 | 2 | 10 | 1.5 | 6 | 5 | 1~3 | 2 | MonsterCorpse 100% |
| BlazeSerpent 炽鳞蛇 | 70 | 10 | 30 | 2 | 10 | 3 | 6 | 4 | 2~4 | 2 | MonsterCorpse 100% |
| GlideRay 游曳鳐 | 50 | 6 | 40 | 8 | 15 | 7 | 8 | 3 | 2~3 | 2 | MonsterCorpse 100% |
| BarnacleSwarm 藤壶群 | 15 | 3 | 20 | 2 | 8 | 2.5 | 5 | 3 | 10~20 | 1 | MonsterCorpse 100% |
| AbyssBeast 渊海兽 | 600 | 30 | 80 | 2 | 15 | 3 | 12 | 4 | 1~1 | 3 | MonsterCorpse 100% |
* 刷新数两列当前无运行时消费者,实际数量由遭遇时间轴决定。
另有一份根目录 Assets/StreamingAssets/StaticMonsterConfig.csv(Normal 100HP/10 攻、Elite 300/25、Boss1 800/50,五种代表怪同上),运行时不读取它——生成代码固定指向 none 数据集,它只是代码生成器的扫描源/历史母表,改它不影响游戏。
easy 数据集额外多一份 MonsterPolygons.json(12 个多边形怪区,含 monster_types / max_monsters / spawn_interval 字段),由 MonsterPolygonsData.cs 加载,但当前没有任何运行时系统消费这份数据(见已知限制)。
行为与战斗的代码常量
Section titled “行为与战斗的代码常量”| 参数 | 值 | 来源 |
|---|---|---|
| 出生无敌窗口 | 1.5 秒 | SpawningState.cs 代码常量(与 EncounterSpawnConstants.cs 同步) |
| Idle 进入后检测延迟 | 2.0 秒 | IdleState.cs 代码常量 |
| 游荡武器偏向强度 | 0.4 | IdleState.cs 代码常量 |
| 攻击追踪间隔 / 目标位移阈值 | 0.2 秒 / 3 米 | AttackState.cs 代码常量 |
| 攻击超时 | 5 秒 | AttackState.cs 代码常量 |
| 后退失败超时 | 1.0 秒 | RetreatState.cs 代码常量 |
| 速度档位(巡逻/攻击/后退/回区) | ×1.0 / ×2.5 / ×2.0 / ×2.0 | NormalMonster.cs 代码常量 |
| 撞船固定伤害基数 | 10 点 | NormalMonster.cs 代码常量 |
| 船员溅射半径 | 3 米 | NormalMonster.cs 代码常量 |
| 死亡销毁延迟 | 0.1 秒 | BaseMonster.cs 代码常量 |
| 距离消失阈值 / 检查频率 | 100 米 / 每 0.5 秒 | EncounterSpawnConstants.cs、ZoneArenaSession.cs |
| 麻痹打断判定间隔 / 定身时长 | 0.6 秒 / 0.35 秒 | StatusTuning.cs 代码常量 |
Inspector 序列化参数(NormalMonster.prefab / 场景物体)
Section titled “Inspector 序列化参数(NormalMonster.prefab / 场景物体)”| 参数 | prefab 当前值 | 代码默认值 | 说明 |
|---|---|---|---|
| rotationDuration | 0.5 秒 | 0.5 秒 | 转向耗时 |
| shipCollisionDistance | 0.3 米 | 0.5 米 | 撞击判定距离 |
| collisionCheckInterval | 0.05 秒 | 0.05 秒 | 球形射线检测间隔 |
| maxRaycastDistance | 10 米 | 50 米 | 射线最大长度 |
| sphereCastRadius | 1 米 | 1.5 米 | 球形射线半径(容忍船体上下浮动) |
| shipBuildingLayer | (层掩码) | — | 船体建筑层 |
| _rangedProjectilePrefab | 未配置 | 空 | 吐射弹体预制(空则运行时兜底小球) |
| _rangedProjectileSpeed | (未覆盖→15) | 15 米/秒 | 吐射初速 |
| _rangedFireInterval | (未覆盖→1.5) | 1.5 秒 | 吐射间隔 |
WeaponThreatService 四参数 |
— | 刷新 2 秒 / 距离权重 1 / 锁定权重 2 / 随机 0.3 | 场景物体上可调 |
与其他系统的交互
Section titled “与其他系统的交互”- 遭遇与刷怪:遭遇区、时间轴(
EncounterTimelines.csv:swarm_light / swarm_med / swarm_heavy / boss_kraken)、压力地板与会话生命周期决定怪物何时何地出现与清理。 - 武器与弹药:怪物的首选攻击目标是船载武器;玩家用武器与八类弹药击杀怪物。
- 伤害与护甲:双护甲池、破甲联动、伤害结算内核;怪物撞船伤害经统一的“命中点 → 最近建筑”路径落地。
- 元素与状态效果:元素叠层、冻结/麻痹/减益对怪物移动与攻击的全部影响来自该系统。
- 船员:撞击溅射伤害的承受者。
- 船只 / 建筑:撞击的直接受害者是船体建筑。
- 战利品与掉落:怪物尸体掉落与拾取。
- 世界/阵营与外交:Boss 被击败消息携带海域归属国与击杀者阵营。
- 开发者工具:强制刷怪(含五种代表怪一键布置)、清怪、暂停刷新、对附近怪施加元素层(
DevToolsManager.cs)。 - 配置表总览:怪物 CSV 在全部配置表中的位置。
配置与调参指南
Section titled “配置与调参指南”| 想调什么 | 改哪里 | 类型 |
|---|---|---|
| 某怪血量/攻击/速度/检测半径/巡逻/掉落 | Assets/StreamingAssets/DataSets/monsters/{none,easy,hard}/StaticMonsterConfig.csv 对应行(注意:根目录同名 CSV 运行时不生效) |
CSV |
| 测试场景用哪套难度 | Assets/StreamingAssets/Presets/*.json 的 "monsters" 字段(none/easy/hard) |
JSON 预设 |
| 怪物护甲/元素抗性 | MonsterCombatProfile.cs 的类型分支 |
代码常量(需程序改) |
| 远程/绕圈行为与理想交战距离 | MonsterBehaviorStyle.cs 的类型分支 |
代码常量(需程序改) |
| 各类型颜色/尺寸 | MonsterVisual.cs |
代码常量(需程序改) |
| 撞船伤害基数 10 / 溅射半径 3 米 | NormalMonster.cs |
代码常量(需程序改) |
| 出生无敌时长 1.5 秒 / 消失距离 100 米 | SpawningState.cs + EncounterSpawnConstants.cs(两处需同步改) |
代码常量(需程序改) |
| 攻击/后退速度倍率、各状态计时 | NormalMonster.cs、IdleState.cs、AttackState.cs、RetreatState.cs |
代码常量(需程序改) |
| 撞击判定距离/射线参数/转向时长 | Assets/Resources/Monster/NormalMonster.prefab 上的 NormalMonster 组件 |
Inspector |
| 吐射弹体预制/初速/间隔 | 同上 prefab(当前未覆盖,用代码默认) | Inspector |
| 武器负载均衡权重 | 场景中 WeaponThreatService 组件 |
Inspector |
| 掉落物 ID → 预制映射 | Assets/Scripts/Service/Monster/DropItemMapping.asset |
Inspector(资产) |
| 刷怪节奏与数量 | Assets/StreamingAssets/Encounter/EncounterTimelines.csv / EncounterZones.csv |
CSV |
| Boss 海怪全部数值 | 场景中 BossMonster 组件(当前未摆放) |
Inspector |
已知限制与注意事项
Section titled “已知限制与注意事项”- 撞船伤害不读 Attack:近战撞击对船体的伤害是代码写死的基数 10(
NormalMonster.cs),CSV 的 Attack 只影响船员溅射(÷2);调 Attack 不会让怪撞船更疼。 - 远程吐射伤害也不读 Attack:兜底弹体伤害为
Bullet.cs序列化默认 10;要改吐射伤害需配置弹体预制。 - MinSpawnCount / MaxSpawnCount 两列无消费者:实际刷新数量完全由
EncounterTimelines.csv的 count 与压力地板决定。 - 根目录
StaticMonsterConfig.csv不被运行时读取:运行时固定走DataSets/monsters/none/,预设可切 easy/hard;改根目录文件无效(它是代码生成器的扫描源)。 - none 数据集靠“删行 + 1 血沙包”实现关怪:Normal 行直接缺失(刷怪请求会失败并打日志),Elite/Boss1 留 1 血 0 攻沙包行。
- 距离消失也走完整死亡流程:超 100 米被清理的怪同样掉落尸体(掉在远处海面)。
BossMonster.cs未接入:脚本未出现在任何场景/预制中;且其 Combat 状态只会冲向玩家,没有任何造成伤害的代码路径(序列化的攻击力 30 未接入结算),也没有配置 DropItemId(死亡不掉落)。当前游戏里“Boss 体验”实际由时间轴刷出的 Boss1 普通怪承担。- Boss2 只有枚举与护甲档案:CSV 无 Boss2 行,刷不出来。
- easy 数据集的
MonsterPolygons.json加载后无人使用:MonsterPolygonsData.cs只有 ScenarioLoader 调它加载,没有任何刷怪系统读取其多边形区域。 - AttackRange 对近战怪几乎无意义:近战冲撞由移动+碰撞判定完成,AttackRange 只控制 Attack() 里“转向朝玩家”这个调用是否执行;真正的进攻触发距离是 DetectionRadius。
- 检测无视线遮挡:纯距离球形检测,隔着岛也能“看见”玩家。
- 护甲/抗性/行为风格/外观均为硬编码:设计阶段决策(
MonsterCombatProfile.cs注释),策划无法通过配置表调整,后续计划迁移 CSV 数据中心。 - 设计文档(
Docs/qq/.../monster-bestiary-framework_design.md等)已随分支清理删除,本页全部以代码现状为准。