From b0fd0409045810e465c4188bda64c9ba53fd7a6f Mon Sep 17 00:00:00 2001 From: Joywayer Date: Thu, 30 Jul 2026 12:32:43 +0800 Subject: [PATCH] =?UTF-8?q?docs(enemy):=20=E6=8C=89=20Task=201+2=20?= =?UTF-8?q?=E5=AE=A1=E6=9F=A5=E7=BB=93=E8=AE=BA=E4=BF=AE=E8=AE=A2=20spec?= =?UTF-8?q?=20=E4=B8=8E=E8=AE=A1=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit spec:ResourceFull 由「无组件时恒 false」改为显式抛,与 Boss facet、AnchorAt 统一为「依赖组件缺失一律抛,不返默认值」。 计划:Task 16 补上 BossBase 残余三处行为树残留的清理项(含运行时告警字符串); Task 19 记录 Patterns/ 是零外部引用的独立程序集,可整目录删。 --- .../plans/2026-07-30-boss-ai-single-track.md | 10 ++++++++++ .../specs/2026-07-30-boss-ai-single-track-design.md | 8 +++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Docs_Dev/superpowers/plans/2026-07-30-boss-ai-single-track.md b/Docs_Dev/superpowers/plans/2026-07-30-boss-ai-single-track.md index 03d8a61c..00067929 100644 --- a/Docs_Dev/superpowers/plans/2026-07-30-boss-ai-single-track.md +++ b/Docs_Dev/superpowers/plans/2026-07-30-boss-ai-single-track.md @@ -2441,6 +2441,12 @@ TestRoomA 加开战触发区。三件自检 0 error。 **这属于既有缺陷,若出现请单独记录,不要在本 Task 顺手改**) 9. `LastUsedSkillId = null;` 两处(`EnterPhase` 与 `OnSpawn`)删掉——防重复记忆已归选招器 10. using 区里因此不再需要的 `using BaseGames.Boss;`、`using BaseGames.Parry;` +11. **清掉本文件残余的三处行为树残留**(Task 1+2 执行时发现并留待此处,因为本 Task 正好重写这片区域): + - 第 76 行附近的区段注释 `// ── 技能执行(BD Task 调用入口)` —— 随该区段一并删除 + - `BeginPhaseTransition` 文档里的 `BD_BossPhaseTransition 检查 IsPhaseTransitioning 来等待过渡完成。` + —— 改为 `AI 图挂 When(x => !x.Boss.IsPhaseTransitioning) 边等待过渡完成。` + - `BeginPhaseTransition` 重入告警里的运行时字符串 `请检查行为树逻辑是否重复触发阶段切换。` + —— 改为 `请检查 AI 图是否重复触发阶段切换。`(这条是开发期真的会看到的日志,不能留) - [ ] **Step 2: 编译检查** @@ -2660,6 +2666,10 @@ rm -r Assets/_Game/Scripts/Enemies/Boss/Patterns rm -f Assets/_Game/Scripts/Enemies/Boss/Patterns.meta ``` +⚠️ `Patterns/` 是**独立程序集**(`BaseGames.Enemies.Boss.Patterns.asmdef`,`autoReferenced: true`)。 +已核实**零外部引用**(无任何 asmdef 的 `references` 含它),因此可随目录整包删除。 +删除后无需改动任何其他 asmdef。 + - [ ] **Step 3: 编译 + 全量回归** 回 Unity 刷新。MCP `unity_get_compilation_errors` 期望 0 errors 0 warnings;`Run All` 期望全绿。 diff --git a/Docs_Dev/superpowers/specs/2026-07-30-boss-ai-single-track-design.md b/Docs_Dev/superpowers/specs/2026-07-30-boss-ai-single-track-design.md index 7fc5fa69..b9bdcf61 100644 --- a/Docs_Dev/superpowers/specs/2026-07-30-boss-ai-single-track-design.md +++ b/Docs_Dev/superpowers/specs/2026-07-30-boss-ai-single-track-design.md @@ -219,7 +219,7 @@ namespace BaseGames.AI { int CurrentPhase { get; } bool IsPhaseTransitioning { get; } - bool ResourceFull { get; } // BossResource 满值;无资源组件时恒 false + bool ResourceFull { get; } // BossResource 满值;未挂该组件即抛(见下) void BeginPhaseTransition(int targetPhase, float invincibleDuration); // 竞技场锚点(§5.5)。归本 facet 而非黑板:见下方修订说明。 @@ -242,6 +242,12 @@ namespace BaseGames.AI `EnemyBrainContext.Boss => _boss ?? throw new InvalidOperationException(...)`。 按 CLAUDE.md 第 6 条:小怪图误用它必须崩,不能返回一个空对象把问题盖住。 +> 修订(2026-07-30,Task 1+2 代码审查):`ResourceFull` 初稿定为「无资源组件时恒 false」, +> **已改为未挂 `BossResource` 时显式抛**。原设计是同一条第 6 条禁止的下游兜底—— +> 图上挂了 `When(x => x.Boss.ResourceFull)` 边、预制体却漏挂组件时,那条边会永远不成立且零报错。 +> 与紧邻的 `Boss` facet、以及 §5.5 的 `AnchorAt` 保持同一失败语义:**Boss 专属 facet 的每个成员, +> 在其依赖组件缺失时一律显式抛,不返回默认值。** + `BossBase` 实现 `IBossControl`;`EnemyBrainContext` 在构造时 `_boss = enemy as BossBase`。 ### 5.2 `BossPhaseAbilityGate`