Refactor event channels and update layer specifications

- Removed StatusEffectEventChannelSO and its associated meta file.
- Updated CreateEventChannelAssets to handle new shield-related events.
- Added CharmModule for managing charm assets in the DataHub.
- Introduced CharmEventChannelSO for charm equipped/unequipped events.
- Changed layer references from "Ground" to "Platform" in various scripts.
- Updated documentation to reflect changes in layer specifications.
- Created new event assets for ShieldBroken, ShieldRestored, StatusEffectApplied, and StatusEffectExpired.
This commit is contained in:
2026-05-21 11:08:14 +08:00
parent 280c7b22f5
commit d09bc95c3f
32 changed files with 1151 additions and 52 deletions

View File

@@ -9,7 +9,7 @@ MonoBehaviour:
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 933f8f3ce17ee54409502057bd1a8138, type: 3}
m_Script: {fileID: 11500000, guid: e2aa7161466b28442acab31ae092166b, type: 3}
m_Name: EVT_StatusEffect
m_EditorClassIdentifier:
description:

View File

@@ -9,7 +9,7 @@ MonoBehaviour:
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 07c5881d0d5ca3c42949a79f40939c3e, type: 3}
m_Script: {fileID: 11500000, guid: 23dad55c2f7bcc54a92ed61cc6f27c5b, type: 3}
m_Name: EVT_EnemyDied
m_EditorClassIdentifier:
description:

View File

@@ -0,0 +1,15 @@
%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: 07c5881d0d5ca3c42949a79f40939c3e, type: 3}
m_Name: EVT_ShieldBroken
m_EditorClassIdentifier:
description:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 7a0c8af06b9f6cd43a91c5bebf16c02e
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,15 @@
%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: 07c5881d0d5ca3c42949a79f40939c3e, type: 3}
m_Name: EVT_ShieldRestored
m_EditorClassIdentifier:
description:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 06d4a7d44ce8bb0499aabf79ba7c556c
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,15 @@
%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: e2aa7161466b28442acab31ae092166b, type: 3}
m_Name: EVT_StatusEffectApplied
m_EditorClassIdentifier:
description:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c997085e0266fa54b9fa0af69e233acf
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,15 @@
%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: e2aa7161466b28442acab31ae092166b, type: 3}
m_Name: EVT_StatusEffectExpired
m_EditorClassIdentifier:
description:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 22c7ddc89ed054845951143148cd3671
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,15 @@
%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: ce6e33f4353535944a0d2573df0a08d4, type: 3}
m_Name: EVT_FormChanged
m_EditorClassIdentifier:
description:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 9e1af94c61bb1c04ebc829f3838714f4
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,15 @@
%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: 07c5881d0d5ca3c42949a79f40939c3e, type: 3}
m_Name: EVT_SkillSetChanged
m_EditorClassIdentifier:
description:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 249630b7ebe7a094299413cc67c4f3d1
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -9,7 +9,7 @@ MonoBehaviour:
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 0}
m_Script: {fileID: 11500000, guid: 2700003909ad60e4ba4b04d06f97805e, type: 3}
m_Name: EVT_CharmEquipped
m_EditorClassIdentifier: BaseGames.Equipment:BaseGames.Equipment:CharmEventChannelSO
m_EditorClassIdentifier:
description:

View File

@@ -9,7 +9,7 @@ MonoBehaviour:
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 0}
m_Script: {fileID: 11500000, guid: 2700003909ad60e4ba4b04d06f97805e, type: 3}
m_Name: EVT_CharmUnequipped
m_EditorClassIdentifier: BaseGames.Equipment:BaseGames.Equipment:CharmEventChannelSO
m_EditorClassIdentifier:
description:

View File

@@ -0,0 +1,15 @@
%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: 07c5881d0d5ca3c42949a79f40939c3e, type: 3}
m_Name: EVT_EquipmentChanged
m_EditorClassIdentifier:
description:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 29e6d061ce1f5c84d97e7c922de612b5
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1683,6 +1683,37 @@ MonoBehaviour:
_noiseFrequency: 1
_dedicatedCamera: {fileID: 1927356012}
_dedicatedPriority: 20
--- !u!1 &93002960
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 93002961}
m_Layer: 0
m_Name: SkillHitBox_Slot
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &93002961
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 93002960}
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: 810054649}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &97891550
GameObject:
m_ObjectHideFlags: 0
@@ -9585,6 +9616,37 @@ Transform:
m_Children: []
m_Father: {fileID: 975324245}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &499342000
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 499342001}
m_Layer: 0
m_Name: '[WeaponSocket]'
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &499342001
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 499342000}
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: 810054649}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &501567083
GameObject:
m_ObjectHideFlags: 0
@@ -9959,6 +10021,37 @@ PolygonCollider2D:
- {x: -4.5, y: 2.5}
- {x: -9, y: 2.5}
m_UseDelaunayMesh: 0
--- !u!1 &515876610
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 515876611}
m_Layer: 0
m_Name: CameraFollowTarget
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &515876611
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 515876610}
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: 810054649}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &522010460
GameObject:
m_ObjectHideFlags: 0
@@ -14461,6 +14554,495 @@ Transform:
- {fileID: 1652340852}
m_Father: {fileID: 325293347}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &810054628
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 810054649}
- component: {fileID: 810054648}
- component: {fileID: 810054647}
- component: {fileID: 810054646}
- component: {fileID: 810054645}
- component: {fileID: 810054644}
- component: {fileID: 810054643}
- component: {fileID: 810054642}
- component: {fileID: 810054641}
- component: {fileID: 810054640}
- component: {fileID: 810054639}
- component: {fileID: 810054638}
- component: {fileID: 810054637}
- component: {fileID: 810054636}
- component: {fileID: 810054635}
- component: {fileID: 810054634}
- component: {fileID: 810054633}
- component: {fileID: 810054632}
- component: {fileID: 810054631}
- component: {fileID: 810054630}
- component: {fileID: 810054629}
m_Layer: 9
m_Name: Player
m_TagString: Player
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &810054629
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 810054628}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e20d2200567c4ca4d8fa1a047c7bbd58, type: 3}
m_Name:
m_EditorClassIdentifier:
_movementConfig: {fileID: 11400000, guid: aaeed7ed77ef4834ab211f378120f275, type: 2}
_animConfig: {fileID: 11400000, guid: 01fef0a964bfffd478226e04bbe3aeef, type: 2}
_inputReader: {fileID: 11400000, guid: 88fadef8bc554e04483edd7418d20aa2, type: 2}
_formConfig: {fileID: 11400000, guid: 8f33c49c9bd20ac47a6867f1f19f24a9, type: 2}
_combat: {fileID: 810054641}
_formController: {fileID: 810054640}
_weaponManager: {fileID: 810054639}
_skillManager: {fileID: 810054638}
_springSystem: {fileID: 810054637}
_parrySystem: {fileID: 810054636}
_hurtBox: {fileID: 2035363631}
_shield: {fileID: 810054635}
_wallDetector: {fileID: 810054634}
_onPlayerDied: {fileID: 11400000, guid: 7e1624bde83886d40b32f43e84a65a75, type: 2}
_onPlayerSpawned: {fileID: 11400000, guid: 7e2c7e614f6627b449a244ab44443adf, type: 2}
_debugValidateTransitions: 1
_dbg_CurrentState:
_dbg_IsGrounded: 0
_dbg_AirJumpsLeft: 0
_dbg_CanDash: 0
_dbg_IsInvincible: 0
--- !u!114 &810054630
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 810054628}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 323fa3d8339022e4bbd37c12332f151a, type: 3}
m_Name:
m_EditorClassIdentifier:
_jumpBufferDuration: 0.15
_attackBufferDuration: 0.12
_dashBufferDuration: 0.1
_dbg_JumpBuffer: 0
_dbg_AttackBuffer: 0
_dbg_DashBuffer: 0
--- !u!114 &810054631
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 810054628}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 708938b7c3d75b244abcbd30ed589461, type: 3}
m_Name:
m_EditorClassIdentifier:
_onStatusEffectApplied: {fileID: 11400000, guid: c997085e0266fa54b9fa0af69e233acf, type: 2}
_onStatusEffectExpired: {fileID: 11400000, guid: 22c7ddc89ed054845951143148cd3671, type: 2}
--- !u!114 &810054632
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 810054628}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fab214bcdee30844bb3399c3b487cffa, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!114 &810054633
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 810054628}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 04d451c14acfa56429344271570fa468, type: 3}
m_Name:
m_EditorClassIdentifier:
_config: {fileID: 11400000, guid: f167dd4c0f40ff7499127f917066994a, type: 2}
_charmCatalog: {fileID: 11400000, guid: 62b057558c311d649ba7d5d91633b544, type: 2}
_onCharmEquipped: {fileID: 11400000, guid: ee78daff0aae5d64786323b1924fa103, type: 2}
_onCharmUnequipped: {fileID: 11400000, guid: d0a080ccb93b4cb4e9a4cbe8e96a7007, type: 2}
_onEquipmentChanged: {fileID: 11400000, guid: 29e6d061ce1f5c84d97e7c922de612b5, type: 2}
_onAchievementNotchGranted: {fileID: 11400000, guid: 80a81891f339dce4096ac6ea88b3de84, type: 2}
--- !u!114 &810054634
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 810054628}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 03bafd68d1793e44f9650296d658a4aa, type: 3}
m_Name:
m_EditorClassIdentifier:
_config: {fileID: 11400000, guid: aaeed7ed77ef4834ab211f378120f275, type: 2}
_wallLayer:
serializedVersion: 2
m_Bits: 8388608
--- !u!114 &810054635
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 810054628}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f362045054d7c1945841c4ccbcb356e8, type: 3}
m_Name:
m_EditorClassIdentifier:
_config: {fileID: 11400000, guid: 3550acd79ad72c743942cbacb3c25c97, type: 2}
_onShieldBrokenChannel: {fileID: 11400000, guid: 7a0c8af06b9f6cd43a91c5bebf16c02e, type: 2}
_onShieldRestoredChannel: {fileID: 11400000, guid: 06d4a7d44ce8bb0499aabf79ba7c556c, type: 2}
--- !u!114 &810054636
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 810054628}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 14872ec0b53eece49a121f13ca519009, type: 3}
m_Name:
m_EditorClassIdentifier:
_config: {fileID: 11400000, guid: f65119f9e65b51b4db2b17a0ae3d0fd3, type: 2}
_onParrySuccess: {fileID: 11400000, guid: 076c05f6f5c5cf6459a804ed2e61dc1b, type: 2}
--- !u!114 &810054637
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 810054628}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1f57bdff3327d2d478779d844b114c83, type: 3}
m_Name:
m_EditorClassIdentifier:
_stats: {fileID: 810054643}
_onEnemyDied: {fileID: 11400000, guid: def849e2c5ec8204eae6b083b02307aa, type: 2}
--- !u!114 &810054638
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 810054628}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fb39b928827b10245aeab5ea41f862a5, type: 3}
m_Name:
m_EditorClassIdentifier:
_stats: {fileID: 810054643}
_animancer: {fileID: 810054645}
_input: {fileID: 11400000, guid: 88fadef8bc554e04483edd7418d20aa2, type: 2}
_formController: {fileID: 810054640}
_modifiers: {fileID: 810054632}
_skillSocket: {fileID: 93002961}
_formSkillSets: []
--- !u!114 &810054639
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 810054628}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6620d87234b5a9b4c811905861cd32fd, type: 3}
m_Name:
m_EditorClassIdentifier:
_formController: {fileID: 810054640}
_startingWeapon: {fileID: 0}
_weaponSocket: {fileID: 499342001}
--- !u!114 &810054640
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 810054628}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: cbcc6974256e3fb40879694b4bf2d2dc, type: 3}
m_Name:
m_EditorClassIdentifier:
_config: {fileID: 11400000, guid: 8f33c49c9bd20ac47a6867f1f19f24a9, type: 2}
_input: {fileID: 11400000, guid: 88fadef8bc554e04483edd7418d20aa2, type: 2}
_onFormChanged: {fileID: 11400000, guid: 9e1af94c61bb1c04ebc829f3838714f4, type: 2}
_onSkillSetChanged: {fileID: 11400000, guid: 249630b7ebe7a094299413cc67c4f3d1, type: 2}
--- !u!114 &810054641
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 810054628}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 9d978725c6a901c4da85041223e2b0ee, type: 3}
m_Name:
m_EditorClassIdentifier:
_weaponManager: {fileID: 810054639}
--- !u!114 &810054642
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 810054628}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 263a07a0eb148924cbcf284def379a3f, type: 3}
m_Name:
m_EditorClassIdentifier:
_config: {fileID: 11400000, guid: aaeed7ed77ef4834ab211f378120f275, type: 2}
_groundCheck: {fileID: 1852300736}
_groundCheckSize: {x: 0.8, y: 0.05}
_groundLayer:
serializedVersion: 2
m_Bits: 0
_dbg_Position:
_dbg_VelocityX: 0
_dbg_VelocityY: 0
_dbg_IsGrounded: 0
_dbg_HasCoyoteTime: 0
_dbg_IsWallLeft: 0
_dbg_IsWallRight: 0
_dbg_CancelWindowOpen: 0
_dbg_FacingDirection: 0
--- !u!114 &810054643
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 810054628}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: edd28a350d3cebe46a72e7550ffb1b93, type: 3}
m_Name:
m_EditorClassIdentifier:
_config: {fileID: 11400000, guid: eaaee0817c0cc9e449142241ad75827e, type: 2}
_onHPChanged: {fileID: 11400000, guid: b5a2264ba6cf6544ebc53a67b5074d89, type: 2}
_onMaxHPChanged: {fileID: 11400000, guid: 34f14924fad74884aac7b2bd6fbad649, type: 2}
_onSoulPowerChanged: {fileID: 11400000, guid: 3694bb359f4ba5f40a6cba067478578c, type: 2}
_onSpiritPowerChanged: {fileID: 11400000, guid: 0f20a330a4808d24e808e6978151dbc4, type: 2}
_onSpringChargesChanged: {fileID: 11400000, guid: bb26bdee697c4b64682cf30d02579ca4, type: 2}
_onLingZhuChanged: {fileID: 11400000, guid: c83ba0a4579d72c449930ee9c57318df, type: 2}
_onAbilityUnlocked: {fileID: 11400000, guid: a8b3a59db23ed8d48970b73c8c2e3092, type: 2}
_onDifficultyChanged: {fileID: 11400000, guid: 156874a2ffc17694e91e949abbf97fee, type: 2}
_dbg_HP:
_dbg_Soul:
_dbg_Spirit:
_dbg_Spring:
_dbg_IsInvincible: 0
_dbg_InvincibleTimer: 0
_dbg_GodMode: 0
_dbg_Abilities:
--- !u!212 &810054644
SpriteRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 810054628}
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: a97c105638bdf8b4a8650670310a4cd3, 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!114 &810054645
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 810054628}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0ad50f81b1d25c441943c37a89ba23f6, type: 3}
m_Name:
m_EditorClassIdentifier:
_Animator: {fileID: 810054646}
_Transitions: {fileID: 0}
_ActionOnDisable: 0
--- !u!95 &810054646
Animator:
serializedVersion: 5
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 810054628}
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!61 &810054647
BoxCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 810054628}
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.5, y: 0.5}
oldSize: {x: 1, y: 1}
newSize: {x: 1, y: 1}
adaptiveTilingThreshold: 0.5
drawMode: 0
adaptiveTiling: 0
m_AutoTiling: 0
serializedVersion: 2
m_Size: {x: 1, y: 1}
m_EdgeRadius: 0
--- !u!50 &810054648
Rigidbody2D:
serializedVersion: 4
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 810054628}
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: 1
m_SleepingMode: 1
m_CollisionDetection: 1
m_Constraints: 4
--- !u!4 &810054649
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 810054628}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -23.547367, y: 3.988164, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 2035363633}
- {fileID: 499342001}
- {fileID: 1852300736}
- {fileID: 93002961}
- {fileID: 515876611}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &811095057
GameObject:
m_ObjectHideFlags: 0
@@ -29293,6 +29875,37 @@ Transform:
m_Children: []
m_Father: {fileID: 2015266179}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1852300735
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1852300736}
m_Layer: 0
m_Name: GroundCheck
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1852300736
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1852300735}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: -0.75, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 810054649}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1855767594
GameObject:
m_ObjectHideFlags: 0
@@ -32466,6 +33079,98 @@ Transform:
m_CorrespondingSourceObject: {fileID: 7501110767542530711, guid: e9d9216d17e7b684096c94e8c347d46f, type: 3}
m_PrefabInstance: {fileID: 1627895894}
m_PrefabAsset: {fileID: 0}
--- !u!1 &2035363630
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2035363633}
- component: {fileID: 2035363632}
- component: {fileID: 2035363631}
m_Layer: 15
m_Name: HurtBox
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &2035363631
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2035363630}
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!61 &2035363632
BoxCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2035363630}
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_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: 1, y: 1}
m_EdgeRadius: 0
--- !u!4 &2035363633
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2035363630}
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: 810054649}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &2043241451
GameObject:
m_ObjectHideFlags: 0
@@ -34099,3 +34804,4 @@ SceneRoots:
- {fileID: 1865796631}
- {fileID: 1354690328}
- {fileID: 783576435}
- {fileID: 810054649}

View File

@@ -1,7 +0,0 @@
using UnityEngine;
namespace BaseGames.Core.Events
{
[CreateAssetMenu(menuName = "BaseGames/Events/StatusEffect")]
public class StatusEffectEventChannelSO : BaseEventChannelSO<StatusEffectType> { }
}

View File

@@ -2,6 +2,7 @@ using UnityEngine;
using UnityEditor;
using BaseGames.Core.Events;
using BaseGames.Combat;
using BaseGames.Combat.StatusEffects;
using BaseGames.Equipment;
using BaseGames.Parry;
using BaseGames.Player;
@@ -54,6 +55,8 @@ namespace BaseGames.Editor
CreateAsset<VoidEventChannelSO> ("Combat", "EVT_CheckpointRespawn");
CreateAsset<StatusEffectEventChannelSO> ("Combat", "EVT_StatusEffectApplied");
CreateAsset<StatusEffectEventChannelSO> ("Combat", "EVT_StatusEffectExpired");
CreateAsset<VoidEventChannelSO> ("Combat", "EVT_ShieldBroken");
CreateAsset<VoidEventChannelSO> ("Combat", "EVT_ShieldRestored");
// ── Boss ──────────────────────────────────────────────────────────
CreateAsset<BossSkillEventChannelSO> ("Boss", "EVT_BossSkill");
@@ -180,6 +183,13 @@ namespace BaseGames.Editor
return;
}
// 存在但类型不匹配(如旧版残留),先删除再重建
if (AssetDatabase.LoadMainAssetAtPath(fullPath) != null)
{
AssetDatabase.DeleteAsset(fullPath);
Debug.Log($"[CreateEventChannelAssets] 已删除旧类型资产: {fullPath}");
}
T asset = ScriptableObject.CreateInstance<T>();
AssetDatabase.CreateAsset(asset, fullPath);
Debug.Log($"[CreateEventChannelAssets] 已创建: {fullPath}");

View File

@@ -75,6 +75,7 @@ namespace BaseGames.Editor
_modules.Add(new EnemyModule());
_modules.Add(new FormModule());
_modules.Add(new BossSkillModule());
_modules.Add(new CharmModule());
}
// ── 布局 ─────────────────────────────────────────────────────────────

View File

@@ -0,0 +1,211 @@
using System;
using UnityEditor;
using UnityEditor.UIElements;
using UnityEngine;
using UnityEngine.UIElements;
using BaseGames.Equipment;
namespace BaseGames.Editor.Modules
{
/// <summary>
/// DataHub 护符模块 —— Tab 切换管理 CharmCatalogSO目录和 CharmSO护符资产。
/// </summary>
public class CharmModule : IDataModule
{
private const string CharmFolder = "Assets/_Game/Data/Progression/Charms";
private const string CatalogPrefix = "CHM_Catalog";
private const string CharmPrefix = "CHM_";
public string ModuleId => "charm";
public string DisplayName => "护符";
public string IconName => null;
private int _activeTab = 0; // 0 = 目录, 1 = 护符
private SoListPane<CharmCatalogSO> _catalogPane;
private SoListPane<CharmSO> _charmPane;
private Action<UnityEngine.Object> _onSelected;
private DetailHeader _header;
private CharmCatalogSO _selectedCatalog;
private CharmSO _selectedCharm;
public void Initialize()
{
_catalogPane = new SoListPane<CharmCatalogSO>(CharmFolder, CatalogPrefix);
_catalogPane.SelectionChanged = s => { _selectedCatalog = s; _onSelected?.Invoke(s); };
_charmPane = new SoListPane<CharmSO>(CharmFolder, CharmPrefix,
c => $"{c.notchCost}格");
_charmPane.SelectionChanged = s => { _selectedCharm = s; _onSelected?.Invoke(s); };
}
public void BuildListPane(VisualElement container, Action<UnityEngine.Object> onSelected)
{
_onSelected = onSelected;
container.style.flexDirection = FlexDirection.Column;
// Tab bar
var tabBar = new VisualElement();
tabBar.style.flexDirection = FlexDirection.Row;
tabBar.style.borderBottomWidth = 1;
tabBar.style.borderBottomColor = new StyleColor(new Color(0.5f, 0.5f, 0.5f, 0.3f));
container.Add(tabBar);
var btnCatalog = BuildTabBtn("目录", 0, tabBar);
var btnCharms = BuildTabBtn("护符", 1, tabBar);
var listArea = new VisualElement();
listArea.style.flexGrow = 1;
container.Add(listArea);
var tabs = new[] { btnCatalog, btnCharms };
ShowTab(0, listArea, tabs);
btnCatalog.clicked += () => ShowTab(0, listArea, tabs);
btnCharms.clicked += () => ShowTab(1, listArea, tabs);
_catalogPane.Refresh();
_charmPane.Refresh();
}
public void BuildDetailPane(VisualElement container, UnityEngine.Object selected)
{
_header = new DetailHeader();
_header.SetAsset(selected);
_header.RenameRequested += name => OnRenameRequested(selected, name);
container.Add(_header);
if (selected == null) return;
if (selected is CharmCatalogSO catalog)
{
container.Add(BuildCatalogActionBar(catalog));
container.Add(SkillModule.MakeDivider());
container.Add(new InspectorElement(catalog));
}
else if (selected is CharmSO charm)
{
container.Add(BuildCharmCard(charm));
container.Add(BuildCharmActionBar(charm));
container.Add(SkillModule.MakeDivider());
container.Add(new InspectorElement(charm));
}
}
public void OnActivated()
{
_catalogPane?.Refresh();
_charmPane?.Refresh();
}
// ── Tab UI ────────────────────────────────────────────────────────────
private Button BuildTabBtn(string text, int tabIdx, VisualElement bar)
{
var btn = new Button { text = text };
btn.style.flexGrow = 1;
btn.style.paddingTop = 5;
btn.style.paddingBottom = 5;
btn.style.borderTopLeftRadius = 0;
btn.style.borderTopRightRadius = 0;
btn.style.borderBottomLeftRadius = 0;
btn.style.borderBottomRightRadius = 0;
btn.style.borderLeftWidth = 0;
btn.style.borderRightWidth = 0;
btn.style.borderTopWidth = 0;
btn.style.borderBottomWidth = 0;
btn.style.backgroundColor = new StyleColor(Color.clear);
btn.userData = tabIdx;
bar.Add(btn);
return btn;
}
private void ShowTab(int tab, VisualElement area, Button[] tabBtns)
{
_activeTab = tab;
area.Clear();
for (int i = 0; i < tabBtns.Length; i++)
{
if (i == tab)
{
tabBtns[i].style.borderBottomWidth = 2;
tabBtns[i].style.borderBottomColor = new StyleColor(new Color(0.4f, 0.65f, 1f, 1f));
tabBtns[i].style.opacity = 1f;
}
else
{
tabBtns[i].style.borderBottomWidth = 0;
tabBtns[i].style.opacity = 0.65f;
}
}
if (tab == 0) { _catalogPane.style.flexGrow = 1; area.Add(_catalogPane); }
else { _charmPane.style.flexGrow = 1; area.Add(_charmPane); }
}
// ── 重命名 ────────────────────────────────────────────────────────────
private void OnRenameRequested(UnityEngine.Object asset, string newName)
{
var (ok, err) = AssetOperations.Rename(asset, newName);
if (!ok) EditorUtility.DisplayDialog("重命名失败", err, "确定");
else
{
_header.SetAsset(asset);
if (_activeTab == 0) _catalogPane.Invalidate();
else _charmPane.Invalidate();
}
}
// ── CharmCatalogSO 详情 ───────────────────────────────────────────────
private VisualElement BuildCatalogActionBar(CharmCatalogSO catalog)
{
var bar = SkillModule.MakeActionBar();
new Button(() => { EditorGUIUtility.PingObject(catalog); Selection.activeObject = catalog; })
{ text = "定位" }.AlsoAddTo(bar);
return bar;
}
// ── CharmSO 详情 ──────────────────────────────────────────────────────
private static VisualElement BuildCharmCard(CharmSO c)
{
var card = SkillModule.MakeCard();
SkillModule.AddChip(card, "ID", string.IsNullOrEmpty(c.charmId) ? "-" : c.charmId);
SkillModule.AddChip(card, "格数", $"{c.notchCost}");
SkillModule.AddChip(card, "效果数", $"{c.effects?.Count ?? 0}");
if (c.isUnique)
SkillModule.AddChip(card, "限定", "唯一");
return card;
}
private VisualElement BuildCharmActionBar(CharmSO charm)
{
var bar = SkillModule.MakeActionBar();
new Button(() => { EditorGUIUtility.PingObject(charm); Selection.activeObject = charm; })
{ text = "定位" }.AlsoAddTo(bar);
new Button(() => { var c = AssetOperations.Clone(charm, CharmFolder); if (c != null) _charmPane.Refresh(c); })
{ text = "克隆..." }.AlsoAddTo(bar);
var del = new Button(() => { if (AssetOperations.Delete(charm)) _charmPane.Refresh(null); }) { text = "删除" };
ApplyDeleteStyle(del);
del.AlsoAddTo(bar);
return bar;
}
// ── 共用 ─────────────────────────────────────────────────────────────
private static void ApplyDeleteStyle(Button btn)
{
var c = new StyleColor(new Color(0.8f, 0.3f, 0.3f, 0.6f));
btn.style.borderLeftColor = c;
btn.style.borderRightColor = c;
btn.style.borderTopColor = c;
btn.style.borderBottomColor = c;
btn.style.borderLeftWidth = 1;
btn.style.borderRightWidth = 1;
btn.style.borderTopWidth = 1;
btn.style.borderBottomWidth = 1;
btn.style.marginLeft = 8;
}
}
}

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 933f8f3ce17ee54409502057bd1a8138
guid: e5ccd6c2a03bdd144b0a6351e2b90803
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

@@ -95,7 +95,7 @@ namespace BaseGames.Editor
Transform groundCheckT = GetOrCreateChild(root.transform, "GroundCheck");
groundCheckT.localPosition = new Vector3(0f, -0.75f, 0f);
AssignReference(playerMovement, "_groundCheck", groundCheckT, report);
AssignLayerMask(playerMovement, "_groundLayer", "Ground", report);
AssignLayerMask(playerMovement, "_groundLayer", "Platform", report);
// ── SkillHitBox_Slot 子节点(技能 HitBox 实例化挂点)────────────────
Transform skillSocketT = GetOrCreateChild(root.transform, "SkillHitBox_Slot");
@@ -129,11 +129,11 @@ namespace BaseGames.Editor
AssignReference(skillManager, "_modifiers", GetOrAddComponent<SkillModifierRegistry>(root), report);
AssignReference(skillManager, "_skillSocket", skillSocketT, report);
// PlayerWallDetector 墙壁检测层Wall + Ground 组合)
// PlayerWallDetector 墙壁检测层Wall + Platform 组合)
{
int wallMask = 0;
int wallL = LayerMask.NameToLayer("Wall");
int groundL = LayerMask.NameToLayer("Ground");
int groundL = LayerMask.NameToLayer("Platform");
if (wallL != -1) wallMask |= 1 << wallL;
if (groundL != -1) wallMask |= 1 << groundL;
if (wallMask != 0)
@@ -143,7 +143,7 @@ namespace BaseGames.Editor
if (wsp != null) { wsp.intValue = wallMask; wso.ApplyModifiedPropertiesWithoutUndo(); }
}
else
report.Add("★ Layer 'Wall'/'Ground' 不存在PlayerWallDetector._wallLayer 未赋值。");
report.Add("★ Layer 'Wall'/'Platform' 不存在PlayerWallDetector._wallLayer 未赋值。");
}
// ── 事件频道(可选,缺失时跳过) ───────────────────────────────────
@@ -169,6 +169,8 @@ namespace BaseGames.Editor
AssignAsset(equipmentManager, "_onAchievementNotchGranted", report, false, "EVT_AchievementNotchGranted");
AssignAsset(statusEffectManager, "_onStatusEffectApplied", report, false, "EVT_StatusEffectApplied");
AssignAsset(statusEffectManager, "_onStatusEffectExpired", report, false, "EVT_StatusEffectExpired");
AssignAsset(shield, "_onShieldBrokenChannel", report, false, "EVT_ShieldBroken");
AssignAsset(shield, "_onShieldRestoredChannel", report, false, "EVT_ShieldRestored");
// ── Config SO 自动查找(资产存在时自动绑定)──────────────────────
Object statsConfig = FindFirstAsset("PLY_PlayerStats");
@@ -178,7 +180,7 @@ namespace BaseGames.Editor
Object shieldConfig = FindFirstAsset("PLY_ShieldConfig");
Object inputReader = FindFirstAsset("InputReader");
Object equipmentConfig = FindFirstAsset("PLY_EquipmentConfig");
Object charmCatalog = FindFirstAsset("PLY_CharmCatalog");
Object charmCatalog = FindFirstAsset("CHM_Catalog");
Object animConfig = FindFirstAsset("PLY_PlayerAnimationConfig");
if (statsConfig != null) AssignReference(playerStats, "_config", statsConfig, report);
@@ -752,7 +754,7 @@ namespace BaseGames.Editor
GameObject go = new GameObject("GroundPlatform");
Undo.RegisterCreatedObjectUndo(go, "Place Ground Platform");
go.transform.position = GetDropPosition();
SetLayer(go, "Ground", report);
SetLayer(go, "Platform", report);
// 2D Sprite用 localScale 设定尺寸,让 SpriteRenderer 和 BoxCollider2D 同步缩放
go.transform.localScale = new Vector3(8f, 0.5f, 1f);
@@ -774,7 +776,7 @@ namespace BaseGames.Editor
GameObject go = new GameObject("MovingPlatform");
Undo.RegisterCreatedObjectUndo(go, "Place Moving Platform");
go.transform.position = GetDropPosition();
SetLayer(go, "Ground", report);
SetLayer(go, "Platform", report);
Rigidbody2D rb = GetOrAddComponent<Rigidbody2D>(go);
rb.bodyType = RigidbodyType2D.Kinematic;
@@ -820,7 +822,7 @@ namespace BaseGames.Editor
GetOrAddComponent<Grid>(gridGo);
GameObject groundGo = GetOrCreateChild(gridGo.transform, "Ground").gameObject;
SetLayer(groundGo, "Ground", report);
SetLayer(groundGo, "Platform", report);
GetOrAddComponent<Tilemap>(groundGo);
GetOrAddComponent<TilemapRenderer>(groundGo);
TilemapCollider2D tilemapCollider = GetOrAddComponent<TilemapCollider2D>(groundGo);
@@ -859,7 +861,7 @@ namespace BaseGames.Editor
GameObject go = new GameObject("Obstacle");
Undo.RegisterCreatedObjectUndo(go, "Place Obstacle");
go.transform.position = GetDropPosition();
SetLayer(go, "Ground", report);
SetLayer(go, "Platform", report);
// 2D Sprite用 localScale 设定尺寸,让 SpriteRenderer 和 BoxCollider2D 同步缩放
go.transform.localScale = new Vector3(1f, 1f, 1f);

View File

@@ -352,9 +352,9 @@ namespace BaseGames.Editor
GetOrAddComponent<Grid>(gridGo);
GameObject groundTileGo = GetOrCreateChild(gridGo.transform, "Ground").gameObject;
int groundLayer = LayerMask.NameToLayer("Ground");
int groundLayer = LayerMask.NameToLayer("Platform");
if (groundLayer >= 0) groundTileGo.layer = groundLayer;
else report.Add("Layer 'Ground' 不存在,请在 Tags and Layers 中创建。");
else report.Add("Layer 'Platform' 不存在,请在 Tags and Layers 中创建。");
GetOrAddComponent<Tilemap>(groundTileGo);
GetOrAddComponent<TilemapRenderer>(groundTileGo);

View File

@@ -14,14 +14,14 @@ namespace BaseGames.Editor
/// · PlayerHitBox ↔ EnemyHurtBox → 应碰撞(玩家攻击伤害敌人)
/// · EnemyHitBox ↔ PlayerHurtBox → 应碰撞(敌人攻击伤害玩家)
/// · EnemyHitBox ↔ EnemyHurtBox → 应碰撞敌人可互相伤害HitBox 运行时排除自身根节点)
/// · Player ↔ Ground → 应碰撞(玩家站在地面上)
/// · Enemy ↔ Ground → 应碰撞(敌人站在地面上)
/// · Player ↔ Platform → 应碰撞(玩家站在平台上)
/// · Enemy ↔ Platform → 应碰撞(敌人站在平台上)
/// · PlayerProjectile ↔ EnemyHurtBox → 应碰撞(玩家投射物伤害敌人)
/// · PlayerProjectile ↔ PlayerHurtBox → 应忽略(玩家投射物不自伤)
/// · PlayerProjectile ↔ Ground → 应碰撞(玩家投射物命中地形)
/// · PlayerProjectile ↔ Platform → 应碰撞(玩家投射物命中地形)
/// · EnemyProjectile ↔ PlayerHurtBox → 应碰撞(敌人投射物伤害玩家)
/// · EnemyProjectile ↔ EnemyHurtBox → 应忽略(敌人投射物不自伤)
/// · EnemyProjectile ↔ Ground → 应碰撞(敌人投射物命中地形)
/// · EnemyProjectile ↔ Platform → 应碰撞(敌人投射物命中地形)
/// · PlayerHitBox ↔ PlayerHurtBox → 应忽略(玩家不自伤)
/// · PlayerProjectile ↔ EnemyProjectile → 应忽略子弹不互相碰撞Clash 系统单独处理)
/// · HazardHitBox ↔ PlayerHurtBox → 应碰撞(环境危险伤害玩家)
@@ -37,14 +37,14 @@ namespace BaseGames.Editor
new("PlayerHitBox", "EnemyHurtBox", true, "玩家攻击伤害敌人"),
new("EnemyHitBox", "PlayerHurtBox", true, "敌人攻击伤害玩家"),
new("EnemyHitBox", "EnemyHurtBox", true, "敌人可互相伤害HitBox 运行时排除自身根节点)"),
new("Player", "Ground", true, "玩家站在地面上"),
new("Enemy", "Ground", true, "敌人站在地面上"),
new("Player", "Platform", true, "玩家站在平台上"),
new("Enemy", "Platform", true, "敌人站在平台上"),
new("PlayerProjectile", "EnemyHurtBox", true, "玩家投射物伤害敌人"),
new("PlayerProjectile", "PlayerHurtBox", false, "玩家投射物不自伤"),
new("PlayerProjectile", "Ground", true, "玩家投射物命中地形"),
new("PlayerProjectile", "Platform", true, "玩家投射物命中地形"),
new("EnemyProjectile", "PlayerHurtBox", true, "敌人投射物伤害玩家"),
new("EnemyProjectile", "EnemyHurtBox", false, "敌人投射物不自伤"),
new("EnemyProjectile", "Ground", true, "敌人投射物命中地形"),
new("EnemyProjectile", "Platform", true, "敌人投射物命中地形"),
new("PlayerHitBox", "PlayerHurtBox", false, "玩家不自伤"),
new("PlayerProjectile", "EnemyProjectile", false, "子弹不互相碰撞Clash 系统单独处理)"),
new("HazardHitBox", "PlayerHurtBox", true, "环境危险伤害玩家"),

View File

@@ -0,0 +1,11 @@
using UnityEngine;
using BaseGames.Core.Events;
namespace BaseGames.Equipment
{
/// <summary>
/// 护符事件频道EVT_CharmEquipped / EVT_CharmUnequipped
/// </summary>
[CreateAssetMenu(menuName = "BaseGames/Events/CharmEvent")]
public class CharmEventChannelSO : BaseEventChannelSO<CharmSO> { }
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2700003909ad60e4ba4b04d06f97805e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,6 +1,5 @@
using System.Collections.Generic;
using UnityEngine;
using BaseGames.Core.Events;
namespace BaseGames.Equipment
{
@@ -33,10 +32,4 @@ namespace BaseGames.Equipment
public bool isUnique;
public string unlockHint;
}
/// <summary>
/// 护符事件频道EVT_CharmEquipped / EVT_CharmUnequipped
/// </summary>
[CreateAssetMenu(menuName = "BaseGames/Events/CharmEvent")]
public class CharmEventChannelSO : BaseEventChannelSO<CharmSO> { }
}

View File

@@ -13,7 +13,7 @@ namespace BaseGames.Player
{
[SerializeField] private PlayerMovementConfigSO _config;
[Header("墙壁 Layer默认使用 \"Wall\" + \"Ground\"")]
[Header("墙壁 Layer默认使用 \"Wall\" + \"Platform\"")]
[SerializeField] private LayerMask _wallLayer;
/// <summary>当前是否正在触碰墙壁。</summary>
@@ -69,7 +69,7 @@ namespace BaseGames.Player
private bool CheckPhysicalContact(int direction)
{
if (_rb == null) return false;
LayerMask mask = _wallLayer != 0 ? _wallLayer : LayerMask.GetMask("Wall", "Ground");
LayerMask mask = _wallLayer != 0 ? _wallLayer : LayerMask.GetMask("Wall", "Platform");
var filter = new ContactFilter2D();
filter.SetLayerMask(mask);
filter.useTriggers = false;
@@ -94,7 +94,7 @@ namespace BaseGames.Player
Vector2 center = transform.position;
float len = _config.WallRayLength;
float oy = _config.WallRayOffsetY;
int layer = _wallLayer != 0 ? (int)_wallLayer : LayerMask.GetMask("Wall", "Ground");
int layer = _wallLayer != 0 ? (int)_wallLayer : LayerMask.GetMask("Wall", "Platform");
bool top = Physics2D.Raycast(center + Vector2.up * oy, dir, len, layer);
bool bot = Physics2D.Raycast(center + Vector2.down * oy, dir, len, layer);