第一次分包

This commit is contained in:
2026-07-28 22:56:35 +08:00
parent 149afafeff
commit f4aef59114
37 changed files with 3607 additions and 2001 deletions
@@ -15,7 +15,7 @@ MonoBehaviour:
m_DefaultGroup: a263e71fce79f2f4cb5b5f1fa6b7291a
m_currentHash:
serializedVersion: 2
Hash: 00000000000000000000000000000000
Hash: 3b5966ded4e5ce389a0746e8c0fed56e
m_OptimizeCatalogSize: 0
m_BuildRemoteCatalog: 0
m_BundleLocalCatalog: 0
@@ -44,6 +44,9 @@ MonoBehaviour:
m_BuildAddressablesWithPlayerBuild: 0
m_overridePlayerVersion: '[UnityEditor.PlayerSettings.bundleVersion]'
m_GroupAssets:
- {fileID: 11400000, guid: fcc697a6587205543acfb2a32347c100, type: 2}
- {fileID: 11400000, guid: c0b3b611be2f4f24f9d72d2676e58d51, type: 2}
- {fileID: 11400000, guid: b4f01f1670cc33f4587db7361d183233, type: 2}
- {fileID: 11400000, guid: 427f94f67624e374895487c87f881a7f, type: 2}
- {fileID: 11400000, guid: ca4eb1ed7a9a8bc4bbcc5d865fd723a4, type: 2}
- {fileID: 11400000, guid: 59a1dc2550990aa4091c8db201571a43, type: 2}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,25 @@
%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: bbb281ee3bf0b054c82ac2347e9e782c, type: 3}
m_Name: DefaultUIRes
m_EditorClassIdentifier:
m_GroupName: DefaultUIRes
m_Data:
m_SerializedData: []
m_GUID: 3b428ea15d9f11247b852d88069ff147
m_SerializeEntries: []
m_ReadOnly: 0
m_Settings: {fileID: 11400000, guid: 3d7ea06370502a34e82011fabf822b45, type: 2}
m_SchemaSet:
m_Schemas:
- {fileID: 11400000, guid: 6e9c04c23195ec94ea236b049fe7931f, type: 2}
- {fileID: 11400000, guid: 78c584769ae331a4ca706a64f2abd7ec, type: 2}
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b4f01f1670cc33f4587db7361d183233
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -24,6 +24,13 @@ MonoBehaviour:
- FLZY
- TuJian
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 06ef6f0f536b12d4a8316c86690dcd9c
m_Address: Assets/MyGame/aa/Game/FLZY/BOSS/LLBT/192.prefab
m_ReadOnly: 0
m_SerializedLabels:
- FLZY
- FishPrefab
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 0cd51f364bf224541a595b0817dc5bc4
m_Address: Assets/Art/FengLei/Fish/72.prefab
m_ReadOnly: 0
@@ -80,6 +87,13 @@ MonoBehaviour:
- Audio
- FLZY
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 194e09c929d77b4428470b6f3861cbaf
m_Address: Assets/MyGame/aa/Game/FLZY/BOSS/YGLG/6005.prefab
m_ReadOnly: 0
m_SerializedLabels:
- FLZY
- FishPrefab
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 1baaf377fa6c3da4785d0851b33c8ce4
m_Address: Assets/Art/TuJianFishTexture/61.png
m_ReadOnly: 0
@@ -514,6 +528,11 @@ MonoBehaviour:
- FLZY
- TuJian
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: a96966a1d55149a4f83724f224013303
m_Address: Assets/MyGame/aa/Game/FLZY/BOSS/UI_baojiang.prefab
m_ReadOnly: 0
m_SerializedLabels: []
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: af03a136dfedc244d89cab3a7c36d545
m_Address: Assets/Art/FengLei/Fish/20.prefab
m_ReadOnly: 0
@@ -591,6 +610,13 @@ MonoBehaviour:
- FLZY
- FishPrefab
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: c9f25dea73210cc4eba14ea75fa09335
m_Address: Assets/MyGame/aa/Game/FLZY/BOSS/DLY/6012.prefab
m_ReadOnly: 0
m_SerializedLabels:
- FLZY
- FishPrefab
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: cf8e34438b547aa4da548aa14c16a6e4
m_Address: Assets/Art/FengLei/Audio/FLZY_AOEElectricSound.ogg
m_ReadOnly: 0
@@ -1354,6 +1354,13 @@ MonoBehaviour:
- Audio
- HHWK
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: ae438186bfb617b40b4ec378716d6bb6
m_Address: Assets/MyGame/aa/Game/HHWK/Boss/YiLong/Game177_yilong.prefab
m_ReadOnly: 0
m_SerializedLabels:
- FishPrefab
- HHWK
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: aea76cccaa9bd744982d40c9c7f8073f
m_Address: Assets/game_download/games/game177/prefab/fish/Game177_fish99.prefab
m_ReadOnly: 0
@@ -0,0 +1,67 @@
%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: bbb281ee3bf0b054c82ac2347e9e782c, type: 3}
m_Name: GameUIRes
m_EditorClassIdentifier:
m_GroupName: GameUIRes
m_Data:
m_SerializedData: []
m_GUID: 075fda2b6983cca4e9f4bcbfb6aca58e
m_SerializeEntries:
- m_GUID: 0f3c050e7d9ca3b43910c8f2f587d0b7
m_Address: Assets/MyGame/aa/UI/Game/YYSC/GameMainPanel_YYSC.prefab
m_ReadOnly: 0
m_SerializedLabels:
- Default
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 7fc72821c53ff6a40b70a711c3d091c6
m_Address: Assets/MyGame/aa/UI/Game/XJMH/GameMainPanelXJMH.prefab
m_ReadOnly: 0
m_SerializedLabels:
- Default
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 85950025af4bcd64095faaed7c457b63
m_Address: Assets/MyGame/aa/UI/Game/HHWK/GameMainPanel_HHWK.prefab
m_ReadOnly: 0
m_SerializedLabels:
- Default
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 98d405c628d99d3438556c9c6584a9a6
m_Address: Assets/MyGame/aa/UI/Home/Sub/ZSPanel.prefab
m_ReadOnly: 0
m_SerializedLabels:
- Default
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: b1a477a312fd1fb4ca04ccd87deec78b
m_Address: Assets/MyGame/aa/UI/Game/HHWK/Sub/TuJian.prefab
m_ReadOnly: 0
m_SerializedLabels:
- Default
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: b7049b34ef7178248b09689838182b4d
m_Address: Assets/MyGame/aa/UI/Game/FLZY/GameMainPanel_FLZY.prefab
m_ReadOnly: 0
m_SerializedLabels:
- Default
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: ee76d1620c700034ea6e509cc403623c
m_Address: Assets/MyGame/aa/UI/Game/GameMainPanel_Default.prefab
m_ReadOnly: 0
m_SerializedLabels:
- Default
FlaggedDuringContentUpdateRestriction: 0
m_ReadOnly: 0
m_Settings: {fileID: 11400000, guid: 3d7ea06370502a34e82011fabf822b45, type: 2}
m_SchemaSet:
m_Schemas:
- {fileID: 11400000, guid: 1561e3aec3bb13946b7c2788a32cc910, type: 2}
- {fileID: 11400000, guid: b8af0d16f3131f448992d4a9055ca6a0, type: 2}
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: fcc697a6587205543acfb2a32347c100
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -10,9 +10,9 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: bbb281ee3bf0b054c82ac2347e9e782c, type: 3}
m_Name: MainUIRes
m_Name: HomeUIRes
m_EditorClassIdentifier:
m_GroupName: MainUIRes
m_GroupName: HomeUIRes
m_Data:
m_SerializedData: []
m_GUID: 9c5deb37dc4f7554bad33e89eb9c647d
@@ -29,24 +29,12 @@ MonoBehaviour:
m_SerializedLabels:
- MainUI
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 2747065c60c27ae40baf688575ba2606
m_Address: Assets/MyGame/aa/UI/Login/SubPanel/RegisterPanel.prefab
m_ReadOnly: 0
m_SerializedLabels:
- MainUI
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 2ae29ff90f8f1ba42aafd95293932c59
m_Address: Assets/MyGame/aa/UI/Home/Sub/ServicePanel.prefab
m_ReadOnly: 0
m_SerializedLabels:
- MainUI
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 33618332775bcb9418a7fa185cb02373
m_Address: Assets/MyGame/aa/UI/Login/LoginPanel.prefab
m_ReadOnly: 0
m_SerializedLabels:
- MainUI
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 3712c1898126eac448acd0c68c72be19
m_Address: Assets/MyGame/aa/UI/Home/Sub/SettingPanel.prefab
m_ReadOnly: 0
@@ -59,12 +47,6 @@ MonoBehaviour:
m_SerializedLabels:
- MainUI
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 5077f3d4be776bc4289434d17cf8b8c8
m_Address: Assets/MyGame/aa/UI/Login/SubPanel/LoginEnterPanel.prefab
m_ReadOnly: 0
m_SerializedLabels:
- MainUI
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 53ade1c7d9fc9ce4bb99bdd665dfdb5c
m_Address: Assets/MyGame/aa/UI/Home/Sub/SafeBox.prefab
m_ReadOnly: 0
@@ -131,12 +113,6 @@ MonoBehaviour:
m_SerializedLabels:
- MainUI
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: eb55741a3660b8240be0f2f1c9d6aadb
m_Address: Assets/MyGame/aa/UI/Login/SubPanel/ReSetPassword.prefab
m_ReadOnly: 0
m_SerializedLabels:
- MainUI
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: f11b7edd13b4a7c4fbe9ec65d48a1c4d
m_Address: Assets/MyGame/aa/UI/DefaultPanel/GGL.prefab
m_ReadOnly: 0
@@ -12,11 +12,35 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: bbb281ee3bf0b054c82ac2347e9e782c, type: 3}
m_Name: LoginUIRes
m_EditorClassIdentifier:
m_GroupName: Packed Assets
m_GroupName: LoginUIRes
m_Data:
m_SerializedData: []
m_GUID: 7205a6d30db43d84fbbb82ed27a1c905
m_SerializeEntries: []
m_SerializeEntries:
- m_GUID: 2747065c60c27ae40baf688575ba2606
m_Address: Assets/MyGame/aa/UI/Login/SubPanel/RegisterPanel.prefab
m_ReadOnly: 0
m_SerializedLabels:
- MainUI
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 33618332775bcb9418a7fa185cb02373
m_Address: Assets/MyGame/aa/UI/Login/LoginPanel.prefab
m_ReadOnly: 0
m_SerializedLabels:
- MainUI
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 5077f3d4be776bc4289434d17cf8b8c8
m_Address: Assets/MyGame/aa/UI/Login/SubPanel/LoginEnterPanel.prefab
m_ReadOnly: 0
m_SerializedLabels:
- MainUI
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: eb55741a3660b8240be0f2f1c9d6aadb
m_Address: Assets/MyGame/aa/UI/Login/SubPanel/ReSetPassword.prefab
m_ReadOnly: 0
m_SerializedLabels:
- MainUI
FlaggedDuringContentUpdateRestriction: 0
m_ReadOnly: 0
m_Settings: {fileID: 11400000, guid: 3d7ea06370502a34e82011fabf822b45, type: 2}
m_SchemaSet:
@@ -0,0 +1,45 @@
%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: e5d17a21594effb4e9591490b009e7aa, type: 3}
m_Name: DefaultUIRes_BundledAssetGroupSchema
m_EditorClassIdentifier:
m_Group: {fileID: 11400000, guid: b4f01f1670cc33f4587db7361d183233, type: 2}
m_InternalBundleIdMode: 1
m_Compression: 1
m_IncludeAddressInCatalog: 1
m_IncludeGUIDInCatalog: 1
m_IncludeLabelsInCatalog: 1
m_InternalIdNamingMode: 0
m_CacheClearBehavior: 0
m_IncludeInBuild: 1
m_BundledAssetProviderType:
m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider
m_ForceUniqueProvider: 0
m_UseAssetBundleCache: 1
m_UseAssetBundleCrc: 1
m_UseAssetBundleCrcForCachedBundles: 1
m_UseUWRForLocalBundles: 0
m_Timeout: 0
m_ChunkedTransfer: 0
m_RedirectLimit: -1
m_RetryCount: 0
m_BuildPath:
m_Id: 2dc81615c3947e64493d7c6552a3f24d
m_LoadPath:
m_Id: 6bd5fad857b09dd439c8b71f4ae1a9d8
m_BundleMode: 0
m_AssetBundleProviderType:
m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider
m_BundleNaming: 0
m_AssetLoadMode: 0
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 6e9c04c23195ec94ea236b049fe7931f
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,16 @@
%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: 5834b5087d578d24c926ce20cd31e6d6, type: 3}
m_Name: DefaultUIRes_ContentUpdateGroupSchema
m_EditorClassIdentifier:
m_Group: {fileID: 11400000, guid: b4f01f1670cc33f4587db7361d183233, type: 2}
m_StaticContent: 0
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 78c584769ae331a4ca706a64f2abd7ec
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,45 @@
%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: e5d17a21594effb4e9591490b009e7aa, type: 3}
m_Name: GameUIRes_BundledAssetGroupSchema
m_EditorClassIdentifier:
m_Group: {fileID: 11400000, guid: fcc697a6587205543acfb2a32347c100, type: 2}
m_InternalBundleIdMode: 1
m_Compression: 1
m_IncludeAddressInCatalog: 1
m_IncludeGUIDInCatalog: 1
m_IncludeLabelsInCatalog: 1
m_InternalIdNamingMode: 0
m_CacheClearBehavior: 0
m_IncludeInBuild: 1
m_BundledAssetProviderType:
m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider
m_ForceUniqueProvider: 0
m_UseAssetBundleCache: 1
m_UseAssetBundleCrc: 1
m_UseAssetBundleCrcForCachedBundles: 1
m_UseUWRForLocalBundles: 0
m_Timeout: 0
m_ChunkedTransfer: 0
m_RedirectLimit: -1
m_RetryCount: 0
m_BuildPath:
m_Id: 2dc81615c3947e64493d7c6552a3f24d
m_LoadPath:
m_Id: 6bd5fad857b09dd439c8b71f4ae1a9d8
m_BundleMode: 0
m_AssetBundleProviderType:
m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider
m_BundleNaming: 0
m_AssetLoadMode: 0
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 1561e3aec3bb13946b7c2788a32cc910
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,16 @@
%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: 5834b5087d578d24c926ce20cd31e6d6, type: 3}
m_Name: GameUIRes_ContentUpdateGroupSchema
m_EditorClassIdentifier:
m_Group: {fileID: 11400000, guid: fcc697a6587205543acfb2a32347c100, type: 2}
m_StaticContent: 0
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b8af0d16f3131f448992d4a9055ca6a0
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -10,7 +10,7 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e5d17a21594effb4e9591490b009e7aa, type: 3}
m_Name: MainUIRes_BundledAssetGroupSchema
m_Name: HomeUIRes_BundledAssetGroupSchema
m_EditorClassIdentifier:
m_Group: {fileID: 11400000, guid: 9971f2f92adebd44faa29cc332720d65, type: 2}
m_InternalBundleIdMode: 1
@@ -10,7 +10,7 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5834b5087d578d24c926ce20cd31e6d6, type: 3}
m_Name: MainUIRes_ContentUpdateGroupSchema
m_Name: HomeUIRes_ContentUpdateGroupSchema
m_EditorClassIdentifier:
m_Group: {fileID: 11400000, guid: 9971f2f92adebd44faa29cc332720d65, type: 2}
m_StaticContent: 0
@@ -0,0 +1,45 @@
%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: e5d17a21594effb4e9591490b009e7aa, type: 3}
m_Name: TurretChiBangZhanShenRes_BundledAssetGroupSchema
m_EditorClassIdentifier:
m_Group: {fileID: 11400000, guid: c0b3b611be2f4f24f9d72d2676e58d51, type: 2}
m_InternalBundleIdMode: 1
m_Compression: 1
m_IncludeAddressInCatalog: 1
m_IncludeGUIDInCatalog: 1
m_IncludeLabelsInCatalog: 1
m_InternalIdNamingMode: 0
m_CacheClearBehavior: 0
m_IncludeInBuild: 1
m_BundledAssetProviderType:
m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider
m_ForceUniqueProvider: 0
m_UseAssetBundleCache: 1
m_UseAssetBundleCrc: 1
m_UseAssetBundleCrcForCachedBundles: 1
m_UseUWRForLocalBundles: 0
m_Timeout: 0
m_ChunkedTransfer: 0
m_RedirectLimit: -1
m_RetryCount: 0
m_BuildPath:
m_Id: 2dc81615c3947e64493d7c6552a3f24d
m_LoadPath:
m_Id: 6bd5fad857b09dd439c8b71f4ae1a9d8
m_BundleMode: 0
m_AssetBundleProviderType:
m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider
m_BundleNaming: 0
m_AssetLoadMode: 0
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 810d87db1df1e1544bc160f4a769c3ee
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,16 @@
%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: 5834b5087d578d24c926ce20cd31e6d6, type: 3}
m_Name: TurretChiBangZhanShenRes_ContentUpdateGroupSchema
m_EditorClassIdentifier:
m_Group: {fileID: 11400000, guid: c0b3b611be2f4f24f9d72d2676e58d51, type: 2}
m_StaticContent: 0
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 117684361cb7e504d8cbda46fdd8ee74
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c0b3b611be2f4f24f9d72d2676e58d51
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
+950
View File
@@ -0,0 +1,950 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using UnityEditor;
using UnityEditor.AddressableAssets;
using UnityEditor.AddressableAssets.Settings;
using UnityEngine;
/// <summary>
/// 资源依赖分析器
/// 用于查找某个 Prefab / 资源 关联的所有依赖资源,并标记其在 Addressables 中的归属(Group、Address、Labels),
/// 供 AA 分包调查使用。
/// 菜单:Tools → 资源依赖分析器
/// </summary>
public class AssetDependencyAnalyzer : EditorWindow
{
#region 内部类
[Serializable]
public class DependencyInfo
{
public string assetPath;
public string guid;
public Type type;
public string typeName;
public bool isInAddressables;
public string aaAddress;
public string aaGroup;
public List<string> aaLabels = new List<string>();
public long fileSizeBytes;
public string fileSizeReadable;
}
#endregion
#region 字段
private Vector2 leftScroll;
private Vector2 rightScroll;
private Vector2 statsScroll;
// 输入:单个目标
private UnityEngine.Object targetAsset;
// 批量目标
private List<UnityEngine.Object> batchTargets = new List<UnityEngine.Object>();
private bool useBatchMode = false;
// 收集结果
private List<DependencyInfo> dependencies = new List<DependencyInfo>();
private Dictionary<string, DependencyInfo> dependencyMap = new Dictionary<string, DependencyInfo>();
// 反向查找(谁引用了这个资源)
private readonly Dictionary<string, List<string>> reverseRefMap = new Dictionary<string, List<string>>();
// 过滤
private enum FilterMode
{
All,
InAddressables,
NotInAddressables
}
private FilterMode filterMode = FilterMode.All;
private string typeFilter = "全部";
private string groupFilter = "全部";
private string labelFilter = "全部";
private string pathKeyword = "";
// 展示
private bool showStats = true;
private bool showFilter = true;
private bool showBatchList = true;
// 缓存
private AddressableAssetSettings aaSettings;
private List<string> allGroups = new List<string>();
private List<string> allLabels = new List<string>();
private List<string> allTypes = new List<string>();
private bool includeScripts = false;
private bool deepAnalyze = true;
#endregion
#region 菜单与初始化
[MenuItem("Tools/资源依赖分析器", false, 200)]
public static void OpenWindow()
{
var window = GetWindow<AssetDependencyAnalyzer>("资源依赖分析器");
window.minSize = new Vector2(1000, 600);
window.Show();
}
private void OnEnable()
{
RefreshAACache();
}
private void RefreshAACache()
{
aaSettings = AddressableAssetSettingsDefaultObject.Settings;
allGroups.Clear();
allLabels.Clear();
if (aaSettings != null)
{
foreach (var g in aaSettings.groups)
{
if (g != null) allGroups.Add(g.Name);
}
allLabels.AddRange(aaSettings.GetLabels());
}
}
#endregion
#region 主GUI
private void OnGUI()
{
DrawToolbar();
EditorGUILayout.Space(4);
DrawTargetSelector();
if (showFilter)
{
EditorGUILayout.Space(4);
DrawFilterBar();
}
if (showStats && dependencies.Count > 0)
{
EditorGUILayout.Space(4);
DrawStats();
}
EditorGUILayout.Space(4);
DrawDependencyList();
}
#endregion
#region 工具栏
private void DrawToolbar()
{
EditorGUILayout.BeginHorizontal(EditorStyles.toolbar);
if (GUILayout.Button("分析依赖", EditorStyles.toolbarButton, GUILayout.Width(80)))
{
AnalyzeAll();
}
if (GUILayout.Button("反向查找引用", EditorStyles.toolbarButton, GUILayout.Width(100)))
{
ReverseLookupSelected();
}
if (GUILayout.Button("导出报告", EditorStyles.toolbarButton, GUILayout.Width(80)))
{
ExportReport();
}
if (GUILayout.Button("复制AA地址", EditorStyles.toolbarButton, GUILayout.Width(90)))
{
CopySelectedAddresses();
}
if (GUILayout.Button("加入AA(选中)", EditorStyles.toolbarButton, GUILayout.Width(110)))
{
AddSelectedToAddressables();
}
GUILayout.FlexibleSpace();
if (GUILayout.Button("刷新AA缓存", EditorStyles.toolbarButton, GUILayout.Width(90)))
{
RefreshAACache();
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal(EditorStyles.toolbar);
showFilter = GUILayout.Toggle(showFilter, "过滤", EditorStyles.toolbarButton, GUILayout.Width(50));
showStats = GUILayout.Toggle(showStats, "统计", EditorStyles.toolbarButton, GUILayout.Width(50));
showBatchList = GUILayout.Toggle(showBatchList, "批量列表", EditorStyles.toolbarButton, GUILayout.Width(70));
useBatchMode = GUILayout.Toggle(useBatchMode, "批量模式", EditorStyles.toolbarButton, GUILayout.Width(70));
GUILayout.FlexibleSpace();
includeScripts = GUILayout.Toggle(includeScripts, "包含脚本", GUILayout.Width(80));
deepAnalyze = GUILayout.Toggle(deepAnalyze, "递归依赖", GUILayout.Width(80));
EditorGUILayout.EndHorizontal();
}
#endregion
#region 目标选择
private void DrawTargetSelector()
{
EditorGUILayout.BeginVertical("box");
if (!useBatchMode)
{
EditorGUILayout.LabelField("目标资源(Prefab / 贴图 / 音频 / 材质等,可拖拽)", EditorStyles.boldLabel);
var newObj = EditorGUILayout.ObjectField("目标", targetAsset, typeof(UnityEngine.Object), false);
if (newObj != targetAsset)
{
targetAsset = newObj;
}
EditorGUILayout.HelpBox(
"操作说明:\n" +
"1. 拖拽或选择目标资源(通常是 Prefab)。\n" +
"2. 点击「分析依赖」递归收集所有依赖资源。\n" +
"3. 通过过滤栏查看 AA 内 / 非 AA 资源,便于分包决策。\n" +
"4. 选中非 AA 资源后点击「加入AA」可直接添加到指定 Group。\n" +
"5. 「反向查找引用」会扫描所有 AA 条目,找出谁引用了当前选中资源。",
MessageType.Info);
}
else
{
EditorGUILayout.LabelField("批量目标列表(可拖拽多个资源到下方区域)", EditorStyles.boldLabel);
// 拖拽区域
Rect dropRect = GUILayoutUtility.GetRect(0, 80, GUILayout.ExpandWidth(true));
GUI.Box(dropRect, "拖拽资源到此处添加到批量列表");
HandleDragDrop(dropRect);
// 列表显示
if (showBatchList && batchTargets.Count > 0)
{
leftScroll = EditorGUILayout.BeginScrollView(leftScroll, GUILayout.Height(120));
for (int i = 0; i < batchTargets.Count; i++)
{
EditorGUILayout.BeginHorizontal();
var obj = EditorGUILayout.ObjectField(batchTargets[i], typeof(UnityEngine.Object), false);
if (obj != batchTargets[i]) batchTargets[i] = obj;
if (GUILayout.Button("×", GUILayout.Width(20)))
{
batchTargets.RemoveAt(i);
break;
}
EditorGUILayout.EndHorizontal();
}
EditorGUILayout.EndScrollView();
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("清空列表", GUILayout.Width(80)))
{
batchTargets.Clear();
}
EditorGUILayout.LabelField($"共 {batchTargets.Count} 个目标", EditorStyles.miniLabel);
EditorGUILayout.EndHorizontal();
}
}
EditorGUILayout.EndVertical();
}
private void HandleDragDrop(Rect dropRect)
{
var evt = Event.current;
if (!dropRect.Contains(evt.mousePosition)) return;
if (evt.type == EventType.DragUpdated)
{
DragAndDrop.visualMode = DragAndDropVisualMode.Generic;
evt.Use();
}
else if (evt.type == EventType.DragPerform)
{
DragAndDrop.AcceptDrag();
foreach (var path in DragAndDrop.paths)
{
var obj = AssetDatabase.LoadAssetAtPath<UnityEngine.Object>(path);
if (obj != null && !batchTargets.Contains(obj))
{
batchTargets.Add(obj);
}
}
evt.Use();
}
}
#endregion
#region 过滤栏
private void DrawFilterBar()
{
EditorGUILayout.BeginVertical("box");
EditorGUILayout.BeginHorizontal();
filterMode = (FilterMode)EditorGUILayout.EnumPopup("归属", filterMode, GUILayout.Width(180));
// 类型过滤
var typeOptions = new List<string> { "全部" };
typeOptions.AddRange(allTypes);
int typeIdx = Mathf.Max(0, typeOptions.IndexOf(typeFilter));
typeIdx = EditorGUILayout.Popup("类型", typeIdx, typeOptions.ToArray(), GUILayout.Width(180));
typeFilter = typeOptions[typeIdx];
// Group过滤
var groupOptions = new List<string> { "全部", "(非AA)" };
groupOptions.AddRange(allGroups);
int gIdx = Mathf.Max(0, groupOptions.IndexOf(groupFilter));
gIdx = EditorGUILayout.Popup("Group", gIdx, groupOptions.ToArray(), GUILayout.Width(180));
groupFilter = groupOptions[gIdx];
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
var labelOptions = new List<string> { "全部", "(无标签)" };
labelOptions.AddRange(allLabels);
int lIdx = Mathf.Max(0, labelOptions.IndexOf(labelFilter));
lIdx = EditorGUILayout.Popup("Label", lIdx, labelOptions.ToArray(), GUILayout.Width(180));
labelFilter = labelOptions[lIdx];
pathKeyword = EditorGUILayout.TextField("路径关键字", pathKeyword, GUILayout.Width(220));
if (GUILayout.Button("清空过滤", GUILayout.Width(80)))
{
filterMode = FilterMode.All;
typeFilter = "全部";
groupFilter = "全部";
labelFilter = "全部";
pathKeyword = "";
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.EndVertical();
}
#endregion
#region 统计
private void DrawStats()
{
EditorGUILayout.BeginVertical("box");
EditorGUILayout.LabelField("统计", EditorStyles.boldLabel);
int totalCount = dependencies.Count;
int aaCount = dependencies.Count(d => d.isInAddressables);
int nonAACount = totalCount - aaCount;
long totalSize = dependencies.Sum(d => d.fileSizeBytes);
EditorGUILayout.LabelField($"总依赖数: {totalCount} AA内: {aaCount} 非AA: {nonAACount} 总大小: {FormatSize(totalSize)}");
// 按类型统计
statsScroll = EditorGUILayout.BeginScrollView(statsScroll, GUILayout.Height(140));
var byType = dependencies.GroupBy(d => d.typeName).OrderByDescending(g => g.Count());
EditorGUILayout.LabelField("按类型统计:", EditorStyles.miniBoldLabel);
foreach (var grp in byType)
{
long s = grp.Sum(d => d.fileSizeBytes);
int aaInGroup = grp.Count(d => d.isInAddressables);
EditorGUILayout.LabelField($" {grp.Key}: {grp.Count()} 个 (AA内 {aaInGroup}) 大小 {FormatSize(s)}", EditorStyles.miniLabel);
}
// 按 Group 统计
EditorGUILayout.Space(4);
EditorGUILayout.LabelField("按 AA Group 统计:", EditorStyles.miniBoldLabel);
var byGroup = dependencies.Where(d => d.isInAddressables).GroupBy(d => d.aaGroup).OrderByDescending(g => g.Count());
foreach (var grp in byGroup)
{
long s = grp.Sum(d => d.fileSizeBytes);
EditorGUILayout.LabelField($" {grp.Key}: {grp.Count()} 个 大小 {FormatSize(s)}", EditorStyles.miniLabel);
}
// 非 AA 资源按目录统计
EditorGUILayout.Space(4);
EditorGUILayout.LabelField("非AA资源按目录统计:", EditorStyles.miniBoldLabel);
var nonAAByDir = dependencies
.Where(d => !d.isInAddressables)
.GroupBy(d => Path.GetDirectoryName(d.assetPath)?.Replace('\\', '/'))
.OrderByDescending(g => g.Count());
foreach (var grp in nonAAByDir)
{
long s = grp.Sum(d => d.fileSizeBytes);
EditorGUILayout.LabelField($" {grp.Key}: {grp.Count()} 个 大小 {FormatSize(s)}", EditorStyles.miniLabel);
}
EditorGUILayout.EndScrollView();
EditorGUILayout.EndVertical();
}
#endregion
#region 依赖列表
private void DrawDependencyList()
{
if (dependencies.Count == 0)
{
EditorGUILayout.HelpBox("尚未分析。请选择目标资源后点击「分析依赖」。", MessageType.Info);
return;
}
var filtered = ApplyFilter(dependencies);
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField($"依赖列表 (过滤后: {filtered.Count} / {dependencies.Count})", EditorStyles.boldLabel);
GUILayout.FlexibleSpace();
if (GUILayout.Button("全选非AA", GUILayout.Width(80)))
{
SelectAllNonAA();
}
EditorGUILayout.EndHorizontal();
rightScroll = EditorGUILayout.BeginScrollView(rightScroll);
// 表头
EditorGUILayout.BeginHorizontal("box");
EditorGUILayout.LabelField("", GUILayout.Width(20));
EditorGUILayout.LabelField("资源路径", GUILayout.Width(300));
EditorGUILayout.LabelField("类型", GUILayout.Width(80));
EditorGUILayout.LabelField("大小", GUILayout.Width(70));
EditorGUILayout.LabelField("AA归属", GUILayout.Width(120));
EditorGUILayout.LabelField("Address", GUILayout.Width(150));
EditorGUILayout.LabelField("Labels", GUILayout.Width(150));
EditorGUILayout.EndHorizontal();
foreach (var info in filtered)
{
DrawDependencyRow(info);
}
EditorGUILayout.EndScrollView();
}
private List<DependencyInfo> GetFilteredCache()
{
return ApplyFilter(dependencies);
}
private void SelectAllNonAA()
{
var filtered = GetFilteredCache();
var nonAA = filtered.Where(d => !d.isInAddressables).Select(d => d.assetPath).ToList();
var objs = new List<UnityEngine.Object>();
foreach (var p in nonAA)
{
var o = AssetDatabase.LoadAssetAtPath<UnityEngine.Object>(p);
if (o != null) objs.Add(o);
}
Selection.objects = objs.ToArray();
Debug.Log($"[依赖分析器] 已选中 {objs.Count} 个非AA资源到 Project 视图");
}
private void DrawDependencyRow(DependencyInfo info)
{
EditorGUILayout.BeginHorizontal(GUIStyle.none);
// 复选框(仅展示,不维护勾选状态,使用 Selection.paths 作为统一选择机制)
bool selected = Selection.objects != null && Selection.objects.Any(o =>
o != null && AssetDatabase.GetAssetPath(o) == info.assetPath);
bool newSel = EditorGUILayout.Toggle(selected, GUILayout.Width(20));
if (newSel != selected)
{
var obj = AssetDatabase.LoadAssetAtPath<UnityEngine.Object>(info.assetPath);
if (obj != null)
{
var list = Selection.objects != null ? Selection.objects.ToList() : new List<UnityEngine.Object>();
if (newSel && !list.Contains(obj)) list.Add(obj);
if (!newSel && list.Contains(obj)) list.Remove(obj);
Selection.objects = list.ToArray();
}
}
// 路径(可点击定位)
if (GUILayout.Button(info.assetPath, EditorStyles.label, GUILayout.Width(300)))
{
var obj = AssetDatabase.LoadAssetAtPath<UnityEngine.Object>(info.assetPath);
if (obj != null)
{
EditorGUIUtility.PingObject(obj);
Selection.activeObject = obj;
}
}
EditorGUILayout.LabelField(info.typeName, GUILayout.Width(80));
EditorGUILayout.LabelField(info.fileSizeReadable, GUILayout.Width(70));
// AA 归属(彩色显示)
var oldColor = GUI.color;
GUI.color = info.isInAddressables ? new Color(0.6f, 1f, 0.6f) : new Color(1f, 0.6f, 0.6f);
EditorGUILayout.LabelField(info.isInAddressables ? info.aaGroup : "非AA", GUILayout.Width(120));
GUI.color = oldColor;
EditorGUILayout.LabelField(info.aaAddress ?? "-", GUILayout.Width(150));
EditorGUILayout.LabelField(info.aaLabels.Count > 0 ? string.Join(",", info.aaLabels) : "-", GUILayout.Width(150));
EditorGUILayout.EndHorizontal();
}
private List<DependencyInfo> ApplyFilter(List<DependencyInfo> source)
{
var result = source;
switch (filterMode)
{
case FilterMode.InAddressables:
result = result.Where(d => d.isInAddressables).ToList();
break;
case FilterMode.NotInAddressables:
result = result.Where(d => !d.isInAddressables).ToList();
break;
}
if (typeFilter != "全部")
result = result.Where(d => d.typeName == typeFilter).ToList();
if (groupFilter == "(非AA)")
result = result.Where(d => !d.isInAddressables).ToList();
else if (groupFilter != "全部")
result = result.Where(d => d.isInAddressables && d.aaGroup == groupFilter).ToList();
if (labelFilter == "(无标签)")
result = result.Where(d => d.isInAddressables && d.aaLabels.Count == 0).ToList();
else if (labelFilter != "全部")
result = result.Where(d => d.isInAddressables && d.aaLabels.Contains(labelFilter)).ToList();
if (!string.IsNullOrEmpty(pathKeyword))
result = result.Where(d => d.assetPath.IndexOf(pathKeyword, StringComparison.OrdinalIgnoreCase) >= 0).ToList();
return result;
}
#endregion
#region 分析逻辑
private void AnalyzeAll()
{
dependencies.Clear();
dependencyMap.Clear();
allTypes.Clear();
RefreshAACache();
var targetPaths = new HashSet<string>();
if (useBatchMode)
{
foreach (var obj in batchTargets)
{
if (obj == null) continue;
string p = AssetDatabase.GetAssetPath(obj);
if (!string.IsNullOrEmpty(p)) targetPaths.Add(p);
}
}
else
{
if (targetAsset != null)
{
string p = AssetDatabase.GetAssetPath(targetAsset);
if (!string.IsNullOrEmpty(p)) targetPaths.Add(p);
}
}
if (targetPaths.Count == 0)
{
EditorUtility.DisplayDialog("提示", "请先选择目标资源。", "确定");
return;
}
try
{
EditorUtility.DisplayProgressBar("分析依赖", "正在收集依赖资源...", 0f);
int idx = 0;
foreach (string path in targetPaths)
{
EditorUtility.DisplayProgressBar("分析依赖", $"处理 {path}", (float)idx / targetPaths.Count);
AnalyzeSingle(path);
idx++;
}
// 收集类型列表
allTypes = dependencies.Select(d => d.typeName).Distinct().OrderBy(t => t).ToList();
EditorUtility.ClearProgressBar();
Debug.Log($"[依赖分析器] 分析完成,共 {dependencies.Count} 个依赖资源");
}
catch (Exception e)
{
EditorUtility.ClearProgressBar();
Debug.LogError($"[依赖分析器] 分析失败: {e}");
}
}
private void AnalyzeSingle(string assetPath)
{
if (string.IsNullOrEmpty(assetPath)) return;
// 自身也作为一项
AddDependencyInfo(assetPath);
if (!deepAnalyze) return;
string[] deps = AssetDatabase.GetDependencies(assetPath, true);
foreach (var dep in deps)
{
AddDependencyInfo(dep);
}
}
private void AddDependencyInfo(string assetPath)
{
if (dependencyMap.ContainsKey(assetPath)) return;
if (!includeScripts && assetPath.EndsWith(".cs", StringComparison.OrdinalIgnoreCase))
return;
// 过滤 Editor 仅资源
if (assetPath.StartsWith("Packages/", StringComparison.OrdinalIgnoreCase))
return;
var info = new DependencyInfo
{
assetPath = assetPath,
guid = AssetDatabase.AssetPathToGUID(assetPath)
};
var mainAsset = AssetDatabase.LoadAssetAtPath<UnityEngine.Object>(assetPath);
if (mainAsset != null)
{
info.type = mainAsset.GetType();
info.typeName = info.type.Name;
}
else
{
info.typeName = Path.GetExtension(assetPath).TrimStart('.');
}
// 文件大小
try
{
string fullPath = Path.Combine(Directory.GetParent(Application.dataPath).FullName, assetPath);
if (File.Exists(fullPath))
{
var fi = new FileInfo(fullPath);
info.fileSizeBytes = fi.Length;
info.fileSizeReadable = FormatSize(info.fileSizeBytes);
}
else
{
info.fileSizeBytes = 0;
info.fileSizeReadable = "-";
}
}
catch
{
info.fileSizeBytes = 0;
info.fileSizeReadable = "-";
}
// AA 信息
if (aaSettings != null && !string.IsNullOrEmpty(info.guid))
{
var entry = aaSettings.FindAssetEntry(info.guid);
if (entry != null)
{
info.isInAddressables = true;
info.aaAddress = entry.address;
info.aaGroup = entry.parentGroup != null ? entry.parentGroup.Name : "(未知)";
info.aaLabels = entry.labels.ToList();
}
}
dependencies.Add(info);
dependencyMap[assetPath] = info;
}
#endregion
#region 反向查找
private void ReverseLookupSelected()
{
if (aaSettings == null)
{
EditorUtility.DisplayDialog("提示", "Addressables 未初始化。", "确定");
return;
}
var selected = Selection.objects;
if (selected == null || selected.Length == 0)
{
EditorUtility.DisplayDialog("提示", "请先在 Project 视图中选择目标资源。", "确定");
return;
}
reverseRefMap.Clear();
var targetGuids = new HashSet<string>();
foreach (var obj in selected)
{
string p = AssetDatabase.GetAssetPath(obj);
if (!string.IsNullOrEmpty(p))
{
string g = AssetDatabase.AssetPathToGUID(p);
if (!string.IsNullOrEmpty(g)) targetGuids.Add(g);
}
}
try
{
EditorUtility.DisplayProgressBar("反向查找", "正在遍历 AA 条目...", 0f);
var allEntries = aaSettings.groups.SelectMany(g => g.entries).ToList();
int idx = 0;
int matched = 0;
foreach (var entry in allEntries)
{
idx++;
if (idx % 50 == 0)
EditorUtility.DisplayProgressBar("反向查找", $"扫描 {idx}/{allEntries.Count}", (float)idx / allEntries.Count);
string entryPath = AssetDatabase.GUIDToAssetPath(entry.guid);
if (string.IsNullOrEmpty(entryPath)) continue;
string[] deps = AssetDatabase.GetDependencies(entryPath, true);
foreach (var dep in deps)
{
string depGuid = AssetDatabase.AssetPathToGUID(dep);
if (targetGuids.Contains(depGuid))
{
if (!reverseRefMap.ContainsKey(dep))
reverseRefMap[dep] = new List<string>();
if (!reverseRefMap[dep].Contains(entryPath))
reverseRefMap[dep].Add(entryPath);
matched++;
}
}
}
EditorUtility.ClearProgressBar();
var sb = new StringBuilder();
sb.AppendLine($"反向查找完成,命中 {matched} 处引用。");
sb.AppendLine();
foreach (var kv in reverseRefMap)
{
sb.AppendLine($"【目标】{kv.Key}");
foreach (var refPath in kv.Value)
{
string refGuid = AssetDatabase.AssetPathToGUID(refPath);
var refEntry = aaSettings.FindAssetEntry(refGuid);
string aaInfo = refEntry != null
? $"[AA] {refEntry.parentGroup.Name} / {refEntry.address}"
: "[非AA]";
sb.AppendLine($" ← {refPath} {aaInfo}");
}
sb.AppendLine();
}
string savePath = EditorUtility.SaveFilePanel("保存反向查找报告", Application.dataPath, "ReverseLookupReport", "txt");
if (!string.IsNullOrEmpty(savePath))
{
File.WriteAllText(savePath, sb.ToString(), Encoding.UTF8);
EditorUtility.DisplayDialog("完成", $"报告已保存到:\n{savePath}", "确定");
}
else
{
Debug.Log(sb.ToString());
}
}
catch (Exception e)
{
EditorUtility.ClearProgressBar();
Debug.LogError($"[依赖分析器] 反向查找失败: {e}");
}
}
#endregion
#region 导出报告
private void ExportReport()
{
if (dependencies.Count == 0)
{
EditorUtility.DisplayDialog("提示", "请先分析依赖。", "确定");
return;
}
string savePath = EditorUtility.SaveFilePanel("导出依赖报告", Application.dataPath, "DependencyReport", "csv");
if (string.IsNullOrEmpty(savePath)) return;
var sb = new StringBuilder();
sb.AppendLine("AssetPath,GUID,Type,Size,IsInAA,AAGroup,AAAddress,AALabels");
foreach (var info in dependencies)
{
sb.AppendLine(string.Join(",",
EscapeCsv(info.assetPath),
info.guid,
info.typeName,
info.fileSizeBytes,
info.isInAddressables,
EscapeCsv(info.aaGroup ?? ""),
EscapeCsv(info.aaAddress ?? ""),
EscapeCsv(string.Join(";", info.aaLabels))));
}
File.WriteAllText(savePath, sb.ToString(), Encoding.UTF8);
EditorUtility.DisplayDialog("完成", $"报告已导出到:\n{savePath}", "确定");
Debug.Log($"[依赖分析器] 报告已导出: {savePath}");
}
private string EscapeCsv(string s)
{
if (string.IsNullOrEmpty(s)) return "";
if (s.Contains(",") || s.Contains("\"") || s.Contains("\n"))
{
return "\"" + s.Replace("\"", "\"\"") + "\"";
}
return s;
}
#endregion
#region 复制地址
private void CopySelectedAddresses()
{
var filtered = GetFilteredCache();
var selected = filtered.Where(d =>
Selection.objects != null &&
Selection.objects.Any(o => o != null && AssetDatabase.GetAssetPath(o) == d.assetPath))
.ToList();
if (selected.Count == 0)
{
EditorUtility.DisplayDialog("提示", "请先在下方列表勾选资源。", "确定");
return;
}
var sb = new StringBuilder();
foreach (var info in selected)
{
sb.AppendLine(info.aaAddress ?? info.assetPath);
}
GUIUtility.systemCopyBuffer = sb.ToString();
Debug.Log($"[依赖分析器] 已复制 {selected.Count} 条地址到剪贴板");
}
#endregion
#region 加入AA
private void AddSelectedToAddressables()
{
if (aaSettings == null)
{
EditorUtility.DisplayDialog("错误", "Addressables 未初始化。", "确定");
return;
}
var filtered = GetFilteredCache();
var selected = filtered.Where(d =>
Selection.objects != null &&
Selection.objects.Any(o => o != null && AssetDatabase.GetAssetPath(o) == d.assetPath))
.ToList();
if (selected.Count == 0)
{
EditorUtility.DisplayDialog("提示", "请先在下方列表勾选资源。", "确定");
return;
}
// 选择 Group
var groupNames = aaSettings.groups.Where(g => g != null).Select(g => g.Name).ToArray();
int choice = EditorUtility.DisplayDialogComplex(
"选择目标 Group",
$"将 {selected.Count} 个资源添加到哪个 Group?",
groupNames.Length > 0 ? groupNames[0] : "Default",
groupNames.Length > 1 ? groupNames[1] : "Cancel",
groupNames.Length > 2 ? "其他..." : "Cancel");
if (choice == 2)
{
// 弹出菜单选择
var menu = new GenericMenu();
foreach (var gn in groupNames)
{
var captured = gn;
menu.AddItem(new GUIContent(gn), false, () => DoAddToGroup(selected, captured));
}
menu.ShowAsContext();
return;
}
else if (choice >= 0 && choice < groupNames.Length)
{
DoAddToGroup(selected, groupNames[choice]);
}
}
private void DoAddToGroup(List<DependencyInfo> list, string groupName)
{
var group = aaSettings.groups.FirstOrDefault(g => g != null && g.Name == groupName);
if (group == null)
{
EditorUtility.DisplayDialog("错误", $"找不到 Group: {groupName}", "确定");
return;
}
int count = 0;
var errors = new List<string>();
foreach (var info in list)
{
if (string.IsNullOrEmpty(info.guid))
{
errors.Add($"{info.assetPath}: GUID 为空");
continue;
}
var entry = aaSettings.FindAssetEntry(info.guid);
if (entry == null)
entry = aaSettings.CreateOrMoveEntry(info.guid, group);
if (entry == null)
{
errors.Add($"{info.assetPath}: 创建条目失败");
continue;
}
// 默认 address 用文件名
if (string.IsNullOrEmpty(entry.address) || entry.address == info.guid)
entry.address = Path.GetFileNameWithoutExtension(info.assetPath);
count++;
}
aaSettings.SetDirty(AddressableAssetSettings.ModificationEvent.EntryMoved, null, true);
AssetDatabase.SaveAssets();
// 重新分析刷新
AnalyzeAll();
string msg = $"成功: {count} 个";
if (errors.Count > 0) msg += $"\n失败 {errors.Count} 个:\n" + string.Join("\n", errors);
EditorUtility.DisplayDialog("加入AA完成", msg, "确定");
}
#endregion
#region 工具
private static string FormatSize(long bytes)
{
if (bytes < 1024) return bytes + " B";
if (bytes < 1024 * 1024) return (bytes / 1024.0).ToString("F1") + " KB";
if (bytes < 1024 * 1024 * 1024) return (bytes / (1024.0 * 1024)).ToString("F2") + " MB";
return (bytes / (1024.0 * 1024 * 1024)).ToString("F2") + " GB";
}
#endregion
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 060af9dd0ddeeaf42bc0037480ba839c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+102 -16
View File
@@ -1,4 +1,5 @@
using System.Collections;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using TMPro;
@@ -19,6 +20,11 @@ public class SubUIManager
private readonly Dictionary<UIPanel, string> addressMap = new Dictionary<UIPanel, string>();
public GameObject boardCast_Boss;
// ⭐ prefab 缓存:避免重复 LoadAssetAsync
private readonly Dictionary<UIPanel, GameObject> prefabCache = new Dictionary<UIPanel, GameObject>();
// ⭐ handle 缓存:用于 Addressables.Release
private readonly Dictionary<UIPanel, AsyncOperationHandle<GameObject>> handleCache = new Dictionary<UIPanel, AsyncOperationHandle<GameObject>>();
public void ShowBoardBoss(Sprite sprite, string str)
{
if (sprite!=null)
@@ -120,31 +126,43 @@ public class SubUIManager
existing.Show(args);
return existing;
}
if (!addressMap.TryGetValue(type, out var obj) || obj == null)
{
Debug.LogError($"[SubUI] No prefab for {type}");
return null;
}
// ⭐ 优先用已缓存的 prefab
GameObject prefab = null;
if (prefabCache.TryGetValue(type, out prefab))
{
var instance = GameObject.Instantiate(prefab, parent).GetComponent<SubUIBase>();
instance.uIManager = this;
instance.name = $"Sub_{type}_Panel";
instance.Init(type);
instance.transform.SetAsLastSibling();
panels[type] = instance;
instance.Show(args);
return instance;
}
AsyncOperationHandle<GameObject> handle = Addressables.LoadAssetAsync<GameObject>(address);
await handle.Task; // 等待异步完成
if (handle.Status == AsyncOperationStatus.Succeeded)
{
var prefab = handle.Result;
var instance = Object.Instantiate(prefab, parent).GetComponent<SubUIBase>();
instance.uIManager = this;
instance.name = $"Sub_{type}_Panel";
instance.Init(type);
instance.transform.SetAsLastSibling(); // 新面板放到最上层
panels[type] = instance;
//return instance;
prefabCache[type] = handle.Result;
handleCache[type] = handle;
//var instance = GetOrCreate(type, prefab);
instance.Show(args);
return instance;
var instance2 = GameObject.Instantiate(handle.Result, parent).GetComponent<SubUIBase>();
instance2.uIManager = this;
instance2.name = $"Sub_{type}_Panel";
instance2.Init(type);
instance2.transform.SetAsLastSibling(); // 新面板放到最上层
panels[type] = instance2;
instance2.Show(args);
return instance2;
}
else
{
@@ -175,7 +193,7 @@ public class SubUIManager
if (panels.TryGetValue(type, out var panel) && panel != null)
{
panel.Hide();
Object.Destroy(panel.gameObject);
GameObject.Destroy(panel.gameObject);
}
panels.Remove(type);
}
@@ -187,12 +205,80 @@ public class SubUIManager
if (kv.Value != null)
{
kv.Value.Hide();
Object.Destroy(kv.Value.gameObject);
GameObject.Destroy(kv.Value.gameObject);
}
}
panels.Clear();
}
// ==================== 预加载 / 释放(优化加载速度)==================
/// <summary>
/// 预加载 config 里所有子面板的 prefab 到缓存。
/// 调用时机:父面板 OnShow 时调用,之后打开任何子面板都秒开。
/// </summary>
public async void PreloadAll(System.Action onDone = null)
{
var todo = new List<KeyValuePair<UIPanel, string>>();
foreach (var kv in addressMap)
{
if (!prefabCache.ContainsKey(kv.Key) && !string.IsNullOrEmpty(kv.Value))
todo.Add(kv);
}
if (todo.Count == 0)
{
onDone?.Invoke();
return;
}
var handles = new List<AsyncOperationHandle<GameObject>>();
foreach (var kv in todo)
{
var handle = Addressables.LoadAssetAsync<GameObject>(kv.Value);
handleCache[kv.Key] = handle;
handles.Add(handle);
}
// 等待全部完成
bool allDone = false;
while (!allDone)
{
allDone = true;
foreach (var h in handles)
{
if (!h.IsDone)
{
allDone = false;
break;
}
}
if (!allDone) await Task.Yield();
}
foreach (var kv in todo)
{
if (handleCache.TryGetValue(kv.Key, out var h) && h.Status == AsyncOperationStatus.Succeeded)
prefabCache[kv.Key] = h.Result;
}
onDone?.Invoke();
}
/// <summary>
/// 释放所有 prefab 缓存(父面板销毁时调用)
/// </summary>
public void ReleaseAll()
{
CloseAll();
foreach (var kv in handleCache)
{
Addressables.Release(kv.Value);
}
handleCache.Clear();
prefabCache.Clear();
}
//private UIBase GetOrCreate(UIPanel type,GameObject prefab)
//{
// if (panels.TryGetValue(type, out var existing) && existing != null)
+249 -30
View File
@@ -96,6 +96,11 @@ public class UIManager : MonoSingleton<UIManager>
[SerializeField] public Transform uiRoot;
private Dictionary<UIPanel, string> addressMap = new Dictionary<UIPanel, string>(); //第二种加载
// ⭐ prefab 缓存:避免重复 LoadAssetAsync,第二次打开同一面板秒开
private readonly Dictionary<UIPanel, GameObject> prefabCache = new Dictionary<UIPanel, GameObject>();
// ⭐ handle 缓存:用于 Addressables.Release 释放内存
private readonly Dictionary<UIPanel, AsyncOperationHandle<GameObject>> handleCache = new Dictionary<UIPanel, AsyncOperationHandle<GameObject>>();
public GameObject loadPanel;
public LoadingPanel ShowLoadPanel(VideoClip videoClip, Action action=null)
{
@@ -141,21 +146,28 @@ public class UIManager : MonoSingleton<UIManager>
{
if (addressMap.ContainsKey(type))
{
// 模拟异步:此处可替换为真正的资源加载(Addressables/AssetBundle)
var handle = Addressables.LoadAsset<GameObject>(addressMap[type]);
if (handle.Status == AsyncOperationStatus.Succeeded)
// ⭐ 优先用已缓存的 prefab,避免重复 LoadAsset
GameObject prefab = null;
if (!prefabCache.TryGetValue(type, out prefab))
{
var panel = GetOrCreatePanel(type, handle.Result);
panel?.Show(args);
return (T)panel;
// 使用 LoadAssetAsync + WaitForCompletion 替代已过时的 LoadAsset
var handle = Addressables.LoadAssetAsync<GameObject>(addressMap[type]);
handle.WaitForCompletion();
if (handle.Status == AsyncOperationStatus.Succeeded)
{
prefab = handle.Result;
prefabCache[type] = prefab;
handleCache[type] = handle;
}
else
{
Debug.LogError($"Failed to load UI prefab for {type}");
return null;
}
}
else
{
Debug.LogError($"Failed to load UI prefab for {type}");
return null;
}
var panel = GetOrCreatePanel(type, prefab);
panel?.Show(args);
return (T)panel;
}
else
{
@@ -170,21 +182,28 @@ public class UIManager : MonoSingleton<UIManager>
{
if (addressMap.ContainsKey(type))
{
// 模拟异步:此处可替换为真正的资源加载(Addressables/AssetBundle)
var handle = Addressables.LoadAsset<GameObject>(addressMap[type]);
if (handle.Status == AsyncOperationStatus.Succeeded)
// ⭐ 优先用已缓存的 prefab,避免重复 LoadAsset
GameObject prefab = null;
if (!prefabCache.TryGetValue(type, out prefab))
{
var panel = GetOrCreatePanel(type, handle.Result);
panel?.Show(args);
return panel;
// 使用 LoadAssetAsync + WaitForCompletion 替代已过时的 LoadAsset
var handle = Addressables.LoadAssetAsync<GameObject>(addressMap[type]);
handle.WaitForCompletion();
if (handle.Status == AsyncOperationStatus.Succeeded)
{
prefab = handle.Result;
prefabCache[type] = prefab;
handleCache[type] = handle;
}
else
{
Debug.LogError($"Failed to load UI prefab for {type}");
return null;
}
}
else
{
Debug.LogError($"Failed to load UI prefab for {type}");
return null;
}
var panel = GetOrCreatePanel(type, prefab);
panel?.Show(args);
return panel;
}
else
{
@@ -344,11 +363,21 @@ public class UIManager : MonoSingleton<UIManager>
yield return new WaitForSeconds(YCtime);
if (addressMap.ContainsKey(type))
{
// 模拟异步:此处可替换为真正的资源加载(Addressables/AssetBundle)
// ⭐ 优先用已缓存的 prefab,避免重复 LoadAssetAsync
GameObject prefab = null;
if (prefabCache.TryGetValue(type, out prefab))
{
var panel = GetOrCreatePanel(type, prefab);
panel?.Show(args);
onShown?.Invoke(panel);
yield break;
}
var handle = Addressables.LoadAssetAsync<GameObject>(addressMap[type]);
yield return handle;
if (handle.Status == AsyncOperationStatus.Succeeded)
{
prefabCache[type] = handle.Result;
handleCache[type] = handle;
var panel = GetOrCreatePanel(type, handle.Result);
panel?.Show(args);
onShown?.Invoke(panel);
@@ -371,23 +400,34 @@ public class UIManager : MonoSingleton<UIManager>
if (addressMap.ContainsKey(type))
{
// ⭐ 优先用已缓存的 prefab
GameObject prefab = null;
if (prefabCache.TryGetValue(type, out prefab))
{
UIManager.Instance.Close(ClosePanel);
var panel = GetOrCreatePanel(type, prefab);
panel?.Show(args);
onShown?.Invoke(panel);
yield break;
}
var handle = Addressables.LoadAssetAsync<GameObject>(addressMap[type]);
yield return handle;
if (handle.Status == AsyncOperationStatus.Succeeded)
{
prefabCache[type] = handle.Result;
handleCache[type] = handle;
UIManager.Instance.Close(ClosePanel);
var panel = GetOrCreatePanel(type, handle.Result);
panel?.Show(args);
onShown?.Invoke(panel);
}
else
{
Debug.LogError($"Failed to load UI prefab for {type}");
UIManager.Instance.Get<UIBase>(ClosePanel)?.Show();
}
}
else
{
@@ -481,4 +521,183 @@ public class UIManager : MonoSingleton<UIManager>
}
panels.Clear();
}
// ==================== 预加载 / 释放(优化加载速度)==================
/// <summary>
/// 按 config 中的 group 字段预加载一组面板的 prefab 到缓存。
/// 调用时机:进入某个场景时(如登录成功后 PreloadGroup(Home),进游戏前 PreloadGroup(GameFish))
/// </summary>
public Coroutine PreloadGroup(UIPanelGroup group, Action onDone = null)
{
return StartCoroutine(IEPreloadGroup(group, onDone));
}
private IEnumerator IEPreloadGroup(UIPanelGroup group, Action onDone)
{
if (config == null)
{
onDone?.Invoke();
yield break;
}
// 收集需要加载的条目(跳过已缓存的)
var todo = new System.Collections.Generic.List<UIPanelAddressConfig.PanelEntry>();
foreach (var entry in config.panels)
{
if (entry.group == group && !prefabCache.ContainsKey(entry.type) && !string.IsNullOrEmpty(entry.address))
todo.Add(entry);
}
if (todo.Count == 0)
{
onDone?.Invoke();
yield break;
}
// 并行加载
var handles = new System.Collections.Generic.List<AsyncOperationHandle<GameObject>>();
foreach (var entry in todo)
{
var h = Addressables.LoadAssetAsync<GameObject>(entry.address);
handles.Add(h);
}
// 等待全部完成
bool allDone = false;
while (!allDone)
{
allDone = true;
foreach (var h in handles)
{
if (!h.IsDone)
{
allDone = false;
break;
}
}
if (!allDone) yield return null;
}
// 存入缓存
for (int i = 0; i < todo.Count; i++)
{
if (handles[i].Status == AsyncOperationStatus.Succeeded)
{
prefabCache[todo[i].type] = handles[i].Result;
handleCache[todo[i].type] = handles[i];
}
else
{
Debug.LogWarning($"[PreloadGroup] 加载失败: {todo[i].type}");
}
}
onDone?.Invoke();
}
/// <summary>
/// 按 Addressables Label 预加载(用 Addressables.LoadAssetsAsync 批量加载带该 Label 的资源)。
/// 需要你在 Addressables Groups 窗口给 prefab 打上对应 Label。
/// </summary>
public Coroutine PreloadByLabel(string label, Action onDone = null)
{
return StartCoroutine(IEPreloadByLabel(label, onDone));
}
private IEnumerator IEPreloadByLabel(string label, Action onDone)
{
if (string.IsNullOrEmpty(label))
{
onDone?.Invoke();
yield break;
}
var handle = Addressables.LoadAssetsAsync<GameObject>(label, null);
yield return handle;
if (handle.Status == AsyncOperationStatus.Succeeded)
{
// 按 prefab 名匹配回 UIPanel(prefab 名需与 address 或 type 名对应)
// 这里只缓存到 labelHandleCache,Show 时如果 address 匹配则复用
_labelHandles[label] = handle;
foreach (var prefab in handle.Result)
{
// 用 prefab.name 作为 key 缓存(可选:在 config 里 address == prefab.name 时才能命中)
// 这里不做强制匹配,仅释放用
}
}
else
{
Debug.LogWarning($"[PreloadByLabel] Label '{label}' 加载失败");
}
onDone?.Invoke();
}
/// <summary>Label 预加载的 handle 缓存(用于释放)</summary>
private readonly Dictionary<string, AsyncOperationHandle<IList<GameObject>>> _labelHandles = new Dictionary<string, AsyncOperationHandle<IList<GameObject>>>();
/// <summary>
/// 释放指定分组的 prefab 缓存(退出场景时调用,释放内存)。
/// 会先销毁该组已实例化的面板,再释放 handle。
/// </summary>
public void ReleaseGroup(UIPanelGroup group)
{
if (config == null) return;
foreach (var entry in config.panels)
{
if (entry.group != group) continue;
// 先销毁实例
if (panels.TryGetValue(entry.type, out var panel) && panel != null)
{
panel.Hide();
Destroy(panel.gameObject);
panels.Remove(entry.type);
}
// 再释放 handle
if (handleCache.TryGetValue(entry.type, out var handle))
{
Addressables.Release(handle);
handleCache.Remove(entry.type);
}
prefabCache.Remove(entry.type);
}
}
/// <summary>
/// 释放指定 Label 的预加载资源
/// </summary>
public void ReleaseLabel(string label)
{
if (_labelHandles.TryGetValue(label, out var handle))
{
Addressables.Release(handle);
_labelHandles.Remove(label);
}
}
/// <summary>
/// 释放所有 prefab 缓存(如登出时调用)
/// </summary>
public void ReleaseAll()
{
CloseAll();
foreach (var kv in handleCache)
{
Addressables.Release(kv.Value);
}
handleCache.Clear();
prefabCache.Clear();
foreach (var kv in _labelHandles)
{
Addressables.Release(kv.Value);
}
_labelHandles.Clear();
}
}
@@ -1,4 +1,15 @@
using UnityEngine;
using UnityEngine;
/// <summary>UI 面板分组(用于预加载/释放一批面板)</summary>
public enum UIPanelGroup
{
None = 0,
Login = 1, // 登录相关
Home = 2, // 大厅相关
GameFish = 3, // 捕鱼游戏相关
Chess = 4, // 象棋相关
Common = 5, // 公共弹窗(Tishi/HuoDe/Board/Loading 等)
}
[CreateAssetMenu(fileName = "UIPanelAddressConfig", menuName = "UI/UIPanelAddressConfig")]
public class UIPanelAddressConfig : ScriptableObject
@@ -9,6 +20,8 @@ public class UIPanelAddressConfig : ScriptableObject
public string name;
public UIPanel type;
public string address; // Addressables 名称
[Tooltip("分组:用于 PreloadGroup/ReleaseGroup 批量预加载和释放")]
public UIPanelGroup group;
}
public PanelEntry[] panels;
+7 -1
View File
@@ -908,7 +908,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 22400762, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3}
propertyPath: m_AnchoredPosition.y
value: -0.000019073486
value: -0.000022888184
objectReference: {fileID: 0}
- target: {fileID: 22426080, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3}
propertyPath: m_AnchorMax.x
@@ -6288,6 +6288,12 @@ MonoBehaviour:
isCreateFish: 0
isFrozen: 0
debugSpawnFishNumber: 11043
fishList_All: []
fishList_Small: []
fishList_Boss: []
fishList_HJ: []
fishList_TS: []
fishList_TS_Boss: []
isResources: 0
--- !u!114 &2075409202
MonoBehaviour:
@@ -20,7 +20,7 @@ Texture2D:
m_MipsStripped: 0
m_TextureFormat: 1
m_MipCount: 1
m_IsReadable: 1
m_IsReadable: 0
m_IsPreProcessed: 0
m_IgnoreMipmapLimit: 0
m_MipmapLimitGroupName:
@@ -68,7 +68,7 @@ Texture2D:
m_MipsStripped: 0
m_TextureFormat: 1
m_MipCount: 1
m_IsReadable: 1
m_IsReadable: 0
m_IsPreProcessed: 0
m_IgnoreMipmapLimit: 0
m_MipmapLimitGroupName:
@@ -115,8 +115,8 @@ MonoBehaviour:
m_SourceFontFileGUID: fd74a459621d04a4aab7bfba702e212f
m_SourceFontFile_EditorRef: {fileID: 12800000, guid: fd74a459621d04a4aab7bfba702e212f,
type: 3}
m_SourceFontFile: {fileID: 12800000, guid: fd74a459621d04a4aab7bfba702e212f, type: 3}
m_AtlasPopulationMode: 1
m_SourceFontFile: {fileID: 0}
m_AtlasPopulationMode: 0
m_FaceInfo:
m_FaceIndex: 0
m_FamilyName: Source Han Sans
@@ -11720,6 +11720,21 @@ MonoBehaviour:
m_Scale: 1
m_AtlasIndex: 0
m_ClassDefinitionType: 0
- m_Index: 11986
m_Metrics:
m_Width: 25.234375
m_Height: 24.765625
m_HorizontalBearingX: 2.515625
m_HorizontalBearingY: 23.515625
m_HorizontalAdvance: 29
m_GlyphRect:
m_X: 378
m_Y: 1242
m_Width: 26
m_Height: 26
m_Scale: 1
m_AtlasIndex: 1
m_ClassDefinitionType: 0
- m_Index: 11988
m_Metrics:
m_Width: 25.375
@@ -106490,6 +106505,36 @@ MonoBehaviour:
m_Scale: 1
m_AtlasIndex: 0
m_ClassDefinitionType: 0
- m_Index: 59062
m_Metrics:
m_Width: 6.5625
m_Height: 27.3125
m_HorizontalBearingX: 21.078125
m_HorizontalBearingY: 24.671875
m_HorizontalAdvance: 29
m_GlyphRect:
m_X: 368
m_Y: 1312
m_Width: 7
m_Height: 28
m_Scale: 1
m_AtlasIndex: 1
m_ClassDefinitionType: 0
- m_Index: 59063
m_Metrics:
m_Width: 6.5625
m_Height: 27.3125
m_HorizontalBearingX: 1.359375
m_HorizontalBearingY: 24.671875
m_HorizontalAdvance: 29
m_GlyphRect:
m_X: 368
m_Y: 1347
m_Width: 7
m_Height: 28
m_Scale: 1
m_AtlasIndex: 1
m_ClassDefinitionType: 0
- m_Index: 59066
m_Metrics:
m_Width: 4.671875
@@ -106550,51 +106595,6 @@ MonoBehaviour:
m_Scale: 1
m_AtlasIndex: 0
m_ClassDefinitionType: 0
- m_Index: 59062
m_Metrics:
m_Width: 6.5625
m_Height: 27.3125
m_HorizontalBearingX: 21.078125
m_HorizontalBearingY: 24.671875
m_HorizontalAdvance: 29
m_GlyphRect:
m_X: 368
m_Y: 1312
m_Width: 7
m_Height: 28
m_Scale: 1
m_AtlasIndex: 1
m_ClassDefinitionType: 0
- m_Index: 59063
m_Metrics:
m_Width: 6.5625
m_Height: 27.3125
m_HorizontalBearingX: 1.359375
m_HorizontalBearingY: 24.671875
m_HorizontalAdvance: 29
m_GlyphRect:
m_X: 368
m_Y: 1347
m_Width: 7
m_Height: 28
m_Scale: 1
m_AtlasIndex: 1
m_ClassDefinitionType: 0
- m_Index: 11986
m_Metrics:
m_Width: 25.234375
m_Height: 24.765625
m_HorizontalBearingX: 2.515625
m_HorizontalBearingY: 23.515625
m_HorizontalAdvance: 29
m_GlyphRect:
m_X: 378
m_Y: 1242
m_Width: 26
m_Height: 26
m_Scale: 1
m_AtlasIndex: 1
m_ClassDefinitionType: 0
m_CharacterTable:
- m_ElementType: 1
m_Unicode: 32
@@ -109688,6 +109688,10 @@ MonoBehaviour:
m_Unicode: 21521
m_GlyphIndex: 11985
m_Scale: 1
- m_ElementType: 1
m_Unicode: 21522
m_GlyphIndex: 11986
m_Scale: 1
- m_ElementType: 1
m_Unicode: 21523
m_GlyphIndex: 11988
@@ -134960,6 +134964,14 @@ MonoBehaviour:
m_Unicode: 65281
m_GlyphIndex: 59055
m_Scale: 1
- m_ElementType: 1
m_Unicode: 65288
m_GlyphIndex: 59062
m_Scale: 1
- m_ElementType: 1
m_Unicode: 65289
m_GlyphIndex: 59063
m_Scale: 1
- m_ElementType: 1
m_Unicode: 65292
m_GlyphIndex: 59066
@@ -134976,18 +134988,6 @@ MonoBehaviour:
m_Unicode: 65509
m_GlyphIndex: 59218
m_Scale: 1
- m_ElementType: 1
m_Unicode: 65288
m_GlyphIndex: 59062
m_Scale: 1
- m_ElementType: 1
m_Unicode: 65289
m_GlyphIndex: 59063
m_Scale: 1
- m_ElementType: 1
m_Unicode: 21522
m_GlyphIndex: 11986
m_Scale: 1
m_AtlasTextures:
- {fileID: -5242640295693195929}
- {fileID: -4985352658726325108}
File diff suppressed because it is too large Load Diff