第一次分包
This commit is contained in:
@@ -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:
|
||||
+2
-26
@@ -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:
|
||||
|
||||
+45
@@ -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
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6e9c04c23195ec94ea236b049fe7931f
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+16
@@ -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
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 78c584769ae331a4ca706a64f2abd7ec
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+45
@@ -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
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1561e3aec3bb13946b7c2788a32cc910
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+16
@@ -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
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b8af0d16f3131f448992d4a9055ca6a0
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+1
-1
@@ -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
|
||||
+1
-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
|
||||
+45
@@ -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
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 810d87db1df1e1544bc160f4a769c3ee
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+16
@@ -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
|
||||
+8
@@ -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:
|
||||
@@ -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:
|
||||
@@ -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)
|
||||
@@ -127,24 +133,36 @@ public class SubUIManager
|
||||
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)
|
||||
|
||||
@@ -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]);
|
||||
// ⭐ 优先用已缓存的 prefab,避免重复 LoadAsset
|
||||
GameObject prefab = null;
|
||||
if (!prefabCache.TryGetValue(type, out prefab))
|
||||
{
|
||||
// 使用 LoadAssetAsync + WaitForCompletion 替代已过时的 LoadAsset
|
||||
var handle = Addressables.LoadAssetAsync<GameObject>(addressMap[type]);
|
||||
handle.WaitForCompletion();
|
||||
if (handle.Status == AsyncOperationStatus.Succeeded)
|
||||
{
|
||||
var panel = GetOrCreatePanel(type, handle.Result);
|
||||
panel?.Show(args);
|
||||
return (T)panel;
|
||||
prefab = handle.Result;
|
||||
prefabCache[type] = prefab;
|
||||
handleCache[type] = handle;
|
||||
}
|
||||
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]);
|
||||
// ⭐ 优先用已缓存的 prefab,避免重复 LoadAsset
|
||||
GameObject prefab = null;
|
||||
if (!prefabCache.TryGetValue(type, out prefab))
|
||||
{
|
||||
// 使用 LoadAssetAsync + WaitForCompletion 替代已过时的 LoadAsset
|
||||
var handle = Addressables.LoadAssetAsync<GameObject>(addressMap[type]);
|
||||
handle.WaitForCompletion();
|
||||
if (handle.Status == AsyncOperationStatus.Succeeded)
|
||||
{
|
||||
var panel = GetOrCreatePanel(type, handle.Result);
|
||||
panel?.Show(args);
|
||||
return panel;
|
||||
prefab = handle.Result;
|
||||
prefabCache[type] = prefab;
|
||||
handleCache[type] = handle;
|
||||
}
|
||||
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,11 +400,22 @@ 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);
|
||||
@@ -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;
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user