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
joywayer
5a9c1fd569
chore(enemy): 补齐死亡层模块的 .meta 文件
2026-07-29 13:46:45 +08:00
joywayer
3bc7eb1855
feat(enemy): 死亡层三模块(终态/单段/两段)
2026-07-29 13:46:20 +08:00
joywayer
3d00c66677
test(enemy): 补测 Attack 单出边的自愈路径,写明边序依赖的射程前提
...
Approach 边序注释:attackInRange 先于 leftAllZones 的前提是攻击射程恒小于
感知区(EnemyAttackSelector.Eligible 的 InAttackRange 门),故两条件不会相争;
若未来出现射程更大的招式,应由 AI 配方校验器报错,而非靠调边序绕开。
FakeCombat 新增 BestAttackFails 开关(与 Eligible 解耦),补测 Attack 唯一出边
attackDone 的自愈不变量:UseBestAttack 触发失败时不留下运行中能力,下一帧即可
自愈回 Approach,不会永久卡死。
2026-07-29 13:08:46 +08:00
joywayer
9d632cd103
fix(enemy): 退回 Approach 边序——脱战优先属假件失真,改由测试贴合真实射程语义
...
HasEligibleAttack() 只看攻击射程圆(远小于追击/视野区),脱离全部感知区在真实系统里
必然已脱离攻击射程,原顺序(attackInRange 先于 leftAllZones)本就正确。
FakeCombat.Eligible 是裸字段不会随 Chase/Vision 联动,才让上一版看似需要调边序。
改法:边序退回原样,测试里玩家离开感知区时手工同步清 Eligible,贴合真实耦合关系。
2026-07-29 12:59:07 +08:00
joywayer
a700bef352
feat(enemy): ApproachAttackEngagement——攻击改为起手即打完,不中途收招
...
寻路逼近↔到射程选招攻击的交战模块。招式射程/冷却/权重归 EnemyAttackSelector,
本模块只决定何时逼近、何时出手。
有意的行为变更:Attack 态去掉 leftAllZones 边,玩家在前摇中跑出感知区不再
中途打断招式,招式完整打完后经 Approach 自然脱战。
2026-07-29 12:53:49 +08:00
joywayer
5771ac414e
test(enemy): 补测 Committed 冲锋的防抖动闭环,RushExit 写明冷却前提
2026-07-29 12:45:43 +08:00
joywayer and Claude Opus 5
d013fe8e2e
docs(enemy): 写明 RushExit.Committed 防抖动的前提是能力 cooldown > 0
...
质量审查发现:Committed 的冷却门若遇上 cooldown==0 的能力,
CanUseAbility 结束下一帧即恢复,Rush↔Rest 每帧抖动照旧出现。
这属能力侧配置错误,不在模块内兜底,纳入 AiDefinitionValidator 校验项。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-29 12:41:09 +08:00
joywayer
bb1e2f7705
feat(enemy): RushEngagement——两个耦合 flag 合并为 RushExit 语义枚举
2026-07-29 12:32:50 +08:00
joywayer and Claude Opus 5
1c6ce57648
test(enemy): 修正测试名——该用例只验证空 Link 不加边,不涉及单向不可逆
...
原名 DisguiseThenPatrol_HasNoInternalEdges_DisguiseIsOneWay 承诺了
"伪装态不可逆",但那需要骨架的升级边才能验证(T10 覆盖)。
此用例实际只证明 Link 为空时状态不会自行跑掉,按实测内容改名。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-29 12:26:42 +08:00
joywayer
acfba66c5d
feat(enemy): 未发现层三模块(单一态/单向降级/定时交替)
2026-07-29 12:19:26 +08:00
joywayer
894ae99984
test(ai): 补测经 AiStateFragments 的跨模块状态撞名,State() 补引导注释
2026-07-29 12:11:07 +08:00
joywayer
80fdc36762
feat(ai): BrainBuilder.DeclareState——重复声明状态即报错,防模块间同名静默覆盖
...
State() 仍保持宽松(有则取),用于给已声明的态挂边;DeclareState() 只用于
首次声明行为,重复声明同名状态会抛异常。AiStateFragments 的四个建态原语
(Locomotion/Ability/AbilityOnce/Terminal)改用 DeclareState。同时给
IEngagementModule/IDeathModule/IUnawareModule 补充不变量说明。
2026-07-29 12:01:19 +08:00
joywayer and Claude Opus 5
5dcbce6019
docs(enemy): 计划新增 T5b——BrainBuilder.DeclareState 防模块间状态名冲突
...
契约质量审查提出:模块化后 State() 的"有则取"语义使两个独立模块
取同名状态时后者静默覆盖前者回调。与 T1 的 RequireState 是同一类
失败的两面,趁 0 个模块实现时补代价最低。附带补充交战/死亡层
"为何单阶段 Build 足够"的不变量说明。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-29 11:57:57 +08:00
joywayer
17e71dac39
feat(enemy): 未发现层/交战层/死亡层三个模块契约
2026-07-29 11:47:29 +08:00
joywayer and Claude Opus 5
2643f58b08
docs(enemy): 计划同步——AiStateFragments 空能力 id 改建图期报错
...
原稿沿用旧代码的静默跳过写法。AiStateFragments 成为公开原语后,
定制 AiScript 漏配 id 会产出"存在但什么都不做"的状态且无报错,
与 T1 引入 BrainBuilder.RequireState 的理由是同一类失败,不应双标。
校验放建图期而非每帧回调,兼顾快速失败与热路径开销。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-29 11:43:15 +08:00
joywayer
68f615e9c1
fix(enemy): AiStateFragments 空能力 id 建图期报错,补 OnExit 收尾测试
...
Ability/AbilityOnce 建图期校验 abilityId 非空,与 BrainBuilder.RequireState
同一类"漏配即快速失败"约束保持一致,避免定制 AiScript 漏配 id 时产出静默
不作为的状态。同时补 4 个测试:Locomotion/Ability 的 OnExit 收尾行为,以及
两个原语对空 id 的报错行为。
2026-07-29 11:42:47 +08:00
joywayer
77a32cbf8a
feat(enemy): AiStateFragments 建态原语,新增 AbilityOnce 修死亡态重触发隐患
...
从 PerceptionStateMachine 的 private static 辅助方法提升为公开原语,供后续
模块化重构(骨架+可插拔模块)与定制 AiScript 复用。新增 AbilityOnce:
只在进入时触发能力、不每帧重触发,修复用 Ability() 驱动死亡态时演出播完
被 Tick 无限重播的隐患(现有 PerceptionStateMachine 因 E001 死亡能力 id
为空未暴露,本次不改它,留待 T11 整体退役)。
2026-07-29 11:35:47 +08:00
joywayer
084354fa6c
test(enemy): AbilityRef 补测资产已挂但 abilityId 为空的误配路径
2026-07-29 11:29:47 +08:00
joywayer
474e89de3a
feat(enemy): AbilityRef——AI 层能力引用资产化,字符串仅作定制脚本兜底
2026-07-29 11:22:15 +08:00
joywayer
fd238b71f1
refactor(ai): AiSignal 8→1,删除零发送方零消费方的死枚举
2026-07-29 11:14:29 +08:00
joywayer
e76d6bc118
feat(ai): BrainBuilder.RequireState——未声明状态挂边时构建期报错
2026-07-29 11:08:23 +08:00
joywayer and Claude Opus 5
8d63525b12
chore(scene): TestRoomA 敌人感知槽改 Box 型并配尺寸,微调物体位置
...
aggro/los 两个感知槽由点/圆改为 Box(type 7),offset y=0.31,
分别配 8.1x1.38 / 11.65x1.38;顺带清掉随 NavDriving 死代码移除的序列化残留字段。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-29 11:05:15 +08:00
joywayer and Claude Opus 5
f3c17de223
docs(enemy): 敌人 AI 组合式模块架构实施计划(17 个任务,TDD)
...
含计划阶段发现的三处修正:
- 未发现层拆 Declare/Link 两阶段,保证骨架升级边优先于内部计时边;
- 模块参数校验与委托缓存移出构造函数([SerializeReference] 不保证走 ctor);
- 新增 AiStateFragments.AbilityOnce,修死亡态演出被 Tick 无限重播的隐患。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-29 10:51:07 +08:00
joywayer and Claude Opus 5
e59e24cca0
docs(enemy): 修正 AI 配方解析方式——直接引用替代注册表双源
...
实施计划阶段发现两处硬阻塞:
1. BaseGames.AI 只引用 BaseGames.Core,无法收集依赖 Enemies 的 AiRecipeSO;
2. 项目 database SO 走 [SerializeField] 直接引用而非 Addressables,静态注册表取不到。
改为 EnemyAiBrain 上 _recipe 资产引用 / _definitionId 脚本 id 二选一。
净减 AiRecipeDatabaseSO、Addressables 加载、AddressKeys 改动、asmdef 改动;
flyweight 与配方路径零字符串 id 均保持。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-29 10:38:07 +08:00
joywayer and Claude Opus 5
1c32d8c87e
docs(enemy): 敌人 AI 组合式模块架构设计(替换 PerceptionStateMachine)
...
四层架构:固定感知骨架 + 可插拔的 未发现层/交战层/死亡层;
两种定义源:PerceptionRecipeSO 配方资产(约 95% 敌人零代码)+ AiScript 定制脚本;
消除 Config 开关面板(EngagementStyle/PatrolBetweenChases → RushExit 语义枚举);
能力引用资产化(AbilityRef);AiSignal 8→1 清理死枚举。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-29 10:20:22 +08:00
joywayer
c4e80afe9e
chore(enemy): 清除随寻路库失效的 NavDriving 死代码与两处过时注释
...
NavDriving 原由已删除的寻路适配层设置,现无人写入(全项目 C# 零引用),
连同其调试字段一并移除;场景/预制体里的序列化残值由 Unity 下次保存自动丢弃。
2026-07-28 13:28:52 +08:00
joywayer and Claude Opus 5
d46ba67385
merge: 移除第三方 2D 寻路库,敌人导航改为直接移动方案
...
核心洞察:可达性由 EnemyMovement 的墙/悬崖夹紧天然表达——走过去、被夹停就是边界,
无需重建任何图/段结构。'agent 脱离导航段导致寻路全面静默失效'这一整类问题随之消失。
- IPathAgent(20+成员) → IEnemyNavigator(7成员);GroundNavigator/FlyingNavigator/NullEnemyNavigator
- 三处重复的卡死检测收敛为 StallDetector;修复 Pace 持续受阻无法掉头的死锁
- 修复 Wander 挑点失败退化为永久播 Idle 的缺陷
- 删除寻路库整包(112脚本/21069行)及对其源码的 4 处项目改动
- 脚手架/编辑器面板/Boss 预制体同步清理
净变化:删约 21500 行,加约 350 行。
验证:编译 0 错误;EditMode 206/206;PlayMode 无寻路库环境下三种巡逻+追击实测通过。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-28 13:20:05 +08:00
joywayer
a220b5c0d8
删除多余
2026-07-28 13:18:41 +08:00
joywayer
02ea0bb576
docs(enemy): 标注脱图脱困设计已作废(被移除寻路库方案取代,未实施)
2026-07-28 13:03:54 +08:00
joywayer
878e2c12cc
chore(enemy): Boss 预制体移除随寻路库失效的 3 个导航组件(Boss 本就不使用导航)
2026-07-28 13:02:52 +08:00
joywayer
7934513b05
chore: 删除第三方 2D 寻路库整包(112 脚本/21069 行,含 4 处对其源码的项目改动)
...
敌人导航已改为 GroundNavigator/FlyingNavigator 直接移动方案:
可达性由 EnemyMovement 的墙/悬崖夹紧天然决定,不再需要烘焙导航图,
'agent 脱离导航段导致寻路全面静默失效'这一整类问题随之消失。
2026-07-28 11:50:33 +08:00
joywayer
3c622a69f2
refactor(enemy): NavLinkType 迁入 INavLinkHandler 并改述为能力驱动的地形穿越;补交新脚本 .meta
2026-07-28 11:50:17 +08:00
joywayer
4455062ee9
refactor(editor): 脚手架改用 GroundNavigator,移除寻路库引用与导航面放置工具
2026-07-28 11:45:24 +08:00
joywayer
219fe46719
fix(enemy): GroundNavigator 停止改为直写移动输入,消除与 EnemyBase.StopMovement 的无限递归(栈溢出)
2026-07-28 11:39:25 +08:00
joywayer
de3c9deff4
refactor(enemy): 消费者切换到 IEnemyNavigator(Wander/Waypoints 去导航图化,调试面板简化)
2026-07-28 11:25:21 +08:00
joywayer
49627d357d
refactor(enemy): FlyingDirectNavigator 改名 FlyingNavigator 并切换到 IEnemyNavigator
2026-07-28 11:17:34 +08:00
joywayer
c041712e99
fix(test): 到达边界用例改用二进制可精确表示的值(1.25/0.25),避免浮点噪声误判
2026-07-28 11:15:16 +08:00
joywayer
668bc3500e
feat(enemy): 新增 GroundNavigator 地面直接移动导航(+7 纯函数单测)
...
补充 EditMode 测试程序集对 BaseGames.Enemies.Navigation 的引用(此前缺失,新测试无法编译)
2026-07-28 11:12:11 +08:00
joywayer
2174e42ce0
feat(enemy): 新增 IEnemyNavigator 瘦身导航接口(7 成员)与 NullEnemyNavigator
2026-07-28 11:07:53 +08:00
joywayer
8ea919a7f1
chore(enemy): 补交 StallDetector 与其测试的 .meta
2026-07-28 11:07:06 +08:00
joywayer
c929b5efb7
refactor(enemy): 三处卡死检测收敛为 StallDetector;修复 Pace 持续受阻时无法掉头的死锁
2026-07-28 11:04:18 +08:00
joywayer
5cfacf199a
feat(enemy): 新增 StallDetector 推进停滞检测(+8 单测),为收敛三处重复实现做准备
2026-07-28 11:01:01 +08:00
joywayer
d9ec0a4f6e
docs(enemy): 移除寻路库实现计划(10任务/6阶段,TDD+编译门+回归门+PlayMode验收)
2026-07-28 10:53:21 +08:00
joywayer
d74a2b6646
docs(enemy): 移除寻路库后的敌人导航框架设计(IEnemyNavigator 瘦身+地面直移+StallDetector 收敛)
2026-07-28 10:41:30 +08:00
joywayer
579499e678
docs(enemy): 脱困改用敌人自身步速(MoveHorizontal/WalkSpeed),移除独立速度参数
2026-07-27 16:45:00 +08:00
joywayer
e7f1633877
docs(enemy): 导航脱图统一脱困设计(含 Wander/Waypoints 静默吞失败与 Pace 边沿翻向两个根因)
2026-07-27 16:31:32 +08:00
joywayer
28cd335f40
chore(enemy): [临时调试] E001 出生即巡逻,用于真机验证中心悬空导致导航失效的问题
...
代码处已留 [临时调试] 标记,验证结束后改回 Entry=Idle_Disguise。
2026-07-27 16:01:03 +08:00
joywayer
47c2ce7e99
fix(enemy): 冲锋禁止以中心悬空姿态收尾(会导致导航映射失败/巡逻失效)
...
新增 EnemyMovement.IsCenterOverGround() 与 RushAbility.SettleRoutine:
冲锋结束时若着地却中心悬在崖外,继续朝原方向推进直到离地(自由落体)或中心重回地面上方;
有时限,超时仍未脱离则告警暴露地形问题(崖沿有墙),不静默留下坏站位。
2026-07-27 15:50:01 +08:00
joywayer
80c0e5c277
revert(enemy): E001 初始态改回 Idle_Disguise(伪装静止),移除临时调试改动
2026-07-27 15:27:15 +08:00
joywayer
e2645b6212
fix(editor): 脚手架提示改为 BrainGraph 指引,清除已废弃的 BehaviorTree/BossSkillSequencer 说法
2026-07-27 15:09:47 +08:00
joywayer and Claude Opus 5
bcc4292076
merge: 冲锋能力(RushAbility) — 锁定终点+可冲下悬崖
...
ContactChaseAbility → RushAbility(文件与类改名,GUID 保留,引用不断):
- 起手动画前锁定玩家 X 与方向(committed 冲锋,可被躲)
- 终点=身体整体越过锁定点(EnemyBase.Body.HasPassed),宽度取自身体几何权威
- 终止:越过锁定点/撞墙(只判墙)/maxDashDuration 超时/净位移卡死
- 冲锋期间经 EnemyMoveInput.AllowLedgeCross 放开悬崖夹紧,可冲下崖不悬停边缘
- 脚手架(SceneObjectPlacerTool/CharacterWizardWindow)同步更新
验证: 编译 0 错误; EditMode 191/191; PlayMode 实测越过锁定点/撞墙终止/
崖边夹紧对比(false=0,true=9)/端到端冲下悬崖并落地。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-27 13:45:13 +08:00
joywayer
4808077fc6
feat(enemy): ContactChaseAbility 改造为 RushAbility(冲锋)
...
- 起手前锁定玩家 X 与方向(committed),终点改为身体整体越过锁定点(Body.HasPassed)
- 终止条件:越过锁定点/撞墙(只判墙)/最大冲刺时长(SO 新增 maxDashDuration)/净位移卡死
- 冲锋期间经 EnemyMoveInput.AllowLedgeCross 放开悬崖夹紧,可冲下崖不悬停边缘
- 类与文件重命名(GUID 保留),脚手架与向导同步更新
2026-07-27 13:38:05 +08:00
joywayer
7cba58919f
feat(editor): 敌人/Boss 放置脚手架绑定 EnemyBase._bodyCollider(身体几何唯一权威)
2026-07-27 13:17:38 +08:00
joywayer and Claude Opus 5
33a52c4531
merge: 角色身体碰撞体唯一权威源(IEnemyBody)
...
EnemyBase 持有 _bodyCollider 并暴露 Body;EnemyMovement 5 处探测与 EdgeSafeMargin
改走权威,删除重复 4 次的碰撞体解析与 GroundColliderOrSelf;
行为等价(两个敌人原本即回落到根碰撞体),EditMode 191/191 + PlayMode 崖边夹紧验证通过。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-27 12:13:10 +08:00
joywayer
9f8d4f21ca
fix(enemy): EnemyMovement 加 RequireComponent(EnemyBase),固化身体权威同物体不变量
2026-07-27 12:13:10 +08:00
joywayer
b1d3c169ec
chore(enemy): 补交 EnemyBody 与其测试的 .meta
2026-07-27 12:07:46 +08:00
joywayer
9a61d3e256
refactor(enemy): 移动层探测与 EdgeSafeMargin 改走 Body 权威,删除重复的碰撞体解析
2026-07-27 11:55:55 +08:00
joywayer
6026911532
feat(enemy): EnemyBase 持有身体几何权威(_bodyCollider + Body),Awake/OnValidate 双重校验
2026-07-27 11:51:45 +08:00
joywayer
b0e1ebfecc
feat(enemy): 新增 IEnemyBody 身体几何权威接口与 EnemyBody 实现(+14 纯函数单测)
2026-07-27 11:48:26 +08:00
joywayer
8a6450910e
docs(enemy): 身体几何权威源实现计划(4任务,TDD+编译门+191测试门+PlayMode等价性验证)
2026-07-27 11:38:34 +08:00
joywayer
3752a9a0e0
docs(enemy): 角色身体碰撞体唯一权威源(IEnemyBody)设计
2026-07-27 11:20:09 +08:00
joywayer and Claude Opus 5
d26872aa6a
merge: 抽取 WeightedPick 加权随机共享原语(消除四处平行实现)
...
小怪选招/Boss 选招/战利品掉落统一到 BaseGames.Core.WeightedPick;
删除零调用的 SelectWeightedSkill 死代码,修 LootResolver 权重重复计算;
冷却与 HitBox 时序经评估否决抽取(理由见决策记录)。
EditMode 177/177 通过。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-27 10:01:14 +08:00
joywayer
86e3637d8e
chore(core): 补交 WeightedPick 与其测试的 .meta
2026-07-27 10:00:59 +08:00
joywayer
cd9acfcde1
docs: 共享底座抽取决策记录(WeightedPick 已抽;冷却/HitBox 窗口否决理由;Boss BrainGraph 路线)
2026-07-27 10:00:05 +08:00
joywayer
1d5214beea
refactor(enemy): Boss 选招与战利品掉落改用 WeightedPick;删除零调用的 SelectWeightedSkill 死代码
2026-07-27 09:58:40 +08:00
joywayer
67220b4bbd
refactor(enemy): 小怪选招改用 WeightedPick 共享原语(权重缓冲复用,零 GC)
2026-07-27 09:55:59 +08:00
joywayer
3d85f65965
feat(core): 新增 WeightedPick 加权随机共享原语(+10 单测),为消除四处平行实现做准备
2026-07-27 09:54:34 +08:00
joywayer and Claude Opus 4.8
c3ab961d3b
merge: 敌人寻路逼近+攻击选择器(ApproachAttack 交战范式)
...
寻路逼近(Approach)↔选招攻击(Attack)两态子机,与冲锋(ChaseAbility)并列;
招式自管圆形射程;WeightedRandom/Priority 两选招模式;
EditMode 167/167 + PlayMode 冒烟验证通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-24 15:12:42 +08:00
joywayer
23de5adf75
fix(enemy): MeleeAttackAbility 空 clip 走 fallbackDuration(判 clip.Clip 而非 clip),兑现 EnemyAttackSO 契约
2026-07-24 15:12:41 +08:00
joywayer
568b6e46c0
chore(enemy): 补交新脚本的 .meta(AbilityCategory/AttackSelectionMode/IAttackCandidate/EnemyAttackSelector+测试)
2026-07-24 14:55:17 +08:00
joywayer
022e4f18d2
fix(enemy): Approach 逼近改用 aggro/视野双刷新的 LastKnown(修 aggro 先命中扑向错误点)+补 Attack 退出测试
2026-07-24 12:47:48 +08:00
joywayer
f77ab71555
feat(enemy): 攻击能力射程 Gizmo(选中可见)+ category==Attack 的 rangeRadius 自检
2026-07-24 12:33:16 +08:00
joywayer
980fe35ae4
docs(enemy): PerceptionStateMachine 类注释补充 ApproachAttack 交战风格
2026-07-24 12:31:31 +08:00
joywayer
6cdd4ef513
feat(enemy): PerceptionStateMachine 增加 ApproachAttack 风格(寻路逼近↔选招攻击)+测试
2026-07-24 12:27:59 +08:00
joywayer
297f9d2968
feat(enemy): IEnemyLocomotion 增加 Pursue 寻路逼近原语(RunSpeed)
2026-07-24 12:23:43 +08:00
joywayer
6fd80cfec9
fix(enemy): BuildAttackSelector 表达式上下文全限定 AbilityCategory(消歧义于 Abilities 属性)
2026-07-24 12:22:35 +08:00
joywayer
702df35efd
feat(enemy): ICombatant 增加 HasEligibleAttack/UseBestAttack + EnemyBase 构建选择器
2026-07-24 12:20:54 +08:00
joywayer
04a267b69f
feat(enemy): EnemyAttackSelector 选招器(射程+冷却+LOS+着地过滤,两模式选招)+单测
2026-07-24 12:15:41 +08:00
joywayer
2cf0d6b1a9
feat(enemy): EnemyAbilityBase 实现 IAttackCandidate 契约(自管圆形射程)
2026-07-24 11:58:22 +08:00
joywayer
25fae97065
feat(enemy): 攻击选招元数据(category/weight/圆形射程)与选招模式入 SO
2026-07-24 11:56:07 +08:00
joywayer
f15f0a6876
docs(enemy): 寻路逼近+攻击选择器实现计划(9任务,TDD选择器+状态机,编译门+Play验证)
2026-07-24 11:50:20 +08:00
joywayer
c33ce55f13
docs(enemy): 寻路逼近+攻击选择器设计(感知管交战/招式自管射程/两选招模式)
2026-07-24 11:21:35 +08:00
joywayer
4a80a11ab5
fix(enemy): 改道到最近可达点时同步防抖记账,避免下次 RequestMoveTo 被误吞
2026-07-23 17:22:11 +08:00