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>
This commit is contained in:
2026-07-30 16:02:14 +08:00
co-authored by Claude Opus 5
parent bdeefca75b
commit 877d2f5fef
13 changed files with 844 additions and 273 deletions
@@ -9,32 +9,29 @@ MonoBehaviour:
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: de92221c7c3fb4a42a7cd122a8f97632, type: 3}
m_Script: {fileID: 11500000, guid: fc81345eb5294d643b4242eac215c5fc, type: 3}
m_Name: ABL_ChaoFeng_Boomerang
m_EditorClassIdentifier:
skillId: boomerang
displayName: Boomerang
designNote:
category: 0
skillType: 0
availablePhaseIndices: 00000000
attackPatterns: []
vulnerabilityWindows: []
interactionTags: 0
sequenceOnHit: {fileID: 0}
sequenceOnMiss: {fileID: 0}
counterResponses: []
arenaEvents: []
resourceCost:
resourceId:
cost: 0
minRequired: 0
buildsRage: 0
poiseWindow:
Level: 0
NormalizedStart: 0
NormalizedEnd: 0
skillAnimation:
abilityId: boomerang
designNote: "\u9636\u6BB5 0 \u62DB\u5F0F\uFF1B\u9636\u6BB5\u53EF\u7528\u6027\u7531
BossPhaseAbilityGate \u914D\u7F6E"
attackSequence: []
cooldown: 4
telegraphVfxKey:
telegraphDuration: 0
interruptOnHurt: 1
interruptOnStagger: 1
preferredMinRange: 0
preferredMaxRange: 5
requiresLineOfSight: 1
requiresGrounded: 1
exclusionGroup:
priority: 0
category: 1
weight: 1
rangeRadius: 9
rangeOffset: {x: 0, y: 0}
clip:
_FadeDuration: 0.25
_Speed: 1
_Events:
@@ -43,8 +40,6 @@ MonoBehaviour:
_Names: []
_Clip: {fileID: 0}
_NormalizedStartTime: NaN
cooldown: 0
weight: 1
references:
version: 2
RefIds: []
@@ -9,42 +9,25 @@ MonoBehaviour:
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: de92221c7c3fb4a42a7cd122a8f97632, type: 3}
m_Script: {fileID: 11500000, guid: 9050afa76362dff469c64fbb48c9ff8d, type: 3}
m_Name: ABL_ChaoFeng_FanCombo
m_EditorClassIdentifier:
skillId: fan_combo
displayName: FanCombo
designNote:
category: 0
skillType: 0
availablePhaseIndices: 00000000
attackPatterns: []
vulnerabilityWindows: []
interactionTags: 0
sequenceOnHit: {fileID: 0}
sequenceOnMiss: {fileID: 0}
counterResponses: []
arenaEvents: []
resourceCost:
resourceId:
cost: 0
minRequired: 0
buildsRage: 0
poiseWindow:
Level: 0
NormalizedStart: 0
NormalizedEnd: 0
skillAnimation:
_FadeDuration: 0.25
_Speed: 1
_Events:
_NormalizedTimes: []
_Callbacks: []
_Names: []
_Clip: {fileID: 0}
_NormalizedStartTime: NaN
cooldown: 0
abilityId: fan_combo
designNote: "\u9636\u6BB5 0 \u62DB\u5F0F\uFF1B\u9636\u6BB5\u53EF\u7528\u6027\u7531
BossPhaseAbilityGate \u914D\u7F6E"
attackSequence: []
cooldown: 2.5
telegraphVfxKey:
telegraphDuration: 0
interruptOnHurt: 1
interruptOnStagger: 1
preferredMinRange: 0
preferredMaxRange: 5
requiresLineOfSight: 1
requiresGrounded: 1
exclusionGroup:
priority: 0
category: 1
weight: 1.5
references:
version: 2
RefIds: []
rangeRadius: 2.5
rangeOffset: {x: 0, y: 0}
@@ -0,0 +1,44 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fc81345eb5294d643b4242eac215c5fc, type: 3}
m_Name: ABL_ChaoFeng_Intro
m_EditorClassIdentifier:
abilityId: chaofeng_intro
designNote: "\u5165\u573A\u6F14\u51FA\uFF0C\u4E0D\u8FDB\u9009\u62DB\u6C60"
attackSequence: []
cooldown: 0
telegraphVfxKey:
telegraphDuration: 0
interruptOnHurt: 1
interruptOnStagger: 1
preferredMinRange: 0
preferredMaxRange: 5
requiresLineOfSight: 1
requiresGrounded: 1
exclusionGroup:
priority: 0
category: 0
weight: 0
rangeRadius: 0
rangeOffset: {x: 0, y: 0}
clip:
_FadeDuration: 0.25
_Speed: 1
_Events:
_NormalizedTimes: []
_Callbacks: []
_Names: []
_Clip: {fileID: 0}
_NormalizedStartTime: NaN
references:
version: 2
RefIds: []
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: eddeb2d9e64934d4eab9acf5efd8902e
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -9,32 +9,29 @@ MonoBehaviour:
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: de92221c7c3fb4a42a7cd122a8f97632, type: 3}
m_Script: {fileID: 11500000, guid: fc81345eb5294d643b4242eac215c5fc, type: 3}
m_Name: ABL_ChaoFeng_TornadoLarge
m_EditorClassIdentifier:
skillId: tornado_large
displayName: TornadoLarge
designNote:
category: 0
skillType: 0
availablePhaseIndices: 00000000
attackPatterns: []
vulnerabilityWindows: []
interactionTags: 0
sequenceOnHit: {fileID: 0}
sequenceOnMiss: {fileID: 0}
counterResponses: []
arenaEvents: []
resourceCost:
resourceId:
cost: 0
minRequired: 0
buildsRage: 0
poiseWindow:
Level: 0
NormalizedStart: 0
NormalizedEnd: 0
skillAnimation:
abilityId: tornado_large
designNote: "\u9636\u6BB5 0 \u62DB\u5F0F\uFF1B\u9636\u6BB5\u53EF\u7528\u6027\u7531
BossPhaseAbilityGate \u914D\u7F6E"
attackSequence: []
cooldown: 6
telegraphVfxKey:
telegraphDuration: 0
interruptOnHurt: 1
interruptOnStagger: 1
preferredMinRange: 0
preferredMaxRange: 5
requiresLineOfSight: 1
requiresGrounded: 1
exclusionGroup:
priority: 0
category: 1
weight: 0.8
rangeRadius: 12
rangeOffset: {x: 0, y: 0}
clip:
_FadeDuration: 0.25
_Speed: 1
_Events:
@@ -43,8 +40,6 @@ MonoBehaviour:
_Names: []
_Clip: {fileID: 0}
_NormalizedStartTime: NaN
cooldown: 0
weight: 0.8
references:
version: 2
RefIds: []
@@ -9,32 +9,29 @@ MonoBehaviour:
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: de92221c7c3fb4a42a7cd122a8f97632, type: 3}
m_Script: {fileID: 11500000, guid: fc81345eb5294d643b4242eac215c5fc, type: 3}
m_Name: ABL_ChaoFeng_TornadoSmall
m_EditorClassIdentifier:
skillId: tornado_small
displayName: TornadoSmall
designNote:
category: 0
skillType: 0
availablePhaseIndices: 00000000
attackPatterns: []
vulnerabilityWindows: []
interactionTags: 0
sequenceOnHit: {fileID: 0}
sequenceOnMiss: {fileID: 0}
counterResponses: []
arenaEvents: []
resourceCost:
resourceId:
cost: 0
minRequired: 0
buildsRage: 0
poiseWindow:
Level: 0
NormalizedStart: 0
NormalizedEnd: 0
skillAnimation:
abilityId: tornado_small
designNote: "\u9636\u6BB5 0 \u62DB\u5F0F\uFF1B\u9636\u6BB5\u53EF\u7528\u6027\u7531
BossPhaseAbilityGate \u914D\u7F6E"
attackSequence: []
cooldown: 3.5
telegraphVfxKey:
telegraphDuration: 0
interruptOnHurt: 1
interruptOnStagger: 1
preferredMinRange: 0
preferredMaxRange: 5
requiresLineOfSight: 1
requiresGrounded: 1
exclusionGroup:
priority: 0
category: 1
weight: 1.2
rangeRadius: 8
rangeOffset: {x: 0, y: 0}
clip:
_FadeDuration: 0.25
_Speed: 1
_Events:
@@ -43,8 +40,6 @@ MonoBehaviour:
_Names: []
_Clip: {fileID: 0}
_NormalizedStartTime: NaN
cooldown: 0
weight: 1.2
references:
version: 2
RefIds: []
@@ -9,32 +9,29 @@ MonoBehaviour:
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: de92221c7c3fb4a42a7cd122a8f97632, type: 3}
m_Script: {fileID: 11500000, guid: fc81345eb5294d643b4242eac215c5fc, type: 3}
m_Name: ABL_ChaoFeng_WindStone
m_EditorClassIdentifier:
skillId: wind_stone
displayName: WindStone
designNote:
category: 0
skillType: 0
availablePhaseIndices: 01000000
attackPatterns: []
vulnerabilityWindows: []
interactionTags: 0
sequenceOnHit: {fileID: 0}
sequenceOnMiss: {fileID: 0}
counterResponses: []
arenaEvents: []
resourceCost:
resourceId:
cost: 0
minRequired: 0
buildsRage: 0
poiseWindow:
Level: 0
NormalizedStart: 0
NormalizedEnd: 0
skillAnimation:
abilityId: wind_stone
designNote: "\u9636\u6BB5 1 \u62DB\u5F0F\uFF1B\u9636\u6BB5\u53EF\u7528\u6027\u7531
BossPhaseAbilityGate \u914D\u7F6E"
attackSequence: []
cooldown: 3
telegraphVfxKey:
telegraphDuration: 0
interruptOnHurt: 1
interruptOnStagger: 1
preferredMinRange: 0
preferredMaxRange: 5
requiresLineOfSight: 1
requiresGrounded: 0
exclusionGroup:
priority: 0
category: 1
weight: 1
rangeRadius: 12
rangeOffset: {x: 0, y: 0}
clip:
_FadeDuration: 0.25
_Speed: 1
_Events:
@@ -43,8 +40,6 @@ MonoBehaviour:
_Names: []
_Clip: {fileID: 0}
_NormalizedStartTime: NaN
cooldown: 0
weight: 1
references:
version: 2
RefIds: []