refactor(ai): E001 贯彻"AI只决策"——每状态=一能力(Model A)

AI 决策层(E001CaoZhiAi + PerceptionStateMachine)彻底移除所有 actuation:
不再有 Mover.Stop/FacePlayer/UseChaseSpeed/WalkRandom、也不再 SetPhase。
每个 AI 状态只声明触发哪个能力 id,行为(移动/朝向/停/速度/动画/伤害/
阶段声明)全部下沉到对应能力里。

- 新增 IdleAbility/PatrolAbility/AlertAbility:待机静止、巡逻游走、
  警觉朝向玩家,各自 SetAiPhase 驱动阶段动画。
- ContactChaseAbility 追击进入时自设 RunSpeed + Chase 阶段(原在 AI)。
- PerceptionStateMachine 改为 AddAbilityState:进入/每帧 EnsureAbility
  (被打断/受击后自动重触发)、离开 InterruptAbilities;转换规则不变。
- IEnemyActor/EnemyBrainContext 移除已无用的 SetPhase,保留 HasAlertState。
- 新增 SO:ABL_E001_Idle(e001_idle)、ABL_E001_Patrol(e001_patrol)。
- 脚手架 PlaceE001 与 ENM_CaoZhi 预制体同步为四能力结构;TestRoomA
  实例替换为规范预制体实例。

PlayMode 验证:Chase→ContactChaseAbility、脱离感知→Move_Patrol→
PatrolAbility,阶段由能力设置,无报错。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-10 10:05:14 +08:00
co-authored by Claude Opus 4.8
parent 490329e1dc
commit 2e2df2b5dd
18 changed files with 464 additions and 943 deletions
@@ -0,0 +1,27 @@
%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: 9050afa76362dff469c64fbb48c9ff8d, type: 3}
m_Name: ABL_E001_Idle
m_EditorClassIdentifier:
abilityId: e001_idle
attackSequence: []
cooldown: 0
telegraphVfxKey:
telegraphDuration: 0
interruptOnHurt: 1
interruptOnStagger: 1
preferredMinRange: 0
preferredMaxRange: 5
requiresLineOfSight: 0
requiresGrounded: 1
exclusionGroup:
priority: 0
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 39972ac36f68c5a40a696350ee5b45ef
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,27 @@
%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: 9050afa76362dff469c64fbb48c9ff8d, type: 3}
m_Name: ABL_E001_Patrol
m_EditorClassIdentifier:
abilityId: e001_patrol
attackSequence: []
cooldown: 0
telegraphVfxKey:
telegraphDuration: 0
interruptOnHurt: 1
interruptOnStagger: 1
preferredMinRange: 0
preferredMaxRange: 5
requiresLineOfSight: 0
requiresGrounded: 1
exclusionGroup:
priority: 0
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ea84fa0bad3eb9c44841fbe355923cbd
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -29,7 +29,9 @@ Transform:
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: m_Children:
- {fileID: 7511576130651589432} - {fileID: 7280204190161057260}
- {fileID: 869537028244990118}
- {fileID: 3016991558969992483}
- {fileID: 7963057630187492059} - {fileID: 7963057630187492059}
m_Father: {fileID: 1584616613766364365} m_Father: {fileID: 1584616613766364365}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -61,7 +63,7 @@ Transform:
m_GameObject: {fileID: 2378558940863543267} m_GameObject: {fileID: 2378558940863543267}
serializedVersion: 2 serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalPosition: {x: 0, y: 0.4, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
@@ -155,6 +157,63 @@ SpriteRenderer:
m_WasSpriteAssigned: 1 m_WasSpriteAssigned: 1
m_MaskInteraction: 0 m_MaskInteraction: 0
m_SpriteSortPoint: 0 m_SpriteSortPoint: 0
--- !u!1 &3800849059563030653
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3016991558969992483}
- component: {fileID: 6670918032049014100}
m_Layer: 0
m_Name: AlertAbility_Alert
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &3016991558969992483
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3800849059563030653}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1509821362700786356}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &6670918032049014100
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3800849059563030653}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c51a5a3300c5d2549b3f8826d8c54fa8, type: 3}
m_Name:
m_EditorClassIdentifier:
_config: {fileID: 11400000, guid: 157dc45e6b444c64ea1a80a5886a8b92, type: 2}
_alertClip:
_FadeDuration: 0.25
_Speed: 1
_Events:
_NormalizedTimes: []
_Callbacks: []
_Names: []
_Clip: {fileID: 0}
_NormalizedStartTime: NaN
references:
version: 2
RefIds: []
--- !u!1 &4060394683168505230 --- !u!1 &4060394683168505230
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -190,7 +249,7 @@ Transform:
m_GameObject: {fileID: 4060394683168505230} m_GameObject: {fileID: 4060394683168505230}
serializedVersion: 2 serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 1968.4287, y: 77.1997, z: 0} m_LocalPosition: {x: -19.75632, y: 8.950914, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: m_Children:
@@ -483,10 +542,10 @@ MonoBehaviour:
gizmoColor: {r: 0, g: 0.8, b: 1, a: 1} gizmoColor: {r: 0, g: 0.8, b: 1, a: 1}
isDisabled: 0 isDisabled: 0
tickInterval: 0 tickInterval: 0
radius: 0 radius: 8
detectLayer: detectLayer:
serializedVersion: 2 serializedVersion: 2
m_Bits: 0 m_Bits: 512
fanAngle: 0 fanAngle: 0
fanRayCount: 0 fanRayCount: 0
boxSize: {x: 0, y: 0} boxSize: {x: 0, y: 0}
@@ -516,6 +575,51 @@ MonoBehaviour:
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
_definitionId: E001 _definitionId: E001
--- !u!1 &4880943584691488989
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7280204190161057260}
- component: {fileID: 2415446021001155414}
m_Layer: 0
m_Name: IdleAbility_Idle
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &7280204190161057260
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4880943584691488989}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1509821362700786356}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &2415446021001155414
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4880943584691488989}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 599faa708ea4a0f4b96ca9a3691523d7, type: 3}
m_Name:
m_EditorClassIdentifier:
_config: {fileID: 11400000, guid: 39972ac36f68c5a40a696350ee5b45ef, type: 2}
--- !u!1 &6141681234124103774 --- !u!1 &6141681234124103774
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -670,7 +774,7 @@ MonoBehaviour:
_hitInterval: 0.5 _hitInterval: 0.5
_targetLayers: _targetLayers:
serializedVersion: 2 serializedVersion: 2
m_Bits: 32768 m_Bits: 4294967295
_id: _id:
_rivalHitBoxMask: _rivalHitBoxMask:
serializedVersion: 2 serializedVersion: 2
@@ -688,6 +792,51 @@ MonoBehaviour:
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
_repeatInterval: 0.5 _repeatInterval: 0.5
--- !u!1 &6994153900739920753
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 869537028244990118}
- component: {fileID: 1668795692422874824}
m_Layer: 0
m_Name: PatrolAbility_Patrol
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &869537028244990118
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6994153900739920753}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1509821362700786356}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1668795692422874824
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6994153900739920753}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 36ef5fe655e471c448e7c1300355888b, type: 3}
m_Name:
m_EditorClassIdentifier:
_config: {fileID: 11400000, guid: ea84fa0bad3eb9c44841fbe355923cbd, type: 2}
--- !u!1 &8344198090396325649 --- !u!1 &8344198090396325649
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -768,62 +917,5 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: d7b7a233d7f70aa4f86b473412b826de, type: 3} m_Script: {fileID: 11500000, guid: d7b7a233d7f70aa4f86b473412b826de, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
_onDamageDealt: {fileID: 0} _onDamageDealt: {fileID: 11400000, guid: eebd58cfef3527940949a8a7655a343b, type: 2}
_onHitConfirmed: {fileID: 11400000, guid: a67d56f5124e0db4f98f326c74be8091, type: 2} _onHitConfirmed: {fileID: 11400000, guid: a67d56f5124e0db4f98f326c74be8091, type: 2}
--- !u!1 &9197466520231538566
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7511576130651589432}
- component: {fileID: 4229412279466832384}
m_Layer: 0
m_Name: PlayClipAbility_Alert
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &7511576130651589432
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9197466520231538566}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1509821362700786356}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &4229412279466832384
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9197466520231538566}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a26fca0fa72894a4da1a5a58ee023154, type: 3}
m_Name:
m_EditorClassIdentifier:
_config: {fileID: 11400000, guid: 157dc45e6b444c64ea1a80a5886a8b92, type: 2}
_clip:
_FadeDuration: 0.25
_Speed: 1
_Events:
_NormalizedTimes: []
_Callbacks: []
_Names: []
_Clip: {fileID: 0}
_NormalizedStartTime: NaN
references:
version: 2
RefIds: []
+58 -819
View File
@@ -4540,128 +4540,6 @@ MonoBehaviour:
_noiseFrequency: 1 _noiseFrequency: 1
_dedicatedCamera: {fileID: 446229637} _dedicatedCamera: {fileID: 446229637}
_dedicatedPriority: 20 _dedicatedPriority: 20
--- !u!1 &244244683
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 244244684}
- component: {fileID: 244244685}
- component: {fileID: 244244686}
- component: {fileID: 244244687}
m_Layer: 0
m_Name: Visual
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &244244684
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 244244683}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1409939202}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!95 &244244685
Animator:
serializedVersion: 5
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 244244683}
m_Enabled: 1
m_Avatar: {fileID: 0}
m_Controller: {fileID: 0}
m_CullingMode: 0
m_UpdateMode: 0
m_ApplyRootMotion: 0
m_LinearVelocityBlending: 0
m_StabilizeFeet: 0
m_WarningMessage:
m_HasTransformHierarchy: 1
m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorStateOnDisable: 0
m_WriteDefaultValuesOnDisable: 0
--- !u!114 &244244686
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 244244683}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0ad50f81b1d25c441943c37a89ba23f6, type: 3}
m_Name:
m_EditorClassIdentifier:
_Animator: {fileID: 244244685}
_Transitions: {fileID: 0}
_ActionOnDisable: 0
--- !u!212 &244244687
SpriteRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 244244683}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 6c1a7b756ba1d4646a405f7f6e0833ad, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_Sprite: {fileID: 7482667652216324306, guid: 311925a002f4447b3a28927169b83ea6, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 1, y: 1}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_MaskInteraction: 0
m_SpriteSortPoint: 0
--- !u!1 &247590774 --- !u!1 &247590774
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -4936,39 +4814,6 @@ Transform:
m_Children: [] m_Children: []
m_Father: {fileID: 1329258003} m_Father: {fileID: 1329258003}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &269773824
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 269773825}
m_Layer: 0
m_Name: Abilities
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &269773825
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 269773824}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 733617855}
- {fileID: 1231992168}
m_Father: {fileID: 1409939202}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &269960158 --- !u!1 &269960158
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -12593,63 +12438,6 @@ MonoBehaviour:
_noiseFrequency: 1 _noiseFrequency: 1
_dedicatedCamera: {fileID: 849840042} _dedicatedCamera: {fileID: 849840042}
_dedicatedPriority: 20 _dedicatedPriority: 20
--- !u!1 &733617854
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 733617855}
- component: {fileID: 733617856}
m_Layer: 0
m_Name: PlayClipAbility_Alert
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &733617855
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 733617854}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 269773825}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &733617856
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 733617854}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a26fca0fa72894a4da1a5a58ee023154, type: 3}
m_Name:
m_EditorClassIdentifier:
_config: {fileID: 11400000, guid: 157dc45e6b444c64ea1a80a5886a8b92, type: 2}
_clip:
_FadeDuration: 0.25
_Speed: 1
_Events:
_NormalizedTimes: []
_Callbacks: []
_Names: []
_Clip: {fileID: 0}
_NormalizedStartTime: NaN
references:
version: 2
RefIds: []
--- !u!1 &734112388 --- !u!1 &734112388
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -16076,88 +15864,6 @@ Transform:
- {fileID: 1476535863} - {fileID: 1476535863}
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &985676459
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 985676462}
- component: {fileID: 985676461}
- component: {fileID: 985676460}
m_Layer: 27
m_Name: HurtBox
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &985676460
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 985676459}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d7b7a233d7f70aa4f86b473412b826de, type: 3}
m_Name:
m_EditorClassIdentifier:
_onDamageDealt: {fileID: 0}
_onHitConfirmed: {fileID: 11400000, guid: a67d56f5124e0db4f98f326c74be8091, type: 2}
--- !u!70 &985676461
CapsuleCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 985676459}
m_Enabled: 1
m_Density: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_ForceSendLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ForceReceiveLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ContactCaptureLayers:
serializedVersion: 2
m_Bits: 4294967295
m_CallbackLayers:
serializedVersion: 2
m_Bits: 4294967295
m_IsTrigger: 1
m_UsedByEffector: 0
m_UsedByComposite: 0
m_Offset: {x: 0, y: 0}
m_Size: {x: 0.55, y: 0.75}
m_Direction: 0
--- !u!4 &985676462
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 985676459}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1409939202}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &989663221 --- !u!1 &989663221
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -21432,74 +21138,6 @@ PolygonCollider2D:
- {x: -3.5, y: 3} - {x: -3.5, y: 3}
- {x: -3.5, y: -3} - {x: -3.5, y: -3}
m_UseDelaunayMesh: 0 m_UseDelaunayMesh: 0
--- !u!1 &1231992167
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1231992168}
- component: {fileID: 1231992169}
m_Layer: 0
m_Name: ContactChaseAbility_Chase
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1231992168
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1231992167}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 269773825}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1231992169
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1231992167}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7bfd6f44ebdb5bf489ab6703b1ee429b, type: 3}
m_Name:
m_EditorClassIdentifier:
_config: {fileID: 11400000, guid: 0adeaa8a8508fbd40986dbb71cc85acd, type: 2}
_loopClip:
_FadeDuration: 0.25
_Speed: 1
_Events:
_NormalizedTimes: []
_Callbacks: []
_Names: []
_Clip: {fileID: 0}
_NormalizedStartTime: NaN
_endClip:
_FadeDuration: 0.25
_Speed: 1
_Events:
_NormalizedTimes: []
_Callbacks: []
_Names: []
_Clip: {fileID: 0}
_NormalizedStartTime: NaN
_contactDamage: {fileID: 1380656261}
_aggroSlotName: aggro
references:
version: 2
RefIds: []
--- !u!1 &1234739833 --- !u!1 &1234739833
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -25553,111 +25191,6 @@ MonoBehaviour:
_noiseFrequency: 1 _noiseFrequency: 1
_dedicatedCamera: {fileID: 1141609723} _dedicatedCamera: {fileID: 1141609723}
_dedicatedPriority: 20 _dedicatedPriority: 20
--- !u!1 &1380656260
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1380656264}
- component: {fileID: 1380656263}
- component: {fileID: 1380656262}
- component: {fileID: 1380656261}
m_Layer: 25
m_Name: ContactDamageZone
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &1380656261
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1380656260}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6def12af0589a9545b80eb5accf61bb6, type: 3}
m_Name:
m_EditorClassIdentifier:
_repeatInterval: 0.5
--- !u!114 &1380656262
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1380656260}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a655e2461396a8348a32a13144438e8e, type: 3}
m_Name:
m_EditorClassIdentifier:
_defaultSource: {fileID: 11400000, guid: caae9c7600281fe4e8d8637fa3fd2ca1, type: 2}
_hitCooldown: 0.1
_hitMode: 1
_hitInterval: 0.5
_targetLayers:
serializedVersion: 2
m_Bits: 32768
_id:
_rivalHitBoxMask:
serializedVersion: 2
m_Bits: 0
--- !u!58 &1380656263
CircleCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1380656260}
m_Enabled: 1
m_Density: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_ForceSendLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ForceReceiveLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ContactCaptureLayers:
serializedVersion: 2
m_Bits: 4294967295
m_CallbackLayers:
serializedVersion: 2
m_Bits: 4294967295
m_IsTrigger: 1
m_UsedByEffector: 0
m_UsedByComposite: 0
m_Offset: {x: 0, y: 0}
serializedVersion: 2
m_Radius: 0.4
--- !u!4 &1380656264
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1380656260}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1409939202}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1387959175 --- !u!1 &1387959175
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -26190,357 +25723,6 @@ PolygonCollider2D:
- {x: -2.5, y: 6} - {x: -2.5, y: 6}
- {x: -2.5, y: -6} - {x: -2.5, y: -6}
m_UseDelaunayMesh: 0 m_UseDelaunayMesh: 0
--- !u!1 &1409939192
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1409939202}
- component: {fileID: 1409939201}
- component: {fileID: 1409939200}
- component: {fileID: 1409939199}
- component: {fileID: 1409939198}
- component: {fileID: 1409939197}
- component: {fileID: 1409939196}
- component: {fileID: 1409939195}
- component: {fileID: 1409939194}
- component: {fileID: 1409939193}
m_Layer: 13
m_Name: ENM_CaoZhi
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &1409939193
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1409939192}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c0026fe36cfaffc4e95698bccd0a8380, type: 3}
m_Name:
m_EditorClassIdentifier:
_slots:
- slotName: aggro
type: 0
offset: {x: 0, y: 0}
gizmoColor: {r: 1, g: 0.6, b: 0.1, a: 1}
isDisabled: 0
tickInterval: 0
radius: 5
detectLayer:
serializedVersion: 2
m_Bits: 512
fanAngle: 0
fanRayCount: 0
boxSize: {x: 0, y: 0}
boxOffset: {x: 0, y: 0}
losBlockMask:
serializedVersion: 2
m_Bits: 0
losRayCount: 0
losMinVisibility: 0
rayDirection: {x: 0, y: 0}
rayLength: 0
raySpread: 0
rayCount: 0
obstructLayer:
serializedVersion: 2
m_Bits: 0
- slotName: los
type: 1
offset: {x: 0, y: 0}
gizmoColor: {r: 0, g: 0.8, b: 1, a: 1}
isDisabled: 0
tickInterval: 0
radius: 0
detectLayer:
serializedVersion: 2
m_Bits: 0
fanAngle: 0
fanRayCount: 0
boxSize: {x: 0, y: 0}
boxOffset: {x: 0, y: 0}
losBlockMask:
serializedVersion: 2
m_Bits: 0
losRayCount: 0
losMinVisibility: 0
rayDirection: {x: 0, y: 0}
rayLength: 0
raySpread: 0
rayCount: 0
obstructLayer:
serializedVersion: 2
m_Bits: 0
--- !u!114 &1409939194
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1409939192}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 44871319d7318de40b9ac21757b69c78, type: 3}
m_Name:
m_EditorClassIdentifier:
_edgeCheckFwdOffset: 0.3
_edgeCheckDownLen: 0.6
_groundMask:
serializedVersion: 2
m_Bits: 256
--- !u!114 &1409939195
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1409939192}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 77030faff3812a7429edeaca91e9c873, type: 3}
m_Name:
m_EditorClassIdentifier:
movementSpeed: 5
cornerSpeed: 100
jumpSpeed: 5
fallSpeed: 5
climbSpeed: 5
enableAgentRotation: 1
enabledFeatures: -1
--- !u!114 &1409939196
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1409939192}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3864fd1487d130847b11b82f276d11b6, type: 3}
m_Name:
m_EditorClassIdentifier:
height: 1
maxSlopeAngle: 180
autoRepathIntervall: 1
maximumDistanceToPathStart: 0.7
linkTraversalCostMultipliers:
- 1
- 1
- 1
- 1
- 1
- 1
allowCloseEnoughPath: 0
movementSpeed: 5
cornerSpeed: 100
jumpSpeed: 5
fallSpeed: 5
climbSpeed: 5
enableDebugMessages: 0
navTagTraversalCostMultipliers:
- 1
- 1
- 1
- 1
- 1
- 1
status: 0
navTagMask: -1
--- !u!114 &1409939197
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1409939192}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 20bd45717dc17a94581eee24814fe60c, type: 3}
m_Name:
m_EditorClassIdentifier:
_config: {fileID: 11400000, guid: 508afd17a0cf2fe47935c78097c3b093, type: 2}
_spriteRenderer: {fileID: 244244687}
_enableTurnAnimation: 0
_animancer: {fileID: 244244686}
_animConfig: {fileID: 11400000, guid: 06936c5bc3358904cb269abdfa60ed14, type: 2}
_visualRoot: {fileID: 244244684}
_spriteDefaultFacingDir: 1
_navJumpMaxHeight: 6
_navJumpMaxDist: 10
_groundCheckCollider: {fileID: 0}
_groundCheckDist: 0.15
_groundCheckCount: 3
_groundMask:
serializedVersion: 2
m_Bits: 68159744
_wallCheckDist: 0.2
_ledgeCheckFwdOffset: 0.1
_ledgeCheckDownDist: 0.4
_wallMask:
serializedVersion: 2
m_Bits: 0
_dbg_FacingDirection: 0
_dbg_VelocityX: 0
_dbg_VelocityY: 0
_dbg_IsGrounded: 0
_dbg_IsWallAhead: 0
_dbg_IsLedgeAhead: 0
_dbg_IsTurning: 0
_dbg_NavDriving: 0
_dbg_Input_MoveDir: 0
_dbg_Input_MoveSpeed: 0
_dbg_Input_WantStop: 0
_dbg_Input_WantFace: 0
_dbg_Input_FaceTargetPos: {x: 0, y: 0}
_dbg_Input_FaceDir: 0
--- !u!114 &1409939198
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1409939192}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 48bc7c82cd2c1df4ba7103160db48a11, type: 3}
m_Name:
m_EditorClassIdentifier:
_onDifficultyChanged: {fileID: 11400000, guid: 156874a2ffc17694e91e949abbf97fee, type: 2}
--- !u!114 &1409939199
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1409939192}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1a2dbfbcc31a4c34cbd3ac893f02e07d, type: 3}
m_Name:
m_EditorClassIdentifier:
_enemyId:
_statsSO: {fileID: 11400000, guid: 508afd17a0cf2fe47935c78097c3b093, type: 2}
_animConfig: {fileID: 11400000, guid: 06936c5bc3358904cb269abdfa60ed14, type: 2}
_stats: {fileID: 1409939198}
_movement: {fileID: 1409939197}
_combat: {fileID: 0}
_animancer: {fileID: 244244686}
_feedback: {fileID: 0}
_hurtBox: {fileID: 985676460}
_patrolZone: {fileID: 0}
_onEnemyDied: {fileID: 11400000, guid: def849e2c5ec8204eae6b083b02307aa, type: 2}
_onPlayerSpawned: {fileID: 11400000, guid: 7e2c7e614f6627b449a244ab44443adf, type: 2}
_btIdleTickInterval: 0.3
_btPatrolTickInterval: 0.15
_btAlertTickInterval: 0.08
_btChaseTickInterval: 0.05
_btCombatTickInterval: 0
_dbg_CurrentState: 0
_dbg_AiPhase: 0
_dbg_HasPlayer: 0
_dbg_LastKnownPos: {x: 0, y: 0}
_dbg_BtTickInterval: 0
_autoPlayPhaseAnimation: 1
--- !u!61 &1409939200
BoxCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1409939192}
m_Enabled: 1
m_Density: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_ForceSendLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ForceReceiveLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ContactCaptureLayers:
serializedVersion: 2
m_Bits: 4294967295
m_CallbackLayers:
serializedVersion: 2
m_Bits: 4294967295
m_IsTrigger: 0
m_UsedByEffector: 0
m_UsedByComposite: 0
m_Offset: {x: 0, y: 0}
m_SpriteTilingProperty:
border: {x: 0, y: 0, z: 0, w: 0}
pivot: {x: 0, y: 0}
oldSize: {x: 0, y: 0}
newSize: {x: 0, y: 0}
adaptiveTilingThreshold: 0
drawMode: 0
adaptiveTiling: 0
m_AutoTiling: 0
serializedVersion: 2
m_Size: {x: 0.6, y: 0.8}
m_EdgeRadius: 0
--- !u!50 &1409939201
Rigidbody2D:
serializedVersion: 4
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1409939192}
m_BodyType: 0
m_Simulated: 1
m_UseFullKinematicContacts: 0
m_UseAutoMass: 0
m_Mass: 1
m_LinearDrag: 0
m_AngularDrag: 0.05
m_GravityScale: 2
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_Interpolate: 0
m_SleepingMode: 1
m_CollisionDetection: 1
m_Constraints: 4
--- !u!4 &1409939202
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1409939192}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -17.25, y: 2.74, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 244244684}
- {fileID: 985676462}
- {fileID: 1380656264}
- {fileID: 269773825}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1411393552 --- !u!1 &1411393552
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -215290,6 +214472,63 @@ MonoBehaviour:
_noiseFrequency: 1 _noiseFrequency: 1
_dedicatedCamera: {fileID: 1461204032} _dedicatedCamera: {fileID: 1461204032}
_dedicatedPriority: 20 _dedicatedPriority: 20
--- !u!1001 &2007753045
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 1584616613766364365, guid: 69accaa6577ec1a4db552c3c31aa28d8, type: 3}
propertyPath: m_LocalPosition.x
value: -19.197
objectReference: {fileID: 0}
- target: {fileID: 1584616613766364365, guid: 69accaa6577ec1a4db552c3c31aa28d8, type: 3}
propertyPath: m_LocalPosition.y
value: 2.651
objectReference: {fileID: 0}
- target: {fileID: 1584616613766364365, guid: 69accaa6577ec1a4db552c3c31aa28d8, type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1584616613766364365, guid: 69accaa6577ec1a4db552c3c31aa28d8, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1584616613766364365, guid: 69accaa6577ec1a4db552c3c31aa28d8, type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1584616613766364365, guid: 69accaa6577ec1a4db552c3c31aa28d8, type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1584616613766364365, guid: 69accaa6577ec1a4db552c3c31aa28d8, type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1584616613766364365, guid: 69accaa6577ec1a4db552c3c31aa28d8, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1584616613766364365, guid: 69accaa6577ec1a4db552c3c31aa28d8, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1584616613766364365, guid: 69accaa6577ec1a4db552c3c31aa28d8, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4060394683168505230, guid: 69accaa6577ec1a4db552c3c31aa28d8, type: 3}
propertyPath: m_Name
value: ENM_CaoZhi
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 69accaa6577ec1a4db552c3c31aa28d8, type: 3}
--- !u!1 &2009355028 --- !u!1 &2009355028
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -217974,8 +217213,8 @@ SceneRoots:
- {fileID: 1865796631} - {fileID: 1865796631}
- {fileID: 1354690328} - {fileID: 1354690328}
- {fileID: 783576435} - {fileID: 783576435}
- {fileID: 1409939202}
- {fileID: 1288627279} - {fileID: 1288627279}
- {fileID: 2146472069} - {fileID: 2146472069}
- {fileID: 2124924423} - {fileID: 2124924423}
- {fileID: 960547555} - {fileID: 960547555}
- {fileID: 2007753045}
@@ -488,9 +488,14 @@ namespace BaseGames.Editor
BodyContactDamage bodyContact = GetOrAddComponent<BodyContactDamage>(contactT.gameObject); BodyContactDamage bodyContact = GetOrAddComponent<BodyContactDamage>(contactT.gameObject);
bodyContact.enabled = false; // 伪装/待机期不伤人;由 e001_chase 能力在追击期开启 bodyContact.enabled = false; // 伪装/待机期不伤人;由 e001_chase 能力在追击期开启
// Model A:每个 AI 状态 = 一个行为能力(AI 只决策触发哪个 id,行为在能力里实现)
Transform abilitiesT = GetOrCreateChild(go.transform, "Abilities"); Transform abilitiesT = GetOrCreateChild(go.transform, "Abilities");
Transform alertT = GetOrCreateChild(abilitiesT, "PlayClipAbility_Alert"); Transform idleT = GetOrCreateChild(abilitiesT, "IdleAbility_Idle");
PlayClipAbility alertAbility = GetOrAddComponent<PlayClipAbility>(alertT.gameObject); IdleAbility idleAbility = GetOrAddComponent<IdleAbility>(idleT.gameObject);
Transform patrolT = GetOrCreateChild(abilitiesT, "PatrolAbility_Patrol");
PatrolAbility patrolAbility = GetOrAddComponent<PatrolAbility>(patrolT.gameObject);
Transform alertT = GetOrCreateChild(abilitiesT, "AlertAbility_Alert");
AlertAbility alertAbility = GetOrAddComponent<AlertAbility>(alertT.gameObject);
Transform chaseT = GetOrCreateChild(abilitiesT, "ContactChaseAbility_Chase"); Transform chaseT = GetOrCreateChild(abilitiesT, "ContactChaseAbility_Chase");
ContactChaseAbility chaseAbility = GetOrAddComponent<ContactChaseAbility>(chaseT.gameObject); ContactChaseAbility chaseAbility = GetOrAddComponent<ContactChaseAbility>(chaseT.gameObject);
@@ -518,6 +523,8 @@ namespace BaseGames.Editor
new[] { "Platform", "OneWayPlatform", "MovingOneWayPlatform", "MidHeightOneWayPlatform" }, new[] { "Platform", "OneWayPlatform", "MovingOneWayPlatform", "MidHeightOneWayPlatform" },
report); report);
AssignAsset(idleAbility, "_config", report, false, "ABL_E001_Idle");
AssignAsset(patrolAbility, "_config", report, false, "ABL_E001_Patrol");
AssignAsset(alertAbility, "_config", report, false, "ABL_E001_Alert"); AssignAsset(alertAbility, "_config", report, false, "ABL_E001_Alert");
AssignAsset(chaseAbility, "_config", report, false, "ABL_E001_Chase"); AssignAsset(chaseAbility, "_config", report, false, "ABL_E001_Chase");
AssignReference(chaseAbility, "_contactDamage", bodyContact, report); AssignReference(chaseAbility, "_contactDamage", bodyContact, report);
@@ -4,14 +4,13 @@ namespace BaseGames.Enemies
{ {
/// <summary> /// <summary>
/// E001(草蛭)AI —— 纯决策层,复用 PerceptionStateMachine 的"待机/警觉/追击/巡逻"统一规则。 /// E001(草蛭)AI —— 纯决策层,复用 PerceptionStateMachine 的"待机/警觉/追击/巡逻"统一规则。
/// 只声明差异:待机=伪装静止、警觉=张口(e001_alert)、追击=委托 e001_chase 能力、R=巡逻 /// 只声明差异:每个状态触发哪个能力(待机=伪装静止、巡逻=游走、警觉=张口、追击=接触追击)
/// 追击移动/接触伤害由能力实现;退出追击由 AI 中断能力。依据 Docs/Game/Design/小怪设计-程序开发文档-01.md /// AI 只决策(进哪个状态/转换条件/触发哪个能力);移动/朝向/停/速度/动画/伤害/阶段声明全部在能力实现。
/// 依据 Docs/Game/Design/小怪设计-程序开发文档-01.md。
/// </summary> /// </summary>
[AiDefinition("E001")] [AiDefinition("E001")]
public sealed class E001CaoZhiAi : AiScript public sealed class E001CaoZhiAi : AiScript
{ {
static IEnemyActor Actor(IAiContext c) => (IEnemyActor)c;
protected override void Build(BrainBuilder b) protected override void Build(BrainBuilder b)
{ {
PerceptionStateMachine.Add(b, new PerceptionStateMachine.Config PerceptionStateMachine.Add(b, new PerceptionStateMachine.Config
@@ -23,18 +22,12 @@ namespace BaseGames.Enemies
Death = "Death", Death = "Death",
Entry = "Idle_Disguise", Entry = "Idle_Disguise",
Rest = "Move_Patrol", Rest = "Move_Patrol",
ChaseAbilityId = "e001_chase",
OnIdleEnter = c => { c.Mover.Stop(); Actor(c).SetPhase(AiPhase.Idle); }, IdleAbilityId = "e001_idle",
OnPatrolEnter = c => { c.Mover.UsePatrolSpeed(); Actor(c).SetPhase(AiPhase.Patrol); }, PatrolAbilityId = "e001_patrol",
OnPatrolTick = c => c.Mover.WalkRandom(), AlertAbilityId = "e001_alert",
// 警觉:停下、朝向玩家、切 Alert 阶段(播警觉动画+feedback)、张口占位 ChaseAbilityId = "e001_chase",
OnAlertEnter = c => { c.Mover.Stop(); c.Mover.FacePlayer(); Actor(c).SetPhase(AiPhase.Alert); c.Combat.UseAbility("e001_alert"); }, // DeathAbilityId 留空:死亡演出走物理状态机(EnemyBase.PerformDeath)
// 追击进入:切追击速度、朝向、Chase 阶段(追击能力由 PerceptionStateMachine 触发)
OnChaseEnter = c => { c.Mover.UseChaseSpeed(); c.Mover.FacePlayer(); Actor(c).SetPhase(AiPhase.Chase); },
// 追击退出:中断追击能力(停移动、关接触伤害)
OnChaseExit = c => c.Combat.InterruptAbilities(),
OnDeathEnter = c => c.Mover.Stop(),
}); });
} }
} }
@@ -109,7 +109,6 @@ namespace BaseGames.Enemies
public bool HpBelow(float ratio) => HpPercent < ratio; public bool HpBelow(float ratio) => HpPercent < ratio;
// ---- IEnemyActor ---- // ---- IEnemyActor ----
public void SetPhase(AiPhase phase) => _enemy.SetAiPhase(phase);
public bool HasAlertState => _enemy.StatsSO != null && _enemy.StatsSO.HasAlertState; public bool HasAlertState => _enemy.StatsSO != null && _enemy.StatsSO.HasAlertState;
} }
} }
@@ -1,15 +1,12 @@
namespace BaseGames.Enemies namespace BaseGames.Enemies
{ {
/// <summary> /// <summary>
/// 敌人侧的决策输接口:AI 决策层用它"声明"当前行为阶段,由敌人模块(EnemyBase)负责 /// 敌人侧的决策输接口:AI 决策层用它读取敌人的决策参数(是否有警觉态等)。
/// 实现(播放阶段动画、供警戒/群体逻辑消费)。AiPhase 属 Enemies 命名空间, /// 行为阶段(AiPhase)的声明已下沉到能力里(每状态一能力),AI 不再直接声明阶段。
/// 故不放进通用 BaseGames.AI 接口;由 EnemyBrainContext 实现,Enemies 侧的 AiScript 使用。 /// 由 EnemyBrainContext 实现,Enemies 侧的 AiScript 使用。
/// </summary> /// </summary>
public interface IEnemyActor public interface IEnemyActor
{ {
/// <summary>声明当前 AI 行为阶段(EnemyBase 据此自动播放对应动画)。</summary>
void SetPhase(AiPhase phase);
/// <summary>该敌人是否有警觉状态(勾选项,来自 EnemyStatsSO)。false 时未发现态直接追击、不经警觉。</summary> /// <summary>该敌人是否有警觉状态(勾选项,来自 EnemyStatsSO)。false 时未发现态直接追击、不经警觉。</summary>
bool HasAlertState { get; } bool HasAlertState { get; }
} }
@@ -1,16 +1,16 @@
using System;
using BaseGames.AI; using BaseGames.AI;
namespace BaseGames.Enemies namespace BaseGames.Enemies
{ {
/// <summary> /// <summary>
/// 可复用的"待机/警觉/追击/巡逻"感知状态机(统一规则,见 spec《敌人感知↔状态》)。 /// 可复用的"待机/警觉/追击/巡逻"感知状态机(统一规则,见 spec《敌人感知↔状态》)。
/// 职责边界:**状态转换逻辑在 AI 层(本类)**;感知系统只回答 InChaseZone/InVisionZone。 /// 纯决策:AI 只决定"进哪个状态 / 转换条件 / 每状态触发哪个能力";
/// 每个状态的行为(移动/朝向/动画/伤害/阶段声明)全部封装在对应能力里(AI 不做任何 actuation)。
/// 规则: /// 规则:
/// 待机/巡逻: 在追逐区→追击(优先); 否则 有警觉且在视野→警觉; 否则保持。 /// 待机/巡逻: 在追逐区→追击(优先); 否则 有警觉且在视野→警觉; 否则保持。
/// 警觉: 在追逐区→追击; 否则 脱离视野→R; 否则保持警觉。 /// 警觉: 在追逐区→追击; 否则 脱离视野→R; 否则保持警觉。
/// 追击: 委托能力; 脱离视野→R(永不回警觉)。 /// 追击: 脱离全部感知(追逐区且视野区都不在)→R(永不回警觉)。
/// 缺省自动降级:无警觉(HasAlert=false)→警觉分支不触发;无视野槽→维持退化用追逐区 /// 缺省自动降级:无警觉(HasAlert=false)→警觉分支不触发;某状态无能力 id→该状态不触发能力
/// </summary> /// </summary>
public static class PerceptionStateMachine public static class PerceptionStateMachine
{ {
@@ -23,14 +23,12 @@ namespace BaseGames.Enemies
public string Death = "Death"; public string Death = "Death";
public string Entry = "Idle"; // 初始态 public string Entry = "Idle"; // 初始态
public string Rest = "Patrol"; // R:降级(退出追击/警觉丢失)回到的静止态 public string Rest = "Patrol"; // R:降级(退出追击/警觉丢失)回到的静止态
public string ChaseAbilityId; // 追击委托的能力 id(进入追击即触发;退出由 OnChaseExit 中断) // 每状态对应的行为能力 id(AI 进入状态即触发、离开即中断)
public Action<IAiContext> OnIdleEnter; public string IdleAbilityId;
public Action<IAiContext> OnPatrolEnter; public string PatrolAbilityId;
public Action<IAiContext> OnPatrolTick; public string AlertAbilityId;
public Action<IAiContext> OnAlertEnter; public string ChaseAbilityId;
public Action<IAiContext> OnChaseEnter; public string DeathAbilityId;
public Action<IAiContext> OnChaseExit;
public Action<IAiContext> OnDeathEnter;
} }
public static void Add(BrainBuilder b, Config c) public static void Add(BrainBuilder b, Config c)
@@ -38,39 +36,43 @@ namespace BaseGames.Enemies
b.Entry(c.Entry); b.Entry(c.Entry);
b.Global().To(c.Death).OnEvent(AiSignal.Died); // 受击致死 → 死亡(全局最高优先) b.Global().To(c.Death).OnEvent(AiSignal.Died); // 受击致死 → 死亡(全局最高优先)
// 待机 / 巡逻:未发现态,同样的升级转换(追逐优先、其次警觉) // 待机 / 巡逻:未发现态,升级转换相同(追逐优先、其次警觉)
AddUndiscovered(b.State(c.Idle).OnEnter(x => c.OnIdleEnter?.Invoke(x)), c); AddAbilityState(b, c.Idle, c.IdleAbilityId)
AddUndiscovered( .To(c.Chase).When(x => x.Sensor.InChaseZone(), "InChaseZone")
b.State(c.Patrol) .To(c.Alert).When(x => HasAlert(x) && x.Sensor.InVisionZone(), "InVision+HasAlert");
.OnEnter(x => c.OnPatrolEnter?.Invoke(x)) AddAbilityState(b, c.Patrol, c.PatrolAbilityId)
.Tick(x => c.OnPatrolTick?.Invoke(x)), .To(c.Chase).When(x => x.Sensor.InChaseZone(), "InChaseZone")
c); .To(c.Alert).When(x => HasAlert(x) && x.Sensor.InVisionZone(), "InVision+HasAlert");
// 警觉(仅升级路径出现):进追逐区→追击;脱离视野→R;在视野内保持(无转出) // 警觉(仅升级路径出现):进追逐区→追击;脱离视野→R;在视野内保持
b.State(c.Alert) AddAbilityState(b, c.Alert, c.AlertAbilityId)
.OnEnter(x => c.OnAlertEnter?.Invoke(x))
.To(c.Chase).When(x => x.Sensor.InChaseZone(), "InChaseZone") .To(c.Chase).When(x => x.Sensor.InChaseZone(), "InChaseZone")
.To(c.Rest).When(x => !x.Sensor.InVisionZone(), "leftVision"); .To(c.Rest).When(x => !x.Sensor.InVisionZone(), "leftVision");
// 追击:委托能力实现移动/伤害;脱离**全部感知**(追逐区 且 视野区都不在)R(永不回警觉);退出时中断追击能力 // 追击:脱离全部感知(追逐区 且 视野区都不在)R(永不回警觉)。
// 维持用"追逐区 OR 视野区"任一:视野(los)可能被墙挡漏检,仅靠视野会导致玩家在近身追逐区内反复进出追击抖动 // 维持用"追逐区 OR 视野区"任一:视野(los)可能被墙挡漏检,仅靠视野会在近身追逐区内反复进出追击(抖动)
b.State(c.Chase) AddAbilityState(b, c.Chase, c.ChaseAbilityId)
.OnEnter(x =>
{
c.OnChaseEnter?.Invoke(x);
if (!string.IsNullOrEmpty(c.ChaseAbilityId)) x.Combat.UseAbility(c.ChaseAbilityId);
})
.OnExit(x => c.OnChaseExit?.Invoke(x))
.To(c.Rest).When(x => !x.Sensor.InChaseZone() && !x.Sensor.InVisionZone(), "leftAllZones"); .To(c.Rest).When(x => !x.Sensor.InChaseZone() && !x.Sensor.InVisionZone(), "leftAllZones");
b.State(c.Death).OnEnter(x => c.OnDeathEnter?.Invoke(x)); // 死亡:终态(无转出);死亡演出走物理状态机
AddAbilityState(b, c.Death, c.DeathAbilityId);
} }
// 未发现态(Idle/Patrol)升级:在追逐区→追击(优先);否则 有警觉且在视野→警觉 /// <summary>
static void AddUndiscovered(BrainBuilder.StateBuilder sb, Config c) /// 一个"由能力驱动行为"的状态:进入即确保能力运行;每帧确保能力运行(被中断/受击后自动重触发);离开即中断。
/// </summary>
static BrainBuilder.StateBuilder AddAbilityState(BrainBuilder b, string state, string abilityId)
{ {
sb.To(c.Chase).When(x => x.Sensor.InChaseZone(), "InChaseZone") return b.State(state)
.To(c.Alert).When(x => HasAlert(x) && x.Sensor.InVisionZone(), "InVision+HasAlert"); .OnEnter(x => EnsureAbility(x, abilityId))
.Tick(x => EnsureAbility(x, abilityId))
.OnExit(x => x.Combat.InterruptAbilities());
}
static void EnsureAbility(IAiContext x, string abilityId)
{
if (!string.IsNullOrEmpty(abilityId) && !x.Combat.IsAbilityRunning(abilityId))
x.Combat.UseAbility(abilityId);
} }
static bool HasAlert(IAiContext x) => x is IEnemyActor a && a.HasAlertState; static bool HasAlert(IAiContext x) => x is IEnemyActor a && a.HasAlertState;
@@ -0,0 +1,32 @@
using System.Collections;
using Animancer;
using UnityEngine;
namespace BaseGames.Enemies.Abilities
{
/// <summary>
/// 警觉行为能力:停下 + 朝向玩家 + Alert 阶段(播警觉动画/feedback)。持续朝向玩家直到被打断。
/// "警觉态朝向角色"等行为归本能力,AI 只在进入警觉状态时触发。
/// </summary>
public class AlertAbility : EnemyAbilityBase
{
[Header("警觉动画(可选,留空则用 AnimConfig.Alert 阶段动画)")]
[SerializeField] private ClipTransition _alertClip;
protected override IEnumerator ExecuteCoroutine()
{
Phase = AbilityRunState.Active;
_enemy.SetAiPhase(AiPhase.Alert); // 阶段动画 + 广播(供群体警戒等)
if (_alertClip.Clip != null)
_animancer.Play(_alertClip);
while (true)
{
_enemy.StopMovement(); // 保持静止
if (_enemy.PlayerTransform != null)
_enemy.FaceTarget(_enemy.PlayerTransform.position); // 朝向玩家
yield return null;
}
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c51a5a3300c5d2549b3f8826d8c54fa8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -23,6 +23,11 @@ namespace BaseGames.Enemies.Abilities
{ {
Phase = AbilityRunState.Active; Phase = AbilityRunState.Active;
// 追击行为的速度/阶段声明归本能力(AI 只触发能力,不做这些执行)
if (_enemy.Nav != null && _enemy.Stats != null)
_enemy.Nav.SetSpeed(_enemy.Stats.RunSpeed);
_enemy.SetAiPhase(AiPhase.Chase);
if (_loopClip.Clip != null) if (_loopClip.Clip != null)
_animancer.Play(_loopClip); _animancer.Play(_loopClip);
@@ -0,0 +1,20 @@
using System.Collections;
namespace BaseGames.Enemies.Abilities
{
/// <summary>
/// 待机行为能力:停下 + 声明 Idle 阶段(播 Idle/伪装动画)。保持到被 AI 切换状态时打断。
/// 由 AI 决策层在进入待机状态时触发(AI 只决策,行为在此实现)。
/// </summary>
public class IdleAbility : EnemyAbilityBase
{
protected override IEnumerator ExecuteCoroutine()
{
Phase = AbilityRunState.Active;
_enemy.StopMovement();
_enemy.SetAiPhase(AiPhase.Idle);
while (true) // 保持待机(占用运行态)直到被打断
yield return null;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 599faa708ea4a0f4b96ca9a3691523d7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,32 @@
using System.Collections;
namespace BaseGames.Enemies.Abilities
{
/// <summary>
/// 巡逻行为能力:巡逻速度 + Patrol 阶段(播 Walk 动画) + 经导航随机游走。保持到被打断。
/// 移动执行归本能力,AI 只在进入巡逻状态时触发。
/// </summary>
public class PatrolAbility : EnemyAbilityBase
{
protected override IEnumerator ExecuteCoroutine()
{
Phase = AbilityRunState.Active;
_enemy.SetAiPhase(AiPhase.Patrol);
var nav = _enemy.Nav;
if (nav != null && _enemy.Stats != null)
nav.SetSpeed(_enemy.Stats.WalkSpeed);
while (true)
{
if (nav != null && !nav.IsMoving)
nav.WalkToRandom(); // 到达后再选一个随机可达点,持续游走
yield return null;
}
}
protected override void OnInterrupted(InterruptReason reason)
{
_enemy.Nav?.StopNavigation(); // 退出巡逻时清除残留游走目标
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 36ef5fe655e471c448e7c1300355888b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: