PROJECT-v M4:关卡原型与 Boss 压力验证
M4 的目标不是继续给 M3 战斗链堆更多孤立功能,而是把已经接通的移动、攻击、闪避、技能、武器倍率和反馈链放进连续房间、难度缩放、Boss 弱点和镜像 Boss 的压力环境里验证。换句话说,M4 关心的是:PROJECT-V 是否已经从“单场景战斗能跑通”推进到“关卡和 Boss 语境下仍能形成可玩构成”。
除注明 docs 仓库的文档外,本文所有工程路径均以 PROJECT-V 项目根目录为基准;docs 路径均以 PROJECT-V-game-docs 根目录为基准。
关联提交和依据
M4 功能主体提交:
| commit | 用途 |
|---|---|
6baacf6 |
feat(levels): deliver M4 level and boss prototype,关卡原型与 Boss 里程碑实现 |
分支状态:
| 分支 | 说明 |
|---|---|
develop |
M4 实施分支 |
origin/develop |
已推送 |
主要参考产物:
| 类型 | 路径 |
|---|---|
| 交付报告 | reports/M4_delivery_report.html |
| QA 报告 | qa/reports/M4_test_report.md |
| 完整关卡测试用例 | qa/test_cases/M4_full_level.md |
| Boss 行为矩阵 | qa/test_cases/M4_boss_matrix.md |
| T-DEV30 回归结果 | qa/results/M4_Pre_TDEV30_PlayMode.xml |
| EditMode 结果 | qa/results/M4_EditMode_TestResults.xml |
| PlayMode 结果 | qa/results/M4_PlayMode_TestResults.xml |
| 60s Runtime Probe | qa/results/M4_RuntimeProbe_60s.json |
| Sprint 状态,docs 仓库 | project/sprints/SPRINT_04.md |
| Project State,docs 仓库 | project/PROJECT_STATE.md |
| M4 关卡 spec,docs 仓库 | design/feature_specs/M4_levels.md |
| M4 Boss 行为,docs 仓库 | design/boss_behavior/M4_boss_behaviors.md |
| M4 难度缩放,docs 仓库 | design/difficulty_scaling/M4_difficulty_scaling.md |
M4 的目标和边界
M4 只做关卡原型和 Boss 压力验证。它不改变 M3 的主角战斗边界,也不进入 M5 的程序生成算法。
M4 纳入实现的内容:
-
3 个异世界手工关卡原型:废土、赛博、生化。
-
27 个房间配置:每个异世界 9 个房间。
-
LevelManager/RoomManager关卡与房间状态流。 -
LevelConfigSO/RoomConfigSO数据化房间序列、清理条件、奖励、商店、休息点和 Boss 房。 -
怪物火车式难度缩放:升级强度、房间进度和世界观压力共同影响 HP、伤害、数量、冷却和 telegraph。
-
3 个 Boss:废土军阀、机关头领、变异母体。
-
Boss telegraph、招式激活、弱点暴露、弱点破坏和阶段切换事件。
-
镜像 Boss 参数化系统。
-
T-DEV30 接地稳定性修复。
-
M4 runtime probe:P50/P95/P99 FPS、GC collections、Mono memory delta、房间/Boss/镜像 Boss 检查。
-
EditMode、PlayMode、T-DEV30 回归、Windows Development Build 和 60s probe 验证。
M4 明确不做:
-
程序生成路线。M4 用手工房间控制变量,M5 再做 seed、强约束生成和回归验证。
-
正式美术与正式音频。视觉、BGM、SFX 仍为占位资源。
-
自定义关卡编辑器。
-
联网、云存档、排行榜或远程资源下载。
-
新的主角玩法边界,不引入枪械、魔法、光剑、火球、召唤物或能量武器玩法。
这个边界比“多做几个功能”更重要。M4 如果同时做程序生成、最终美术、正式 Boss 表现和复杂 UI,任何问题都无法判断到底来自生成算法、战斗手感、内容节奏还是表现资源。先用手工关卡压测战斗链,是更稳的顺序。
工程生成入口
M4 的工程入口是 unity-project/Assets/_Project/Editor/M4ProjectBuilder.cs。
SetupM4() 首先调用 M3ProjectBuilder.SetupM3(),再生成 M4 资源。这说明 M4 是对 M3 的增量验证,而不是另起一套关卡或 Boss 框架。
核心生成物:
| 类别 | 路径 |
|---|---|
| 难度缩放配置 | unity-project/Assets/_Project/Levels/SO/Difficulty/DifficultyScaling_M4.asset |
| Boss 配置目录 | unity-project/Assets/_Project/Combat/SO/Bosses/ |
| Level 配置目录 | unity-project/Assets/_Project/Levels/SO/Levels/ |
| Room 配置目录 | unity-project/Assets/_Project/Levels/SO/Rooms/ |
| M4 测试场景 | unity-project/Assets/Scenes/TestScenes/M4_FullLevel.unity |
| 废土关卡场景 | unity-project/Assets/Scenes/Levels/Wasteland/Wasteland_Level1.unity |
| 赛博关卡场景 | unity-project/Assets/Scenes/Levels/Cyberpunk/Cyberpunk_Level1.unity |
| 生化关卡场景 | unity-project/Assets/Scenes/Levels/Biohazard/Biohazard_Level1.unity |
VerifyM4Setup() 的验收点包括:
-
M4 难度配置存在。
-
镜像 Boss 配置存在。
-
3 个 Boss 配置存在且名称正确。
-
3 个 Level 配置存在,世界观和 Boss id 对齐。
-
3 个正式关卡场景和
M4_FullLevel.unity存在。 -
M4 full level scene 包含可运行的关卡、Boss、镜像 Boss 和 runtime probe harness。
这套 builder 延续了 M1-M3 的工程路线:阶段交付不是靠某次手工 Unity 场景状态,而是靠可重建、可验证的 Editor tooling。
Level 和 Room 数据结构
M4 新增 Levels 模块:
| 文件 | 职责 |
|---|---|
unity-project/Assets/_Project/Levels/Scripts/LevelTypes.cs |
定义房间类型、清理条件、奖励、商店、休息、Boss 房和难度上下文 |
unity-project/Assets/_Project/Levels/Scripts/LevelConfigSO.cs |
定义一整关的世界观、章节、Boss、房间序列、奖励池和过渡参数 |
unity-project/Assets/_Project/Levels/Scripts/RoomConfigSO.cs |
定义单个房间的类型、场景 key、门、清理条件、刷怪、奖励、商店、休息点和 Boss 配置 |
unity-project/Assets/_Project/Levels/Scripts/LevelManager.cs |
管一整关的开始、房间推进、房间清理统计、Boss 房进入和章节完成事件 |
unity-project/Assets/_Project/Levels/Scripts/RoomManager.cs |
管单个房间的进入、清理、敌人死亡监听、Boss 死亡监听和出口请求 |
房间类型:
1 | Start |
房间清理条件:
1 | None |
M4 每个异世界关卡当前是 9 房间路线:
1 | Start -> Combat -> Reward -> Elite -> Combat -> Shop -> Rest -> Combat -> Boss |
实际落地的 Level 配置:
| 世界观 | Level 配置 | 房间数 | Boss |
|---|---|---|---|
| Wasteland | unity-project/Assets/_Project/Levels/SO/Levels/Level_Wasteland_Chapter1.asset |
9 |
boss_wasteland_warlord |
| Cyberpunk | unity-project/Assets/_Project/Levels/SO/Levels/Level_Cyberpunk_Chapter1.asset |
9 |
boss_mechanism_chief |
| Biohazard | unity-project/Assets/_Project/Levels/SO/Levels/Level_Biohazard_Chapter1.asset |
9 |
boss_mutation_matriarch |
LevelManager 的关键职责是只管关卡推进,不接管敌人 AI 和 Boss 招式:
1 | BeginLevel() |
QA 中发现的一个真实运行时问题是:生成场景中的 RoomManager.owner 不会被 Unity 序列化。现在 LevelManager.Awake() 会调用 Configure(config, rooms, purity),遍历所有 RoomManager 并重绑 owner 和对应 RoomConfigSO。这个修复很关键,否则 PlayMode 里房间能被清理,但出口推进会因为 owner 为空而失败。
难度缩放
M4 的难度缩放不是简单沿用 M2 的敌人数量/HP 公式,而是升级成三类压力输入:
| 输入 | 含义 |
|---|---|
upgradeIntensity |
本局升级强度归一化,来自通用升级、世界观被动、主动技能、武器世界观修饰和协同 |
roomProgress |
当前房间在整条路线中的进度 |
worldPressure |
武器世界观修饰、build 涉及的世界观数量、跨世界观协同、房间/主 build 世界观不匹配 |
核心实现位于:
-
unity-project/Assets/_Project/Levels/Scripts/DifficultyScalingConfigSO.cs -
unity-project/Assets/_Project/Levels/Scripts/DifficultyScaler.cs
DifficultyScaler.Evaluate() 会计算:
| 输出 | 用途 |
|---|---|
enemyHpMultiplier |
敌人 HP 倍率 |
enemyDamageMultiplier |
敌人伤害倍率 |
enemyCountMultiplier |
spawn budget / 目标敌人数压力 |
enemyCooldownMultiplier |
攻击冷却倍率,越低越频繁 |
enemyTelegraphMultiplier |
telegraph 压缩倍率,但有下限 |
targetEnemyCount |
当前房间目标敌人数 |
这套公式的重点是“房间越靠后、build 越强、世界观压力越高,敌人压力越高”,但所有数值都经过 clamp。它避免了两个极端:玩家 build 强到后半局无脑碾压,或者系统为了追压力直接生成不可读、不可反应的攻击。
Boss 压力也独立评估:
1 | bossPressure = |
M4 没有把难度和程序生成绑定死。它先让手工房间能被数值公式评估,为 M5 的 seed route 和强约束生成保留入口。
Boss 系统
Boss 系统由配置、控制器和弱点三个核心层组成:
| 文件 | 职责 |
|---|---|
unity-project/Assets/_Project/Combat/Scripts/BossConfigSO.cs |
Boss 基础数值、招式、weakpoint、phase 和资源字段 |
unity-project/Assets/_Project/Combat/Scripts/BossController.cs |
配置 HP、运行招式 coroutine、发布 telegraph/activation/defeated/phase 事件 |
unity-project/Assets/_Project/Combat/Scripts/BossWeakpoint.cs |
管弱点暴露、破坏槽、弱点击中、弱点破坏和阶段触发 |
M4 的三个 Boss 配置:
| Boss | 世界观 | HP | 招式数 | 弱点数 | 验证重点 |
|---|---|---|---|---|---|
| Wasteland Warlord / 废土军阀 | Wasteland | 850 |
5 |
3 |
慢起手、重压迫、绕背惩罚 |
| Mechanism Chief / 机关头领 | Cyberpunk | 760 |
5 |
3 |
中高速节奏、机关、短窗口打点 |
| Mutation Matriarch / 变异母体 | Biohazard | 950 |
5 |
2 |
大体型控场、召出压力、清场优先级 |
Boss 招式是数据化的 BossMoveConfig,字段包括:
-
moveType -
telegraphLevel -
telegraphDuration -
activeDuration -
recoveryDuration -
cooldown -
damageMultiplier -
hitboxShape -
dodgeRule -
exposedWeakpointId -
weakpointExposeDuration -
weight
BossController.BeginMove() 会启动招式流程:
1 | OnBossMoveTelegraphStarted |
这意味着 Boss 攻击不是瞬时扣血,而是有可测试的预警、激活、恢复和弱点窗口。PlayMode 可以断言 telegraph 事件、activation 事件和弱点暴露,而不是只看 Boss 有没有动。
弱点系统负责把“打 Boss”变成更具体的战斗目标。BossWeakpoint.RegisterHit() 在弱点暴露时扣破坏槽,发布 OnBossWeakpointHit,破坏后发布 OnBossWeakpointDestroyed,并可调用 BossController.ForcePhase() 推进阶段。
镜像 Boss
镜像 Boss 实现位于:
-
unity-project/Assets/_Project/Combat/Scripts/MirrorBossConfigSO.cs -
unity-project/Assets/_Project/Combat/Scripts/MirrorBossController.cs
M4 的镜像 Boss 不直接复制玩家数值。它只读取纯度、build 强度和关卡序号,输出一组参数化结果:
| 输出 | 含义 |
|---|---|
shouldSpawn |
是否触发镜像 Boss |
mirrorForm |
pure / corrupted / none |
hpMultiplier |
镜像 Boss HP 倍率 |
attackMultiplier |
攻击倍率 |
skillCount |
镜像技能数量 |
passiveUpgradeRate |
被动升级比例 |
cooldownMultiplier |
冷却倍率 |
telegraphMultiplier |
telegraph 倍率 |
触发规则:
| 纯度 | 行为 |
|---|---|
< 30% |
触发 pure 镜像形态 |
30%-70% |
不触发 |
> 70% |
触发 corrupted 镜像形态 |
这个设计避免了一个常见错误:把镜像 Boss 做成“玩家 build 的数值复制体”。复制玩家数值很容易制造无解情况,尤其是 cooldown、无敌帧和技能堆叠。M4 的做法是抽取 build 强度,再通过配置上下界约束。
T-DEV30 接地稳定性修复
M4 开始前处理了一个影响关卡体验的 P1 问题:角色在平台边缘、墙边或实体边界悬空时,可能因为接地检测误判而不自然下落。
修复涉及:
| 文件 | 变化 |
|---|---|
unity-project/Assets/_Project/Player/Scripts/GroundCheckHelper.cs |
新增多点 raycast 接地检测 |
unity-project/Assets/_Project/Player/Scripts/PlayerController.cs |
接入新检测、跳跃后接地 lockout、碰撞退出后重查接地 |
GroundCheckHelper.IsGrounded() 的关键规则:
-
上升速度大于
0.01时直接判定未接地。 -
从 collider 左脚、中脚、右脚三个点向下 raycast。
-
命中的 surface normal 必须
normal.y >= 0.55,避免墙面/侧边误判为地面。 -
raycast 起点略微抬高,减少 collider 边缘浮动误差。
PlayerController 还增加了 GroundingLockoutAfterJump = 0.08s,跳起后短时间内强制不接地。这能防止刚起跳的物理接触残留把角色立刻拉回 grounded 状态。
这个修复对 M4 很实际。关卡里开始有更多平台、边缘、墙体和 Boss arena,M1/M2 测试场景里不显眼的接地误判会在 M4 被放大。
Runtime Probe 增强
M3 已经有 60s probe,但只有平均 FPS、min/max 和系统就绪字段。M4 的 probe 解决了 M3 留下的一个问题:单个 min FPS outlier 不能说明整体帧稳定性。
实现位于 unity-project/Assets/_Project/Levels/Scripts/M4RuntimeProbe.cs。
M4 probe 的运行逻辑:
-
识别
-m4Probe参数。 -
设置
Application.targetFrameRate = 60,关闭 vSync。 -
记录 GC collection 起始计数和 Mono memory。
-
自动
BeginLevel()。 -
warmup 后触发脚本动作:闪避、U 技能、Boss 招式、清理前三个房间、镜像 Boss 评估。
-
收集每帧 FPS 样本。
-
输出 average/min/max、P50/P95/P99、GC、memory delta 和系统就绪字段。
60s 结果:
1 | { |
这组结果比 M3 的 probe 更有解释力。平均 FPS 59.994 只是表层结果,真正重要的是 P95/P99 仍贴近 60、gcCollections 为 0,并且 probe 实际触发了房间推进、闪避、技能、Boss move 和镜像 Boss。
验证结果
M4 当前验证结果如下:
| 验证项 | 证据 | 结果 |
|---|---|---|
| M4 setup generation | ProjectV.EditorTools.M4ProjectBuilder.SetupM4 |
Passed |
| M4 setup verification | ProjectV.EditorTools.M4ProjectBuilder.VerifyM4Setup |
Passed |
| T-DEV30 grounding precheck | qa/results/M4_Pre_TDEV30_PlayMode.xml |
14 / 14 passed |
| EditMode | qa/results/M4_EditMode_TestResults.xml |
25 / 25 passed |
| PlayMode | qa/results/M4_PlayMode_TestResults.xml |
19 / 19 passed |
| Windows Development Build | unity-project/Builds/Windows/PROJECT-V.exe |
exit 0 |
| Runtime Probe 60s | qa/results/M4_RuntimeProbe_60s.json |
Avg 59.994 FPS,P95 59.996 FPS,GC 0 |
EditMode 的 25 个测试包含:
-
M1 setup 回归:5 个。
-
M2 combat 回归:8 个。
-
M3 full combat 回归:7 个。
-
M4 full level:5 个。
PlayMode 的 19 个测试包含:
-
M2 combat 回归:4 个。
-
M3 full combat 回归:6 个。
-
M4 full level / Boss:5 个。
-
M4 grounding:4 个。
M4 full level 测试覆盖:
-
三个世界观 LevelConfig。
-
6-12 房间范围、首房和 Boss 终房。
-
LevelManager开局、房间清理和推进。 -
早期低 build 与后期高 build 的难度缩放差异。
-
Boss telegraph 和 activation 事件。
-
暴露弱点被玩家攻击命中。
-
弱点破坏推动 Boss phase。
-
纯度极端时触发镜像 Boss。
这说明 M4 不是只生成场景资产,而是把关卡、Boss、镜像 Boss、难度、玩家修复和性能探针都纳入自动化验证。
已知风险和限制
M4 已完成玩法/系统闭环,但仍有明确限制:
-
视觉资源仍是占位质量。Boss、房间、弱点提示和章节结束 UI 还不是最终美术。
-
音频仍为占位或沿用 M3 placeholder,正式 BGM、Boss SFX、弱点破坏音效和混音留到后续阶段。
-
M4 是手工关卡原型,不验证程序生成质量;M5 才需要种子复现、非法路线防回归和房间原型库抽象。
-
Addressables-style 异步房间加载目前主要通过配置 key 和 scene-level room managers 表达,生产级 streaming 可以在 M5/M7 扩展。
-
当前 probe 是 60s 工程验证,不等于完整发布前 soak。后续仍需要更长时段、更多场景和真实硬件覆盖。
这些限制不阻止 M4 验收,因为 M4 的目标是工程原型闭环,不是内容生产收口。
M5 方向
docs 仓库的 project/PROJECT_STATE.md 已将状态推进到 M4 完成、准备 M5。M5 的重点应该建立在 M4 的 LevelConfig / RoomConfig / DifficultyScaler 之上,而不是重做关卡框架。
M5 的合理方向:
-
从 M4 的 27 个
RoomConfigSO抽象房间原型库。 -
引入 seed 生成,保证路线可复现。
-
做强约束生成:Boss 终房、休息房位置、精英房间隔、商店/奖励频率、不可达路线防护。
-
建立生成覆盖率和非法路线回归矩阵。
-
将 M4 的 runtime probe 扩展到多 seed、多世界观和更长窗口。
M4 的阶段价值在这里:PROJECT-V 已经有一条从手工房间、难度缩放、Boss telegraph、弱点、镜像 Boss 到 runtime probe 的可验证关卡链路。M5 可以专注于“如何生成好路线”,而不是补 M4 应该完成的关卡基础设施。