joywayer and Claude Opus 5
822dc90c21
refactor(enemy): 清行为树债——StopBehaviorTree 改名,删 ConsumeParryEvent
...
StopBehaviorTree → NotifyDecisionStop(方法体早已只是发 Died 信号)。
EnemyDeathSequence 的 _stopBehaviorTree 字段同步改名,带 FormerlySerializedAs 保值。
ConsumeParryEvent 及其 TTL 状态删除:零调用者,且 ForceState(Stagger) +
IsControllable 让位门已是更优表达,不需要第二条受击通道。
顺带清掉这三个文件里残留的行为树插件措辞(BD_* / BD Task / 停行为树)。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-30 16:23:47 +08:00
joywayer and Claude Opus 5
a44aafee3a
refactor(enemy): BossBase 瘦身——删技能执行与弹反反制两套
...
技能选取/执行归 EnemyAttackSelector + EnemyAbilityBase(阶段一已就位),
BossBase 不再持有 BossSkillExecutor。阶段切换改用能力注册表打断在跑的招。
弹反反制整套删除:它订阅的是全局弹反成功频道,无来源过滤——
玩家弹反任意小怪都会让场上 Boss 硬直。正确形态是 EnemyBase.ReceiveParry
(谁被弹反谁硬直),其接线为独立后续任务。
调试面板的 BossSkillExec 行换为阶段与过渡状态。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-30 16:19:21 +08:00
joywayer and Claude Opus 5
635ab69bb6
refactor(enemy): BossResource 去掉自动放招,触发权交回 AI 图
...
满值时由 BossResource 直接调 UseBossSkill 是绕过决策层执行,
违反「AI 只决策、能力负责实现」。现在只维护数值并暴露 IsFull,
AI 图挂 When(x => x.Boss.ResourceFull) 边进专属招态。
顺带解除对即将删除的 BossSkillSO 的依赖。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-30 16:13:51 +08:00
joywayer
02c3a764a5
docs(enemy): 记录 Task 15 实测结论——含一个项目级严重 bug
...
后续任务新增最高优先级项:EnemyHurtState.Enter 在无受击动画时提前返回
且不安排回 Controlled,敌人被打一次即永久卡在 Hurt 态、AI 永久停摆。
美术未接入的当下等于大部分敌人一挨打就废。与 Boss 轨无关,需单独立项。
Task 16 加警示:不得删掉 Task 15 新增的 BossBase.Start()——它是场景直接
放置的 Boss 唯一一次应用阶段招池的时机(EnterPhase 只在换阶段触发、
OnSpawn 只在池化复用触发,开局都不跑)。
顺带更正计划头部的 Unity 版本(实际 2022.3.62f3c1,非 Unity 6)。
2026-07-30 16:05:26 +08:00
joywayer and Claude Opus 5
877d2f5fef
feat(enemy): 嘲风迁移到新轨——能力资产 + 对象树 + 开战触发
...
删 5 个空 BossSkillSO,用向导重建 6 个 EnemyAbilitySO(含入场演出)。
预制体经放置工具重新产出:EnemyAiBrain(_definitionId=ChaoFeng) +
BossPhaseAbilityGate + 6 个能力组件,不再有 BossSkillExecutor。
TestRoomA 加开战触发区。三件自检 0 error,EditMode 260/260。
首次真正跑通两条脚手架,暴露并修掉三个它们的缺陷:
1. 放置工具漏挂 EnemyLocomotion(PlaceChaoFeng 及其余 7 个敌人放置入口)。
EnemyBase.Awake 找不到它即报错且 Locomotion 为 null,
AiStateFragments.ApplyLocomotion 直接 NRE、AiRuntime 构造失败——
Boss 建不出决策层,完全不动。已在所有敌人放置入口补齐。
2. 向导把空中阶段的 wind_stone 建成 requiresGrounded=true(SO 默认值)。
Boss 浮空后 IsGrounded 恒 false,选招器把它滤掉,空中阶段站着不打。
能力定义表加 grounded 列,阶段 1 的招显式置 false。
3. BossPhaseAbilityGate.ApplyPhase 只在 EnterPhase 与 OnSpawn 调用,
直接摆场景里的 Boss 两条路径都不走,开局后续阶段的招仍在候选池里。
BossBase.Start 补一次初始阶段应用。
另:Phase1_Tornado_HitBox 确认零消费者(龙卷判定随弹体走),
从放置工具删除其创建与伤害源绑定;
EnemyBrainContext.UseAbility 对解析不到的能力 id 改为 LogError,
不再静默返回 false(CLAUDE.md 第 6 条);
新增 PlaceBossFightTrigger 脚手架(此前无对应创建入口,属裸建)。
播放模式实测状态序列(TestRoomA,玩家走进触发区):
Wait →(Engaged) Intro → Ground⇄GroundAttack →(hp<50%) PhaseTransition
→ Air⇄AirAttack,浮空生效,阶段门按阶段换池,全程 0 报错。
动画 Clip 未接入,PlayClipAbility 空 clip 立即完成,故只验证了状态流转,
判定时序待美术接入后再校。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-30 16:02:14 +08:00
joywayer
bdeefca75b
docs(enemy): Task 15 补 Phase1_Tornado_HitBox 去留判定
...
Task 14 发现该 HitBox 在 _hitBoxes 数组随 BossSkillExecutor 移除后已无任何引用。
龙卷由动画事件生成弹体、判定自带,Boss 身上这个 HitBox 很可能多余。
要么删掉其创建与伤害源绑定,要么绑进对应能力的槽位——不得以无引用状态留在对象树上。
2026-07-30 15:19:57 +08:00
joywayer and Claude Opus 5
ba2e22cd58
refactor(editor): PlaceChaoFeng 改挂新轨——决策层 + 阶段门 + 能力组件
...
BossSkillExecutor 换为 EnemyAiBrain(_definitionId=ChaoFeng) +
BossPhaseAbilityGate + 6 个能力组件(一招一子物体,绕开
DisallowMultipleComponent)。HitBox 改绑命名槽位,阶段招池经反射写入。
顺带删掉 Place Boss Enemy 报告里的 BossSkillExecutor 旧轨提示,
以及已无引用的 using BaseGames.Boss。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-30 15:17:52 +08:00
joywayer and Claude Opus 5
a64449d213
refactor(editor): 角色向导 Boss 页改产出 EnemyAbilitySO
...
该向导是 5 个空 BossSkillSO 资产的创建链路——不改则会持续产出旧轨资产。
招式表扩为带 soType / rangeRadius / cooldown / weight 的形式(与
GetEnemyAbilityDefs 对齐),阶段可用性移交 BossPhaseAbilityGate。
产出时强制 rangeRadius > 0,不把责任推给下游作者。
状态面板改查 EnemyAbilitySO,并新增 AI 图注册状态一行。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-30 15:08:10 +08:00
joywayer
e488255315
docs(enemy): Task 15 补两项——UseAbility 静默失败与频道资产实名
...
Task 11 发现 EnemyBrainContext.UseAbility 对找不到的能力 id 静默返回 false:
入场演出资产漏配会被静默跳过且零报错,是第 6 条禁止的静默通过。
建图期已挡掉空 id,故运行期解析不到必是配置错误,改为 LogError(非抛异常,
因为这是每帧路径)。放 Task 15 因为那是第一次能观察到配齐/漏配两种表现的时点。
Task 12 实测:EVT_BossFightToggled 资产不存在,实际是 EVT_BossFightEnded
被当开关用(BGMController 与 BossHPBar 都绑它)。资产名与用途不符是既存问题,
本次只记录不改名。
2026-07-30 14:58:08 +08:00
joywayer
990f90d383
feat(enemy): BossFightTrigger——补上缺失的开战触发
...
开战事件频道此前全项目零发送方,Boss 永远不开战。
触发时广播开战事件并向 Boss 决策层发 AiSignal.Engaged。
漏配目标 Brain / bossId / 两个频道 / 玩家层掩码 / isTrigger 一律逐条点名报错并停用组件,
不做部分执行——半开的战斗比彻底不开更难查。
2026-07-30 14:55:05 +08:00
joywayer
0d81d29527
feat(enemy): 嘲风 AI 图(BrainGraph 定制路径)
...
Wait →(Engaged) Intro → Ground⇄GroundAttack →(hp<50%) PhaseTx → Air⇄AirAttack。
Boss 不脱战(rest 指回自身)、阶段单向推进、起手就打完。
死亡不在图上:全局 Died 边进 Death 终态,演出归物理层。
8 条 EditMode 断言覆盖状态序列、过渡只发起一次、过渡结束必须转出、
脱离感知区不脱战、血量回升不回退阶段。
2026-07-30 14:51:08 +08:00
joywayer
d172f903b6
docs(enemy): 记录 BrainBuilder 缺少「态是否有出边」校验
...
Task 9+10 执行时发现:Build() 只做 RequireState 的正向校验(边指向的态
是否已声明),不校验反向——已声明却无出边的非终态会让敌人永久卡住且零报错。
BossFragments.PhaseTransition 按设计不自带出边,正是这类风险点。
列入后续任务,并记录 MoveToAnchor 只在 OnEnter 采样锚点这一隐含假设。
2026-07-30 14:34:32 +08:00
joywayer and Claude Opus 5
eaba54ea76
feat(ai): Boss 图共享片段 + 竞技场锚点 + AiSignal.Engaged
...
BossFragments:阶段过渡 / 逼近选招 / 移动到锚点三个静态建态片段。
ApproachAttackEngagement 的建态逻辑提为 internal static Declare(态名参数化),
模块路径与 Boss 图路径共用同一份行为,Boss 可建多组(地面组/空中组)。
锚点坐标经 IBossControl.AnchorAt / DistanceToAnchor 暴露,不走黑板——
EnemyAiBrain._context 是私有的(BossBase 无从写入),且 ResetScratch 会清黑板
带来隐式时序约束。锚点本就是 Boss 专属知识,归 Boss facet 更直。
锚点漏配 / 下标越界显式抛,不回退到自身位置。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-30 14:32:32 +08:00
joywayer and Claude Opus 5
8c56d207bd
feat(enemy): EnemyAbilitySO 补设计备注,命名前缀对齐规范
...
+ designNote(目标体量下能力数量大,设计意图需就近记录)。
fileName 由 EAB_ 改为 ABL_——AssetFolderSpec 第 298 行、两个向导
以及 PlayClipAbilitySO 等子类都用 ABL_,此前只有基类是 EAB_。
顺带清掉 abilityId 注释里的旧插件残留字样。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-30 14:23:41 +08:00
joywayer and Claude Opus 5
c05583a365
feat(animation): 敌人侧动画事件补接无敌帧与反馈四件
...
EnableIFrame/DisableIFrame → HurtBox.SetInvincible(与玩家侧同形态,
无敌时长由动画时间轴上两事件间距表达);TriggerFeedback/PlaySFX →
IFeedbackPlayer,用于音效预警。此前敌人侧只接了 7/20 个事件类型。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-30 14:20:47 +08:00
joywayer
5cc93483d3
feat(combat): HurtBox 自带受击伤害倍率
...
倍率归 HurtBox 自己(弱点部位就是一个倍率 > 1 的 HurtBox),
取代 WeakPointSystem 那份写进私有字段却零调用者的倍率——
其注释称由 BossStats 调用,而项目里根本没有 BossStats 类型。
倍率 1 时数值原样返回而非"乘完再钳最低 1":本改动先于任何消费者落地,
若默认路径引入钳制会静默改变游戏里每一次伤害计算。
测试用 ApplyDamageMultiplier(0)==0 守住这条——10 在两种实现下都得 10,
只有 0 能把二者区分开。变异验证:去掉该捷径后恰好该断言变红。
2026-07-30 14:15:12 +08:00
joywayer
5046125acb
docs(enemy): 执行须知第 5 条——RequireComponent 指向抽象类型时 AddComponent 返回 null
...
HurtBox 标了 [RequireComponent(typeof(Collider2D))],Collider2D 是抽象类,
Unity 无法自动补齐,AddComponent<HurtBox>() 返回真 null。建测试对象须先挂
具体碰撞体。Task 6 实测证实;HurtBoxEditor.cs:97 早有同样注释,说明这个坑
项目里踩过但没写进规范。
2026-07-30 14:04:42 +08:00
joywayer
c577d6baa6
docs(enemy): Task 16 的行为树残留清理已在 Task 5 顺带完成
2026-07-30 13:52:47 +08:00
joywayer
50f505279d
feat(enemy): BossPhaseAbilityGate——阶段即换招池
...
按阶段启停能力组件,被禁用的招经 CanUse 自动退出选招候选,
阶段门不需要碰选招器。取代 BossSkillSO.availablePhaseIndices。
EnterPhase 先换池后广播;OnSpawn 回阶段 0(对象池复用)。
2026-07-30 13:50:34 +08:00
joywayer
24c612930e
docs(enemy): 记录 EditMode 不触发 Awake 的坑,并分派两处越界发现
...
执行须知第 4 条:EditMode 下 AddComponent 不调用 Awake(Task 4 实测证实)。
后果是 EnemyAbilityBase._enemy 留空使 CanUse 恒假——依赖它的断言在修复前
也会通过,成为永远不会失败的测试。做法是给测试子类加 RunAwake() 显式触发,
不要反射直写字段。
Task 5 追加:IAttackCandidate 的 CanUse 注释补上 enabled 这一维。
Task 21 追加:EnemyQuotaManager._maxActiveBehaviorTrees 改名须带
FormerlySerializedAs,否则丢场景配置值。
2026-07-30 13:30:44 +08:00
joywayer
64d2087adc
fix(enemy): 禁用的能力组件不再报告可用
...
CanUse 纳入 enabled。此前禁用组件仍返回 true,选招器会选中一个
StartCoroutine 必然失败的招。这也是阶段门(按阶段启停能力)的前提。
2026-07-30 13:28:23 +08:00
joywayer
d8d99dd1ce
docs(enemy): 计划补三条实测坑与两处修正
...
执行须知新增:EnemyBase.Abilities 属性遮蔽同名命名空间(成员访问位置须写全名,
Task 16/17 会再遇到);unity_get_compilation_errors 在编译成功时不报警告,
'0 warnings' 是上报口径而非真值;MCP 测试运行器忽略过滤参数。
Task 5:选招器防重复的重置移出 BossBase.OnSpawn(Task 3 审查确认应归
EnemyBase.OnSpawn 以覆盖全部池化敌人)。
Task 21:残留扫描的预期由「无命中」改为「BD_/行为树 仍有约 20 处待清」。
2026-07-30 13:02:52 +08:00
joywayer and Claude Opus 5
0a92d21ce1
fix(enemy): 应用 Task 3 代码审查意见
...
补上池化路径的防重复记忆重置——ResetRepeatMemory 此前文档承诺了
「对象池复用时清除」却无任何调用点,而它要取代的 BossBase.LastUsedSkillId
恰好在 OnSpawn 里有重置。放 EnemyBase.OnSpawn 以覆盖全部池化敌人。
折扣系数改为每次选招前刷新,与 attackSelectionMode 的读取时机对齐——
此前策划在播放模式下调系数无效、调模式却立即生效,容易误判为功能没生效。
默认值收敛为 EnemyAttackSelector.DefaultAntiRepeatFactor 单一常量。
测试:IneligiblePrevious 用例改用系数 0.5——原先用 0 时,把折扣错写在
eligibility 归零之前也照样通过,是个永远不会失败的测试;统计用例边界由
7σ 收紧到 5σ 使其真正验证该系数;补 ResetRepeatMemory 的确定性用例、
系数 1.0 无惩罚、三候选三条。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-30 13:00:28 +08:00
joywayer and Claude Opus 5
eb3f4888a4
feat(enemy): 选招器支持防重复折扣——WeightedRandomAntiRepeat
...
上一次选中的招按 EnemyStatsSO.attackAntiRepeatFactor 折扣权重(默认 0.3)。
折扣把唯一候选压到 0 时退化为 Priority 路径,不会出现敌人永不出手。
阶段切换清空防重复记忆。取代 BossBase.UseBossSkillWeighted 里的同名逻辑。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-30 12:43:01 +08:00
joywayer
b0fd040904
docs(enemy): 按 Task 1+2 审查结论修订 spec 与计划
...
spec:ResourceFull 由「无组件时恒 false」改为显式抛,与 Boss facet、AnchorAt
统一为「依赖组件缺失一律抛,不返默认值」。
计划:Task 16 补上 BossBase 残余三处行为树残留的清理项(含运行时告警字符串);
Task 19 记录 Patterns/ 是零外部引用的独立程序集,可整目录删。
2026-07-30 12:32:43 +08:00
joywayer and Claude Opus 5
2a1ada4388
fix(ai): 应用 Task 1+2 代码审查意见
...
ResourceFull 未挂 BossResource 时改为显式抛——原先静默返回 false,
是 CLAUDE.md 第 6 条禁止的下游兜底,且与紧邻的 Boss facet 行为不一致。
FakeBossControl.DistanceToAnchor 不再忽略 index。测试改用 TearDown 清理
(本项目关闭了 Domain/Scene Reload,失败断言会把物体永久留在打开的场景里)。
BeginPhaseTransition 去掉死的默认参数;接口补充重入契约说明。
顺带去重:FakeAiContext 实现 IEnemyActor,删除两个测试内的本地 Ctx 副本
——一个接口成员改动要同步三份是复发性成本。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-30 12:31:39 +08:00
joywayer and Claude Opus 5
3665504a58
feat(ai): 新增 IBossControl facet——Boss 阶段状态经 IAiContext 供图读取
...
非 Boss 敌人访问 IAiContext.Boss 显式抛 InvalidOperationException,
不返回空对象掩盖小怪图误挂 Boss 边的错误。BossResource 补 IsFull 供图条件边判定。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-30 12:15:54 +08:00
joywayer
5839b423ae
docs(enemy): Boss AI 双轨统一实施计划——21 个任务,分两阶段
...
阶段一 Task 1-15 只加不删(每 Task 编译通过、测试全绿,末尾嘲风能用新轨打起来);
阶段二 Task 16-21 删旧轨(先改引用方,再删被引用类型;先删资产,再删脚本)。
编写期核查坐实并更正 spec 两处:
- 取消 EnemyBase.SetInvincible(float):HurtBox.SetInvincible(bool) 已存在,
玩家侧 EnableIFrame/DisableIFrame 就走它,无敌时长由动画上两事件间距表达。
新增件由六件减为五件。
- 竞技场锚点改挂 IBossControl,不走黑板:EnemyAiBrain._context 是私有字段
且无公开访问器(BossBase 无从写入),且 ResetScratch 会清黑板带来隐式时序约束。
另确认 EditorScaffoldUtils.CreateSOAsset(Type,...) 重载已存在,无需新增辅助。
2026-07-30 11:01:46 +08:00
joywayer
c176423103
docs(enemy): Boss AI 双轨统一设计——决策层与执行层一并归并到小怪轨
...
竞品调研 + 代码现状核查后推翻 2026-07-27 §5 的「执行层按复杂度分层」:
Boss 侧那层富编排从未真正存在(0 个 AttackPatternSO/SkillSequenceSO 资产、
5 个 BossSkillSO 除 skillId/weight 外全空、执行器跑一遍纯空转、
UseBossSkillWeighted 零调用者、预制体上无 EnemyAiBrain)。
决策:
- 决策层单轨 —— 每 Boss 一个 AiScript 定制类,不建 Boss 骨架/配方
- 执行层单轨 —— Boss 招走 EnemyAbilitySO + EnemyAttackSO,编排权威=动画时间轴
- 阶段=换招池 —— BossPhaseAbilityGate 按阶段启停能力组件
- 选招策略是可换小构件 —— AttackSelectionMode 加防重复值,不抽策略接口
- 旧 Boss 轨退役 9 脚本 + 5 资产,判据「有更优替代才删」
同时记录 WeakPointSystem.GetDamageMultiplier 零调用者、
BossBase.HandleParrySuccess 订阅全局弹反频道导致的误伤 bug、
敌人侧动画事件只接了 7/20 三处历史遗漏,以及两条脚手架创建链路
(CharacterWizardWindow / SceneObjectPlacerTool.PlaceChaoFeng)必须同改。
2026-07-30 10:29:49 +08:00
joywayer
aaca138774
fix(editor): EnemyAiBrain 检视器支持多选——mixed 值不再误写,违规对象逐个点名
2026-07-30 08:46:41 +08:00
joywayer
b36ac96ac7
feat(editor): EnemyAiBrain 检视器——二选一不变量提前到编辑期,定义 id 改下拉
2026-07-30 08:38:13 +08:00
joywayer
afcc0b10ee
fix(enemy): 配方校验改用一次性 builder 探测,不再干扰共享图缓存
2026-07-30 08:33:53 +08:00
joywayer
da217af113
feat(enemy): AI 配方接入 SO 校验——漏配/歧义/零冷却 Committed 在编辑期与构建期报错
2026-07-29 17:20:12 +08:00
joywayer
6df4a259b7
docs(enemy): 修正作者指南与两处注释残留的死亡层表述
2026-07-29 16:34:21 +08:00
joywayer
db6f6c5f77
docs(enemy): 新增敌人 AI 作者指南(三条路径 + 模块清单 + 六个范例 + 陷阱)
2026-07-29 15:57:23 +08:00
joywayer
44412adfc7
refactor(enemy): E001 AI 迁移为配方资产,退役定制脚本
...
用 EnemyAiRecipeWizard 建 ENM_E001_Ai.asset,配置未发现层
DisguiseThenPatrol + 交战层 RushEngagement(e001_chase, Committed);
TestRoomA 场景 EnemyAiBrain 改绑 _recipe,_definitionId 清空;
删除 E001CaoZhiAi.cs;SceneObjectPlacerTool 的 E001 挂载分支与其余
AI(BrainGraph) 提示文案统一改为指向配方向导路径。
2026-07-29 15:38:44 +08:00
joywayer
ecdb0040cb
feat(editor): 敌人 AI 配方脚手架向导;AssignModules 改名并失效缓存
...
- AiRecipeSO 新增 protected InvalidateGraph(),子类装配模块后调用以丢弃缓存图,
避免改动要等到下次进 Play 才生效的静默陈旧图问题。
- PerceptionRecipeSO.SetModulesForTests 改名为 AssignModules(向导也要用它装配模块,
旧名字具有误导性),并在装配后调用 InvalidateGraph。
- 新增 EnemyAiRecipeWizard:按 AssetFolderSpec 定名定路径创建感知型 AI 配方资产
(Assets/_Game/Data/Enemies/{EnemyID}/ENM_{EnemyID}_Ai.asset),已存在则选中不覆盖。
- PerceptionRecipeSoTests 同步改名调用点,并新增测试钉住"装配后缓存必须失效"契约。
2026-07-29 15:28:25 +08:00
joywayer
426fa3601d
fix(enemy): EnemyAiBrain 配置守卫不随重新启用蒸发,注册表消重
2026-07-29 15:23:49 +08:00
joywayer
57cbaacf2c
feat(enemy): EnemyAiBrain 支持配方资产/AiScript id 二选一解析
2026-07-29 14:56:54 +08:00
joywayer and Claude Opus 5
c76eba8a0e
docs(enemy): T15 并入 T13 审查遗留——AssignModules 改名 + InvalidateGraph
...
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-29 14:53:54 +08:00
joywayer and Claude Opus 5
6540560c13
docs(enemy): 计划同步——未配置配方应显式报错,而非"默认必须可建图"
...
T13 执行中发现原稿的 DefaultModules_ProduceValidGraph 断言了一条不成立的契约:
建资产到配好模块之间没有任何东西会调 GetOrBuildGraph(),它只在
EnemyAiBrain.Start() 运行时被调,所以"新建资产即报错"的场景不存在。
按该断言把默认改成零配置可建图的模块,会把"必然响亮报错"换成
"建图成功但敌人永不出手、零报错"——方向与第 6 条相反。改为钉相反契约。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-29 14:48:19 +08:00
joywayer
825cae7977
feat(enemy): PerceptionRecipeSO 配方资产 + SubclassSelector 模块下拉
...
未发现层/交战层各用 [SerializeReference]+[SubclassSelector] 下拉挑选模块,
新增模块类自动出现在下拉里,无需改枚举或已有文件。默认交战模块仍为
RushEngagement——未配能力时建图必须显式报错,而非静默产出打不出手的图。
2026-07-29 14:46:41 +08:00
joywayer and Claude Opus 5
04f644969b
fix(ai): AiRecipeSO.OnEnable 改 protected virtual,防子类静默遮蔽
...
留作 private 时,子类另写一个 OnEnable 会遮蔽它(Unity 只调最派生的),
PlayModeResetHook 注册从此不发生且零报错——关闭域重载下即表现为
"改了配方进 Play 仍跑旧图"。T13 的 PerceptionRecipeSO 是第一个子类,
在它出现前先堵住。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-29 14:36:22 +08:00
joywayer
6d8db95046
feat(ai): IAiDefinition + AiRecipeSO 配方基类(含关闭域重载的缓存重置)
2026-07-29 14:32:45 +08:00
joywayer
7327a5fe09
refactor(enemy): 退役 PerceptionStateMachine,E001 切换到两层模块组装
2026-07-29 14:24:48 +08:00
joywayer
9dc10e0398
test(enemy): 补测骨架 × 另两个模块的组合,以及入口覆盖契约
2026-07-29 14:21:36 +08:00
joywayer
bf8101b3f5
feat(enemy): PerceptionSkeleton——两层可插拔的感知骨架,自声明死亡终态
2026-07-29 14:10:46 +08:00
joywayer
faa210c789
revert(enemy): 收掉死亡层——死亡归物理层,AI 只需一个终态
2026-07-29 14:02:13 +08:00
joywayer and Claude Opus 5
6a885ec105
docs(enemy): 计划同步取消死亡层——T9 作废、新增 T9R,T10/T11/T13 去掉 death 参数
...
T9 原稿折叠保留作历史记录,附必然卡死的机制说明。
PerceptionSkeleton.Add 由三参收为两参并自声明 Death 终态;
PerceptionRecipeSO 去掉死亡层字段。T5 段落保持原样(它记录的是已发生的事实,
IDeathModule 由 T9R 删除)。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-29 13:59:54 +08:00
joywayer and Claude Opus 5
023a4a4ec6
docs(enemy): 取消死亡层——死亡归物理层,四层收为三层
...
T9 质量审查发现 TwoStageDeath 在真实运行中必然卡死:PerformDeath 先
ForceState(Dead) 再 Send(Died),IsControllable 此后永久为假,AiRuntime
的让位门使死亡链里的条件边永不被求值。追根后确认整层放错位置——
死亡完全归物理层(PerformDeath/EnemyDeathSequence/EnemySpawnerOnEvent),
AI 图只需要一个终态让全局 Died 边有去处。
初稿做成一层的由来:旧 Config 的 DeathAbilityId 字段,而其唯一使用者
E001 留空并注明"演出走物理状态机"。投机字段被放大成了三模块的层。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-29 13:54:40 +08:00