├── .gitattributes ├── Readme.md ├── Readme.md.meta ├── Resources.meta ├── Resources ├── ResFonts.meta ├── ResFonts │ ├── SourceHanSans-Light-Lite SDF.asset │ ├── SourceHanSans-Light-Lite SDF.asset.meta │ ├── SourceHanSans-Light-Lite.ttf │ └── SourceHanSans-Light-Lite.ttf.meta ├── ResPrefabs.meta ├── ResPrefabs │ ├── HotFixBG.prefab │ ├── HotFixBG.prefab.meta │ ├── HotFixPanel.prefab │ ├── HotFixPanel.prefab.meta │ ├── HotFixProgressPanel.prefab │ ├── HotFixProgressPanel.prefab.meta │ ├── SangoPatchRoot.prefab │ └── SangoPatchRoot.prefab.meta ├── ResSprites.meta └── ResSprites │ ├── Gcg_Loading_Bg2.png │ ├── Gcg_Loading_Bg2.png.meta │ ├── UI_FleurFairDungeon_Btn_Bg.png │ ├── UI_FleurFairDungeon_Btn_Bg.png.meta │ ├── UI_Frm_FungusFighter_Puzzle_Card.png │ ├── UI_Frm_FungusFighter_Puzzle_Card.png.meta │ ├── UI_Img_CoopChapter_2.png │ ├── UI_Img_CoopChapter_2.png.meta │ ├── UI_Img_CoopChapter_3.png │ ├── UI_Img_CoopChapter_3.png.meta │ ├── UI_Irodori_Stage_Btn_Shadow.png │ └── UI_Irodori_Stage_Btn_Shadow.png.meta ├── Scripts.meta ├── Scripts ├── Editor.meta ├── Editor │ ├── Encryption.cs │ ├── Encryption.cs.meta │ ├── SangoUtils_Patch_YooAsset.Editor.asmdef │ └── SangoUtils_Patch_YooAsset.Editor.asmdef.meta ├── Runtime.meta └── Runtime │ ├── PatchOperationOP.meta │ ├── PatchOperationOP │ ├── PatchOperationOP_ClearPackageCache.cs │ ├── PatchOperationOP_ClearPackageCache.cs.meta │ ├── PatchOperationOP_CreatePackageDownloader.cs │ ├── PatchOperationOP_CreatePackageDownloader.cs.meta │ ├── PatchOperationOP_DownloadPackageFiles.cs │ ├── PatchOperationOP_DownloadPackageFiles.cs.meta │ ├── PatchOperationOP_DownloadPackageOver.cs │ ├── PatchOperationOP_DownloadPackageOver.cs.meta │ ├── PatchOperationOP_InitializePackage.cs │ ├── PatchOperationOP_InitializePackage.cs.meta │ ├── PatchOperationOP_UpdateLoadHotfixDll.cs │ ├── PatchOperationOP_UpdateLoadHotfixDll.cs.meta │ ├── PatchOperationOP_UpdatePackageManifest.cs │ ├── PatchOperationOP_UpdatePackageManifest.cs.meta │ ├── PatchOperationOP_UpdatePackageVersion.cs │ ├── PatchOperationOP_UpdatePackageVersion.cs.meta │ ├── PatchOperationOP_UpdaterDone.cs │ └── PatchOperationOP_UpdaterDone.cs.meta │ ├── PatchService.meta │ ├── PatchService │ ├── EventBus_Patchs.cs │ ├── EventBus_Patchs.cs.meta │ ├── PatchOperation.cs │ ├── PatchOperation.cs.meta │ ├── PatchService.cs │ ├── PatchService.cs.meta │ ├── PatchSystemEventMessages.cs │ └── PatchSystemEventMessages.cs.meta │ ├── PublicAssets.meta │ ├── PublicAssets │ ├── SangoAssetService.cs │ ├── SangoAssetService.cs.meta │ ├── SangoPatchConfig.cs │ ├── SangoPatchConfig.cs.meta │ ├── SangoPatchRoot.cs │ ├── SangoPatchRoot.cs.meta │ ├── SangoPatchWnd.cs │ └── SangoPatchWnd.cs.meta │ ├── SangoUtils_Patch_YooAsset.Runtime.asmdef │ ├── SangoUtils_Patch_YooAsset.Runtime.asmdef.meta │ ├── StreamingAssetsHelper.meta │ ├── StreamingAssetsHelper │ ├── BuildinFileManifest.cs │ ├── BuildinFileManifest.cs.meta │ ├── StreamingAssetsDefine.cs │ ├── StreamingAssetsDefine.cs.meta │ ├── StreamingAssetsHelper.cs │ ├── StreamingAssetsHelper.cs.meta │ ├── StreamingAssetsHelper2.cs │ └── StreamingAssetsHelper2.cs.meta │ ├── Utils.meta │ └── Utils │ ├── CoroutineDriver.cs │ ├── CoroutineDriver.cs.meta │ ├── CoroutineHandler.cs │ ├── CoroutineHandler.cs.meta │ ├── Coroutines.cs │ └── Coroutines.cs.meta ├── package.json └── package.json.meta /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # SangoUtils.Hotfix_YooAsset 2 | 3 | 描述:这是一个非常简单的 Yooasset + HybridCLR 最小化的热更新系统,内含资源加载模块,热更dll加载,高性能EventBus,易拓展的Fsm,傻瓜式开箱即用,零基础小白也能轻松上手,快来试试为你的项目接入第一个热更新吧 >_< ... 4 | 5 |
6 | 7 | 依赖的package:[YooAsset](https://www.yooasset.com/)、[HybridCLR](https://hybridclr.doc.code-philosophy.com/) 8 | 9 |
10 | 11 | 开发者:[SangonomiyaSakunovi](https://github.com/SangonomiyaSakunovi/)、[Gaolingx](https://github.com/Gaolingx/) -------------------------------------------------------------------------------- /Readme.md.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c84e02221e618894290ff1539670f9e9 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Resources.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f5b5fe5620f0c4b4a94d273f8023e434 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Resources/ResFonts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 30bd050cdfce174488ceadf213390ac9 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Resources/ResFonts/SourceHanSans-Light-Lite SDF.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 36f8019232867c646b9cbdff7658e2e6 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 0 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Resources/ResFonts/SourceHanSans-Light-Lite.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gaolingx/SangoUtils.Hotfix_YooAsset/717e5e8d43dd080a7b25adef8bed4f7bb33dce69/Resources/ResFonts/SourceHanSans-Light-Lite.ttf -------------------------------------------------------------------------------- /Resources/ResFonts/SourceHanSans-Light-Lite.ttf.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3bea8d59d44a14e4182e3ab8982dac0a 3 | TrueTypeFontImporter: 4 | externalObjects: {} 5 | serializedVersion: 4 6 | fontSize: 16 7 | forceTextureCase: -2 8 | characterSpacing: 0 9 | characterPadding: 1 10 | includeFontData: 1 11 | fontNames: 12 | - HYWenHei 13 | fallbackFontReferences: [] 14 | customCharacters: 15 | fontRenderingMode: 0 16 | ascentCalculationMode: 1 17 | useLegacyBoundsCalculation: 0 18 | shouldRoundAdvanceValue: 1 19 | userData: 20 | assetBundleName: 21 | assetBundleVariant: 22 | -------------------------------------------------------------------------------- /Resources/ResPrefabs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: da687b264005fdd4db2723bd100f6a8d 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Resources/ResPrefabs/HotFixBG.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &1664767977149602139 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 745676617468238462} 12 | - component: {fileID: 2115519686466721638} 13 | - component: {fileID: 2020393096904101426} 14 | m_Layer: 0 15 | m_Name: HotFixBG 16 | m_TagString: Untagged 17 | m_Icon: {fileID: 0} 18 | m_NavMeshLayer: 0 19 | m_StaticEditorFlags: 0 20 | m_IsActive: 1 21 | --- !u!224 &745676617468238462 22 | RectTransform: 23 | m_ObjectHideFlags: 0 24 | m_CorrespondingSourceObject: {fileID: 0} 25 | m_PrefabInstance: {fileID: 0} 26 | m_PrefabAsset: {fileID: 0} 27 | m_GameObject: {fileID: 1664767977149602139} 28 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 29 | m_LocalPosition: {x: 0, y: 0, z: 0} 30 | m_LocalScale: {x: 1, y: 1, z: 1} 31 | m_ConstrainProportionsScale: 0 32 | m_Children: [] 33 | m_Father: {fileID: 0} 34 | m_RootOrder: -1 35 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 36 | m_AnchorMin: {x: 0.5, y: 0.5} 37 | m_AnchorMax: {x: 0.5, y: 0.5} 38 | m_AnchoredPosition: {x: 0, y: -0.00018310547} 39 | m_SizeDelta: {x: 2880, y: 1620} 40 | m_Pivot: {x: 0.5, y: 0.5} 41 | --- !u!222 &2115519686466721638 42 | CanvasRenderer: 43 | m_ObjectHideFlags: 0 44 | m_CorrespondingSourceObject: {fileID: 0} 45 | m_PrefabInstance: {fileID: 0} 46 | m_PrefabAsset: {fileID: 0} 47 | m_GameObject: {fileID: 1664767977149602139} 48 | m_CullTransparentMesh: 1 49 | --- !u!114 &2020393096904101426 50 | MonoBehaviour: 51 | m_ObjectHideFlags: 0 52 | m_CorrespondingSourceObject: {fileID: 0} 53 | m_PrefabInstance: {fileID: 0} 54 | m_PrefabAsset: {fileID: 0} 55 | m_GameObject: {fileID: 1664767977149602139} 56 | m_Enabled: 1 57 | m_EditorHideFlags: 0 58 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 59 | m_Name: 60 | m_EditorClassIdentifier: 61 | m_Material: {fileID: 0} 62 | m_Color: {r: 1, g: 1, b: 1, a: 1} 63 | m_RaycastTarget: 1 64 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 65 | m_Maskable: 1 66 | m_OnCullStateChanged: 67 | m_PersistentCalls: 68 | m_Calls: [] 69 | m_Sprite: {fileID: 21300000, guid: 0bb95d0c6588ec441b3543f6b7e71753, type: 3} 70 | m_Type: 0 71 | m_PreserveAspect: 0 72 | m_FillCenter: 1 73 | m_FillMethod: 4 74 | m_FillAmount: 1 75 | m_FillClockwise: 1 76 | m_FillOrigin: 0 77 | m_UseSpriteMesh: 0 78 | m_PixelsPerUnitMultiplier: 1 79 | -------------------------------------------------------------------------------- /Resources/ResPrefabs/HotFixBG.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1dc08fa7887ec744bba872b6d80d5e69 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Resources/ResPrefabs/HotFixPanel.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &2062804006460076083 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 1934431012300107606} 12 | - component: {fileID: 6907870854739425275} 13 | - component: {fileID: 276632744854682654} 14 | m_Layer: 0 15 | m_Name: FG 16 | m_TagString: Untagged 17 | m_Icon: {fileID: 0} 18 | m_NavMeshLayer: 0 19 | m_StaticEditorFlags: 0 20 | m_IsActive: 1 21 | --- !u!224 &1934431012300107606 22 | RectTransform: 23 | m_ObjectHideFlags: 0 24 | m_CorrespondingSourceObject: {fileID: 0} 25 | m_PrefabInstance: {fileID: 0} 26 | m_PrefabAsset: {fileID: 0} 27 | m_GameObject: {fileID: 2062804006460076083} 28 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 29 | m_LocalPosition: {x: 0, y: 0, z: 0} 30 | m_LocalScale: {x: 1, y: 1, z: 1} 31 | m_ConstrainProportionsScale: 1 32 | m_Children: [] 33 | m_Father: {fileID: 1207478930461614546} 34 | m_RootOrder: 0 35 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 36 | m_AnchorMin: {x: 0.5, y: 0.5} 37 | m_AnchorMax: {x: 0.5, y: 0.5} 38 | m_AnchoredPosition: {x: 0, y: -0.00018310547} 39 | m_SizeDelta: {x: 702, y: 432} 40 | m_Pivot: {x: 0.5, y: 0.5} 41 | --- !u!222 &6907870854739425275 42 | CanvasRenderer: 43 | m_ObjectHideFlags: 0 44 | m_CorrespondingSourceObject: {fileID: 0} 45 | m_PrefabInstance: {fileID: 0} 46 | m_PrefabAsset: {fileID: 0} 47 | m_GameObject: {fileID: 2062804006460076083} 48 | m_CullTransparentMesh: 1 49 | --- !u!114 &276632744854682654 50 | MonoBehaviour: 51 | m_ObjectHideFlags: 0 52 | m_CorrespondingSourceObject: {fileID: 0} 53 | m_PrefabInstance: {fileID: 0} 54 | m_PrefabAsset: {fileID: 0} 55 | m_GameObject: {fileID: 2062804006460076083} 56 | m_Enabled: 1 57 | m_EditorHideFlags: 0 58 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 59 | m_Name: 60 | m_EditorClassIdentifier: 61 | m_Material: {fileID: 0} 62 | m_Color: {r: 1, g: 1, b: 1, a: 1} 63 | m_RaycastTarget: 1 64 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 65 | m_Maskable: 1 66 | m_OnCullStateChanged: 67 | m_PersistentCalls: 68 | m_Calls: [] 69 | m_Sprite: {fileID: 21300000, guid: ffd84c53b30ff6241b86cdbfa0869535, type: 3} 70 | m_Type: 0 71 | m_PreserveAspect: 0 72 | m_FillCenter: 1 73 | m_FillMethod: 4 74 | m_FillAmount: 1 75 | m_FillClockwise: 1 76 | m_FillOrigin: 0 77 | m_UseSpriteMesh: 0 78 | m_PixelsPerUnitMultiplier: 1 79 | --- !u!1 &5708124217928493552 80 | GameObject: 81 | m_ObjectHideFlags: 0 82 | m_CorrespondingSourceObject: {fileID: 0} 83 | m_PrefabInstance: {fileID: 0} 84 | m_PrefabAsset: {fileID: 0} 85 | serializedVersion: 6 86 | m_Component: 87 | - component: {fileID: 5027231467456007612} 88 | - component: {fileID: 1443664839497919927} 89 | - component: {fileID: 8913426244291340062} 90 | m_Layer: 0 91 | m_Name: Text (TMP) 92 | m_TagString: Untagged 93 | m_Icon: {fileID: 0} 94 | m_NavMeshLayer: 0 95 | m_StaticEditorFlags: 0 96 | m_IsActive: 1 97 | --- !u!224 &5027231467456007612 98 | RectTransform: 99 | m_ObjectHideFlags: 0 100 | m_CorrespondingSourceObject: {fileID: 0} 101 | m_PrefabInstance: {fileID: 0} 102 | m_PrefabAsset: {fileID: 0} 103 | m_GameObject: {fileID: 5708124217928493552} 104 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 105 | m_LocalPosition: {x: 0, y: 0, z: 0} 106 | m_LocalScale: {x: 1, y: 1, z: 1} 107 | m_ConstrainProportionsScale: 0 108 | m_Children: [] 109 | m_Father: {fileID: 7481939872184001411} 110 | m_RootOrder: 0 111 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 112 | m_AnchorMin: {x: 0.5, y: 0.5} 113 | m_AnchorMax: {x: 0.5, y: 0.5} 114 | m_AnchoredPosition: {x: 0, y: 0} 115 | m_SizeDelta: {x: 200, y: 50} 116 | m_Pivot: {x: 0.5, y: 0.5} 117 | --- !u!222 &1443664839497919927 118 | CanvasRenderer: 119 | m_ObjectHideFlags: 0 120 | m_CorrespondingSourceObject: {fileID: 0} 121 | m_PrefabInstance: {fileID: 0} 122 | m_PrefabAsset: {fileID: 0} 123 | m_GameObject: {fileID: 5708124217928493552} 124 | m_CullTransparentMesh: 1 125 | --- !u!114 &8913426244291340062 126 | MonoBehaviour: 127 | m_ObjectHideFlags: 0 128 | m_CorrespondingSourceObject: {fileID: 0} 129 | m_PrefabInstance: {fileID: 0} 130 | m_PrefabAsset: {fileID: 0} 131 | m_GameObject: {fileID: 5708124217928493552} 132 | m_Enabled: 1 133 | m_EditorHideFlags: 0 134 | m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} 135 | m_Name: 136 | m_EditorClassIdentifier: 137 | m_Material: {fileID: 0} 138 | m_Color: {r: 1, g: 1, b: 1, a: 1} 139 | m_RaycastTarget: 1 140 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 141 | m_Maskable: 1 142 | m_OnCullStateChanged: 143 | m_PersistentCalls: 144 | m_Calls: [] 145 | m_text: "\u53D6\u6D88" 146 | m_isRightToLeft: 0 147 | m_fontAsset: {fileID: 11400000, guid: 36f8019232867c646b9cbdff7658e2e6, type: 2} 148 | m_sharedMaterial: {fileID: -6767376747244427359, guid: 36f8019232867c646b9cbdff7658e2e6, type: 2} 149 | m_fontSharedMaterials: [] 150 | m_fontMaterial: {fileID: 0} 151 | m_fontMaterials: [] 152 | m_fontColor32: 153 | serializedVersion: 2 154 | rgba: 4294967295 155 | m_fontColor: {r: 1, g: 1, b: 1, a: 1} 156 | m_enableVertexGradient: 0 157 | m_colorMode: 3 158 | m_fontColorGradient: 159 | topLeft: {r: 1, g: 1, b: 1, a: 1} 160 | topRight: {r: 1, g: 1, b: 1, a: 1} 161 | bottomLeft: {r: 1, g: 1, b: 1, a: 1} 162 | bottomRight: {r: 1, g: 1, b: 1, a: 1} 163 | m_fontColorGradientPreset: {fileID: 0} 164 | m_spriteAsset: {fileID: 0} 165 | m_tintAllSprites: 0 166 | m_StyleSheet: {fileID: 0} 167 | m_TextStyleHashCode: -1183493901 168 | m_overrideHtmlColors: 0 169 | m_faceColor: 170 | serializedVersion: 2 171 | rgba: 4294967295 172 | m_fontSize: 40 173 | m_fontSizeBase: 40 174 | m_fontWeight: 400 175 | m_enableAutoSizing: 0 176 | m_fontSizeMin: 18 177 | m_fontSizeMax: 72 178 | m_fontStyle: 0 179 | m_HorizontalAlignment: 2 180 | m_VerticalAlignment: 512 181 | m_textAlignment: 65535 182 | m_characterSpacing: 0 183 | m_wordSpacing: 0 184 | m_lineSpacing: 0 185 | m_lineSpacingMax: 0 186 | m_paragraphSpacing: 0 187 | m_charWidthMaxAdj: 0 188 | m_enableWordWrapping: 1 189 | m_wordWrappingRatios: 0.4 190 | m_overflowMode: 0 191 | m_linkedTextComponent: {fileID: 0} 192 | parentLinkedComponent: {fileID: 0} 193 | m_enableKerning: 1 194 | m_enableExtraPadding: 0 195 | checkPaddingRequired: 0 196 | m_isRichText: 1 197 | m_parseCtrlCharacters: 1 198 | m_isOrthographic: 1 199 | m_isCullingEnabled: 0 200 | m_horizontalMapping: 0 201 | m_verticalMapping: 0 202 | m_uvLineOffset: 0 203 | m_geometrySortingOrder: 0 204 | m_IsTextObjectScaleStatic: 0 205 | m_VertexBufferAutoSizeReduction: 0 206 | m_useMaxVisibleDescender: 1 207 | m_pageToDisplay: 1 208 | m_margin: {x: 0, y: 0, z: 0, w: 0} 209 | m_isUsingLegacyAnimationComponent: 0 210 | m_isVolumetricText: 0 211 | m_hasFontAssetChanged: 0 212 | m_baseMaterial: {fileID: 0} 213 | m_maskOffset: {x: 0, y: 0, z: 0, w: 0} 214 | --- !u!1 &6603183931383041623 215 | GameObject: 216 | m_ObjectHideFlags: 0 217 | m_CorrespondingSourceObject: {fileID: 0} 218 | m_PrefabInstance: {fileID: 0} 219 | m_PrefabAsset: {fileID: 0} 220 | serializedVersion: 6 221 | m_Component: 222 | - component: {fileID: 301700780943507501} 223 | - component: {fileID: 7289020286260905607} 224 | - component: {fileID: 7896341444496019375} 225 | m_Layer: 0 226 | m_Name: Text (TMP) 227 | m_TagString: Untagged 228 | m_Icon: {fileID: 0} 229 | m_NavMeshLayer: 0 230 | m_StaticEditorFlags: 0 231 | m_IsActive: 1 232 | --- !u!224 &301700780943507501 233 | RectTransform: 234 | m_ObjectHideFlags: 0 235 | m_CorrespondingSourceObject: {fileID: 0} 236 | m_PrefabInstance: {fileID: 0} 237 | m_PrefabAsset: {fileID: 0} 238 | m_GameObject: {fileID: 6603183931383041623} 239 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 240 | m_LocalPosition: {x: 0, y: 0, z: 0} 241 | m_LocalScale: {x: 1, y: 1, z: 1} 242 | m_ConstrainProportionsScale: 0 243 | m_Children: [] 244 | m_Father: {fileID: 5110140089658016847} 245 | m_RootOrder: 0 246 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 247 | m_AnchorMin: {x: 0.5, y: 0.5} 248 | m_AnchorMax: {x: 0.5, y: 0.5} 249 | m_AnchoredPosition: {x: 0, y: 0} 250 | m_SizeDelta: {x: 200, y: 50} 251 | m_Pivot: {x: 0.5, y: 0.5} 252 | --- !u!222 &7289020286260905607 253 | CanvasRenderer: 254 | m_ObjectHideFlags: 0 255 | m_CorrespondingSourceObject: {fileID: 0} 256 | m_PrefabInstance: {fileID: 0} 257 | m_PrefabAsset: {fileID: 0} 258 | m_GameObject: {fileID: 6603183931383041623} 259 | m_CullTransparentMesh: 1 260 | --- !u!114 &7896341444496019375 261 | MonoBehaviour: 262 | m_ObjectHideFlags: 0 263 | m_CorrespondingSourceObject: {fileID: 0} 264 | m_PrefabInstance: {fileID: 0} 265 | m_PrefabAsset: {fileID: 0} 266 | m_GameObject: {fileID: 6603183931383041623} 267 | m_Enabled: 1 268 | m_EditorHideFlags: 0 269 | m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} 270 | m_Name: 271 | m_EditorClassIdentifier: 272 | m_Material: {fileID: 0} 273 | m_Color: {r: 1, g: 1, b: 1, a: 1} 274 | m_RaycastTarget: 1 275 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 276 | m_Maskable: 1 277 | m_OnCullStateChanged: 278 | m_PersistentCalls: 279 | m_Calls: [] 280 | m_text: "\u786E\u5B9A" 281 | m_isRightToLeft: 0 282 | m_fontAsset: {fileID: 11400000, guid: 36f8019232867c646b9cbdff7658e2e6, type: 2} 283 | m_sharedMaterial: {fileID: -6767376747244427359, guid: 36f8019232867c646b9cbdff7658e2e6, type: 2} 284 | m_fontSharedMaterials: [] 285 | m_fontMaterial: {fileID: 0} 286 | m_fontMaterials: [] 287 | m_fontColor32: 288 | serializedVersion: 2 289 | rgba: 4294967295 290 | m_fontColor: {r: 1, g: 1, b: 1, a: 1} 291 | m_enableVertexGradient: 0 292 | m_colorMode: 3 293 | m_fontColorGradient: 294 | topLeft: {r: 1, g: 1, b: 1, a: 1} 295 | topRight: {r: 1, g: 1, b: 1, a: 1} 296 | bottomLeft: {r: 1, g: 1, b: 1, a: 1} 297 | bottomRight: {r: 1, g: 1, b: 1, a: 1} 298 | m_fontColorGradientPreset: {fileID: 0} 299 | m_spriteAsset: {fileID: 0} 300 | m_tintAllSprites: 0 301 | m_StyleSheet: {fileID: 0} 302 | m_TextStyleHashCode: -1183493901 303 | m_overrideHtmlColors: 0 304 | m_faceColor: 305 | serializedVersion: 2 306 | rgba: 4294967295 307 | m_fontSize: 40 308 | m_fontSizeBase: 40 309 | m_fontWeight: 400 310 | m_enableAutoSizing: 0 311 | m_fontSizeMin: 18 312 | m_fontSizeMax: 72 313 | m_fontStyle: 0 314 | m_HorizontalAlignment: 2 315 | m_VerticalAlignment: 512 316 | m_textAlignment: 65535 317 | m_characterSpacing: 0 318 | m_wordSpacing: 0 319 | m_lineSpacing: 0 320 | m_lineSpacingMax: 0 321 | m_paragraphSpacing: 0 322 | m_charWidthMaxAdj: 0 323 | m_enableWordWrapping: 1 324 | m_wordWrappingRatios: 0.4 325 | m_overflowMode: 0 326 | m_linkedTextComponent: {fileID: 0} 327 | parentLinkedComponent: {fileID: 0} 328 | m_enableKerning: 1 329 | m_enableExtraPadding: 0 330 | checkPaddingRequired: 0 331 | m_isRichText: 1 332 | m_parseCtrlCharacters: 1 333 | m_isOrthographic: 1 334 | m_isCullingEnabled: 0 335 | m_horizontalMapping: 0 336 | m_verticalMapping: 0 337 | m_uvLineOffset: 0 338 | m_geometrySortingOrder: 0 339 | m_IsTextObjectScaleStatic: 0 340 | m_VertexBufferAutoSizeReduction: 0 341 | m_useMaxVisibleDescender: 1 342 | m_pageToDisplay: 1 343 | m_margin: {x: 0, y: 0, z: 0, w: 0} 344 | m_isUsingLegacyAnimationComponent: 0 345 | m_isVolumetricText: 0 346 | m_hasFontAssetChanged: 0 347 | m_baseMaterial: {fileID: 0} 348 | m_maskOffset: {x: 0, y: 0, z: 0, w: 0} 349 | --- !u!1 &6992564996532325543 350 | GameObject: 351 | m_ObjectHideFlags: 0 352 | m_CorrespondingSourceObject: {fileID: 0} 353 | m_PrefabInstance: {fileID: 0} 354 | m_PrefabAsset: {fileID: 0} 355 | serializedVersion: 6 356 | m_Component: 357 | - component: {fileID: 7481939872184001411} 358 | - component: {fileID: 5145406265175113245} 359 | - component: {fileID: 8913469889496827338} 360 | - component: {fileID: 6191708688828735877} 361 | m_Layer: 0 362 | m_Name: messageBoxCancelBtn 363 | m_TagString: Untagged 364 | m_Icon: {fileID: 0} 365 | m_NavMeshLayer: 0 366 | m_StaticEditorFlags: 0 367 | m_IsActive: 1 368 | --- !u!224 &7481939872184001411 369 | RectTransform: 370 | m_ObjectHideFlags: 0 371 | m_CorrespondingSourceObject: {fileID: 0} 372 | m_PrefabInstance: {fileID: 0} 373 | m_PrefabAsset: {fileID: 0} 374 | m_GameObject: {fileID: 6992564996532325543} 375 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 376 | m_LocalPosition: {x: 0, y: 0, z: 0} 377 | m_LocalScale: {x: 1, y: 1, z: 1} 378 | m_ConstrainProportionsScale: 0 379 | m_Children: 380 | - {fileID: 5027231467456007612} 381 | m_Father: {fileID: 1207478930461614546} 382 | m_RootOrder: 2 383 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 384 | m_AnchorMin: {x: 0.5, y: 0.5} 385 | m_AnchorMax: {x: 0.5, y: 0.5} 386 | m_AnchoredPosition: {x: 150, y: -125.00018} 387 | m_SizeDelta: {x: 200, y: 50} 388 | m_Pivot: {x: 0.5, y: 0.5} 389 | --- !u!222 &5145406265175113245 390 | CanvasRenderer: 391 | m_ObjectHideFlags: 0 392 | m_CorrespondingSourceObject: {fileID: 0} 393 | m_PrefabInstance: {fileID: 0} 394 | m_PrefabAsset: {fileID: 0} 395 | m_GameObject: {fileID: 6992564996532325543} 396 | m_CullTransparentMesh: 1 397 | --- !u!114 &8913469889496827338 398 | MonoBehaviour: 399 | m_ObjectHideFlags: 0 400 | m_CorrespondingSourceObject: {fileID: 0} 401 | m_PrefabInstance: {fileID: 0} 402 | m_PrefabAsset: {fileID: 0} 403 | m_GameObject: {fileID: 6992564996532325543} 404 | m_Enabled: 1 405 | m_EditorHideFlags: 0 406 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 407 | m_Name: 408 | m_EditorClassIdentifier: 409 | m_Material: {fileID: 0} 410 | m_Color: {r: 1, g: 1, b: 1, a: 1} 411 | m_RaycastTarget: 1 412 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 413 | m_Maskable: 1 414 | m_OnCullStateChanged: 415 | m_PersistentCalls: 416 | m_Calls: [] 417 | m_Sprite: {fileID: 21300000, guid: bf7e1c548030f47449f2785f995df1ae, type: 3} 418 | m_Type: 1 419 | m_PreserveAspect: 0 420 | m_FillCenter: 1 421 | m_FillMethod: 4 422 | m_FillAmount: 1 423 | m_FillClockwise: 1 424 | m_FillOrigin: 0 425 | m_UseSpriteMesh: 0 426 | m_PixelsPerUnitMultiplier: 2 427 | --- !u!114 &6191708688828735877 428 | MonoBehaviour: 429 | m_ObjectHideFlags: 0 430 | m_CorrespondingSourceObject: {fileID: 0} 431 | m_PrefabInstance: {fileID: 0} 432 | m_PrefabAsset: {fileID: 0} 433 | m_GameObject: {fileID: 6992564996532325543} 434 | m_Enabled: 1 435 | m_EditorHideFlags: 0 436 | m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} 437 | m_Name: 438 | m_EditorClassIdentifier: 439 | m_Navigation: 440 | m_Mode: 3 441 | m_WrapAround: 0 442 | m_SelectOnUp: {fileID: 0} 443 | m_SelectOnDown: {fileID: 0} 444 | m_SelectOnLeft: {fileID: 0} 445 | m_SelectOnRight: {fileID: 0} 446 | m_Transition: 1 447 | m_Colors: 448 | m_NormalColor: {r: 1, g: 1, b: 1, a: 1} 449 | m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 450 | m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} 451 | m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 452 | m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} 453 | m_ColorMultiplier: 1 454 | m_FadeDuration: 0.1 455 | m_SpriteState: 456 | m_HighlightedSprite: {fileID: 0} 457 | m_PressedSprite: {fileID: 0} 458 | m_SelectedSprite: {fileID: 0} 459 | m_DisabledSprite: {fileID: 0} 460 | m_AnimationTriggers: 461 | m_NormalTrigger: Normal 462 | m_HighlightedTrigger: Highlighted 463 | m_PressedTrigger: Pressed 464 | m_SelectedTrigger: Selected 465 | m_DisabledTrigger: Disabled 466 | m_Interactable: 1 467 | m_TargetGraphic: {fileID: 8913469889496827338} 468 | m_OnClick: 469 | m_PersistentCalls: 470 | m_Calls: [] 471 | --- !u!1 &8112040730504572910 472 | GameObject: 473 | m_ObjectHideFlags: 0 474 | m_CorrespondingSourceObject: {fileID: 0} 475 | m_PrefabInstance: {fileID: 0} 476 | m_PrefabAsset: {fileID: 0} 477 | serializedVersion: 6 478 | m_Component: 479 | - component: {fileID: 273991638745571060} 480 | - component: {fileID: 3959089209639761331} 481 | - component: {fileID: 3243001873628962870} 482 | m_Layer: 0 483 | m_Name: messageBoxContent 484 | m_TagString: Untagged 485 | m_Icon: {fileID: 0} 486 | m_NavMeshLayer: 0 487 | m_StaticEditorFlags: 0 488 | m_IsActive: 1 489 | --- !u!224 &273991638745571060 490 | RectTransform: 491 | m_ObjectHideFlags: 0 492 | m_CorrespondingSourceObject: {fileID: 0} 493 | m_PrefabInstance: {fileID: 0} 494 | m_PrefabAsset: {fileID: 0} 495 | m_GameObject: {fileID: 8112040730504572910} 496 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 497 | m_LocalPosition: {x: 0, y: 0, z: 0} 498 | m_LocalScale: {x: 1, y: 1, z: 1} 499 | m_ConstrainProportionsScale: 0 500 | m_Children: [] 501 | m_Father: {fileID: 1207478930461614546} 502 | m_RootOrder: 3 503 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 504 | m_AnchorMin: {x: 0.5, y: 0.5} 505 | m_AnchorMax: {x: 0.5, y: 0.5} 506 | m_AnchoredPosition: {x: 0, y: 49.999817} 507 | m_SizeDelta: {x: 700, y: 200} 508 | m_Pivot: {x: 0.5, y: 0.5} 509 | --- !u!222 &3959089209639761331 510 | CanvasRenderer: 511 | m_ObjectHideFlags: 0 512 | m_CorrespondingSourceObject: {fileID: 0} 513 | m_PrefabInstance: {fileID: 0} 514 | m_PrefabAsset: {fileID: 0} 515 | m_GameObject: {fileID: 8112040730504572910} 516 | m_CullTransparentMesh: 1 517 | --- !u!114 &3243001873628962870 518 | MonoBehaviour: 519 | m_ObjectHideFlags: 0 520 | m_CorrespondingSourceObject: {fileID: 0} 521 | m_PrefabInstance: {fileID: 0} 522 | m_PrefabAsset: {fileID: 0} 523 | m_GameObject: {fileID: 8112040730504572910} 524 | m_Enabled: 1 525 | m_EditorHideFlags: 0 526 | m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} 527 | m_Name: 528 | m_EditorClassIdentifier: 529 | m_Material: {fileID: 0} 530 | m_Color: {r: 1, g: 1, b: 1, a: 1} 531 | m_RaycastTarget: 1 532 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 533 | m_Maskable: 1 534 | m_OnCullStateChanged: 535 | m_PersistentCalls: 536 | m_Calls: [] 537 | m_text: "\u5F53\u524D\u9700\u8981\u4E0B\u8F7D\u66F4\u65B0200MB\u5DE6\u53F3\uFF0C\n\u662F\u5426\u7EE7\u7EED\uFF1F\n\uFF08\u5EFA\u8BAE\u5728Wifi\u73AF\u5883\u4E0B\u8FDB\u884C\uFF09" 538 | m_isRightToLeft: 0 539 | m_fontAsset: {fileID: 11400000, guid: 36f8019232867c646b9cbdff7658e2e6, type: 2} 540 | m_sharedMaterial: {fileID: -6767376747244427359, guid: 36f8019232867c646b9cbdff7658e2e6, type: 2} 541 | m_fontSharedMaterials: [] 542 | m_fontMaterial: {fileID: 0} 543 | m_fontMaterials: [] 544 | m_fontColor32: 545 | serializedVersion: 2 546 | rgba: 4278190080 547 | m_fontColor: {r: 0, g: 0, b: 0, a: 1} 548 | m_enableVertexGradient: 0 549 | m_colorMode: 3 550 | m_fontColorGradient: 551 | topLeft: {r: 1, g: 1, b: 1, a: 1} 552 | topRight: {r: 1, g: 1, b: 1, a: 1} 553 | bottomLeft: {r: 1, g: 1, b: 1, a: 1} 554 | bottomRight: {r: 1, g: 1, b: 1, a: 1} 555 | m_fontColorGradientPreset: {fileID: 0} 556 | m_spriteAsset: {fileID: 0} 557 | m_tintAllSprites: 0 558 | m_StyleSheet: {fileID: 0} 559 | m_TextStyleHashCode: -1183493901 560 | m_overrideHtmlColors: 0 561 | m_faceColor: 562 | serializedVersion: 2 563 | rgba: 4294967295 564 | m_fontSize: 40 565 | m_fontSizeBase: 40 566 | m_fontWeight: 400 567 | m_enableAutoSizing: 0 568 | m_fontSizeMin: 18 569 | m_fontSizeMax: 72 570 | m_fontStyle: 0 571 | m_HorizontalAlignment: 2 572 | m_VerticalAlignment: 512 573 | m_textAlignment: 65535 574 | m_characterSpacing: 0 575 | m_wordSpacing: 0 576 | m_lineSpacing: 0 577 | m_lineSpacingMax: 0 578 | m_paragraphSpacing: 0 579 | m_charWidthMaxAdj: 0 580 | m_enableWordWrapping: 1 581 | m_wordWrappingRatios: 0.4 582 | m_overflowMode: 0 583 | m_linkedTextComponent: {fileID: 0} 584 | parentLinkedComponent: {fileID: 0} 585 | m_enableKerning: 1 586 | m_enableExtraPadding: 0 587 | checkPaddingRequired: 0 588 | m_isRichText: 1 589 | m_parseCtrlCharacters: 1 590 | m_isOrthographic: 1 591 | m_isCullingEnabled: 0 592 | m_horizontalMapping: 0 593 | m_verticalMapping: 0 594 | m_uvLineOffset: 0 595 | m_geometrySortingOrder: 0 596 | m_IsTextObjectScaleStatic: 0 597 | m_VertexBufferAutoSizeReduction: 0 598 | m_useMaxVisibleDescender: 1 599 | m_pageToDisplay: 1 600 | m_margin: {x: 0, y: 0, z: 0, w: 0} 601 | m_isUsingLegacyAnimationComponent: 0 602 | m_isVolumetricText: 0 603 | m_hasFontAssetChanged: 0 604 | m_baseMaterial: {fileID: 0} 605 | m_maskOffset: {x: 0, y: 0, z: 0, w: 0} 606 | --- !u!1 &8175407354174167579 607 | GameObject: 608 | m_ObjectHideFlags: 0 609 | m_CorrespondingSourceObject: {fileID: 0} 610 | m_PrefabInstance: {fileID: 0} 611 | m_PrefabAsset: {fileID: 0} 612 | serializedVersion: 6 613 | m_Component: 614 | - component: {fileID: 5110140089658016847} 615 | - component: {fileID: 2313898266406245880} 616 | - component: {fileID: 4414436773456965150} 617 | - component: {fileID: 6268533488412776771} 618 | m_Layer: 0 619 | m_Name: messageBoxOkBtn 620 | m_TagString: Untagged 621 | m_Icon: {fileID: 0} 622 | m_NavMeshLayer: 0 623 | m_StaticEditorFlags: 0 624 | m_IsActive: 1 625 | --- !u!224 &5110140089658016847 626 | RectTransform: 627 | m_ObjectHideFlags: 0 628 | m_CorrespondingSourceObject: {fileID: 0} 629 | m_PrefabInstance: {fileID: 0} 630 | m_PrefabAsset: {fileID: 0} 631 | m_GameObject: {fileID: 8175407354174167579} 632 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 633 | m_LocalPosition: {x: 0, y: 0, z: 0} 634 | m_LocalScale: {x: 1, y: 1, z: 1} 635 | m_ConstrainProportionsScale: 0 636 | m_Children: 637 | - {fileID: 301700780943507501} 638 | m_Father: {fileID: 1207478930461614546} 639 | m_RootOrder: 1 640 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 641 | m_AnchorMin: {x: 0.5, y: 0.5} 642 | m_AnchorMax: {x: 0.5, y: 0.5} 643 | m_AnchoredPosition: {x: -150, y: -125.00018} 644 | m_SizeDelta: {x: 200, y: 50} 645 | m_Pivot: {x: 0.5, y: 0.5} 646 | --- !u!222 &2313898266406245880 647 | CanvasRenderer: 648 | m_ObjectHideFlags: 0 649 | m_CorrespondingSourceObject: {fileID: 0} 650 | m_PrefabInstance: {fileID: 0} 651 | m_PrefabAsset: {fileID: 0} 652 | m_GameObject: {fileID: 8175407354174167579} 653 | m_CullTransparentMesh: 1 654 | --- !u!114 &4414436773456965150 655 | MonoBehaviour: 656 | m_ObjectHideFlags: 0 657 | m_CorrespondingSourceObject: {fileID: 0} 658 | m_PrefabInstance: {fileID: 0} 659 | m_PrefabAsset: {fileID: 0} 660 | m_GameObject: {fileID: 8175407354174167579} 661 | m_Enabled: 1 662 | m_EditorHideFlags: 0 663 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 664 | m_Name: 665 | m_EditorClassIdentifier: 666 | m_Material: {fileID: 0} 667 | m_Color: {r: 1, g: 1, b: 1, a: 1} 668 | m_RaycastTarget: 1 669 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 670 | m_Maskable: 1 671 | m_OnCullStateChanged: 672 | m_PersistentCalls: 673 | m_Calls: [] 674 | m_Sprite: {fileID: 21300000, guid: bf7e1c548030f47449f2785f995df1ae, type: 3} 675 | m_Type: 1 676 | m_PreserveAspect: 0 677 | m_FillCenter: 1 678 | m_FillMethod: 4 679 | m_FillAmount: 1 680 | m_FillClockwise: 1 681 | m_FillOrigin: 0 682 | m_UseSpriteMesh: 0 683 | m_PixelsPerUnitMultiplier: 2 684 | --- !u!114 &6268533488412776771 685 | MonoBehaviour: 686 | m_ObjectHideFlags: 0 687 | m_CorrespondingSourceObject: {fileID: 0} 688 | m_PrefabInstance: {fileID: 0} 689 | m_PrefabAsset: {fileID: 0} 690 | m_GameObject: {fileID: 8175407354174167579} 691 | m_Enabled: 1 692 | m_EditorHideFlags: 0 693 | m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} 694 | m_Name: 695 | m_EditorClassIdentifier: 696 | m_Navigation: 697 | m_Mode: 3 698 | m_WrapAround: 0 699 | m_SelectOnUp: {fileID: 0} 700 | m_SelectOnDown: {fileID: 0} 701 | m_SelectOnLeft: {fileID: 0} 702 | m_SelectOnRight: {fileID: 0} 703 | m_Transition: 1 704 | m_Colors: 705 | m_NormalColor: {r: 1, g: 1, b: 1, a: 1} 706 | m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 707 | m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} 708 | m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 709 | m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} 710 | m_ColorMultiplier: 1 711 | m_FadeDuration: 0.1 712 | m_SpriteState: 713 | m_HighlightedSprite: {fileID: 0} 714 | m_PressedSprite: {fileID: 0} 715 | m_SelectedSprite: {fileID: 0} 716 | m_DisabledSprite: {fileID: 0} 717 | m_AnimationTriggers: 718 | m_NormalTrigger: Normal 719 | m_HighlightedTrigger: Highlighted 720 | m_PressedTrigger: Pressed 721 | m_SelectedTrigger: Selected 722 | m_DisabledTrigger: Disabled 723 | m_Interactable: 1 724 | m_TargetGraphic: {fileID: 4414436773456965150} 725 | m_OnClick: 726 | m_PersistentCalls: 727 | m_Calls: [] 728 | --- !u!1 &8372635064853897010 729 | GameObject: 730 | m_ObjectHideFlags: 0 731 | m_CorrespondingSourceObject: {fileID: 0} 732 | m_PrefabInstance: {fileID: 0} 733 | m_PrefabAsset: {fileID: 0} 734 | serializedVersion: 6 735 | m_Component: 736 | - component: {fileID: 1207478930461614546} 737 | m_Layer: 0 738 | m_Name: HotFixPanel 739 | m_TagString: Untagged 740 | m_Icon: {fileID: 0} 741 | m_NavMeshLayer: 0 742 | m_StaticEditorFlags: 0 743 | m_IsActive: 0 744 | --- !u!224 &1207478930461614546 745 | RectTransform: 746 | m_ObjectHideFlags: 0 747 | m_CorrespondingSourceObject: {fileID: 0} 748 | m_PrefabInstance: {fileID: 0} 749 | m_PrefabAsset: {fileID: 0} 750 | m_GameObject: {fileID: 8372635064853897010} 751 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 752 | m_LocalPosition: {x: 0, y: 0, z: 0} 753 | m_LocalScale: {x: 1, y: 1, z: 1} 754 | m_ConstrainProportionsScale: 0 755 | m_Children: 756 | - {fileID: 1934431012300107606} 757 | - {fileID: 5110140089658016847} 758 | - {fileID: 7481939872184001411} 759 | - {fileID: 273991638745571060} 760 | m_Father: {fileID: 0} 761 | m_RootOrder: 0 762 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 763 | m_AnchorMin: {x: 0.5, y: 0.5} 764 | m_AnchorMax: {x: 0.5, y: 0.5} 765 | m_AnchoredPosition: {x: 0, y: 0} 766 | m_SizeDelta: {x: 100, y: 100} 767 | m_Pivot: {x: 0.5, y: 0.5} 768 | -------------------------------------------------------------------------------- /Resources/ResPrefabs/HotFixPanel.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c68d29858286fe8409e7ce75f46b6885 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Resources/ResPrefabs/HotFixProgressPanel.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &208096012819816926 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 8647513967100720668} 12 | - component: {fileID: 5910637919037832873} 13 | - component: {fileID: 1880447984609921524} 14 | m_Layer: 0 15 | m_Name: Tips 16 | m_TagString: Untagged 17 | m_Icon: {fileID: 0} 18 | m_NavMeshLayer: 0 19 | m_StaticEditorFlags: 0 20 | m_IsActive: 1 21 | --- !u!224 &8647513967100720668 22 | RectTransform: 23 | m_ObjectHideFlags: 0 24 | m_CorrespondingSourceObject: {fileID: 0} 25 | m_PrefabInstance: {fileID: 0} 26 | m_PrefabAsset: {fileID: 0} 27 | m_GameObject: {fileID: 208096012819816926} 28 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 29 | m_LocalPosition: {x: 0, y: 0, z: 0} 30 | m_LocalScale: {x: 1, y: 1, z: 1} 31 | m_ConstrainProportionsScale: 0 32 | m_Children: [] 33 | m_Father: {fileID: 5456539686814339195} 34 | m_RootOrder: 3 35 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 36 | m_AnchorMin: {x: 0.5, y: 0.5} 37 | m_AnchorMax: {x: 0.5, y: 0.5} 38 | m_AnchoredPosition: {x: 0, y: 150} 39 | m_SizeDelta: {x: 1500, y: 50} 40 | m_Pivot: {x: 0.5, y: 0.5} 41 | --- !u!222 &5910637919037832873 42 | CanvasRenderer: 43 | m_ObjectHideFlags: 0 44 | m_CorrespondingSourceObject: {fileID: 0} 45 | m_PrefabInstance: {fileID: 0} 46 | m_PrefabAsset: {fileID: 0} 47 | m_GameObject: {fileID: 208096012819816926} 48 | m_CullTransparentMesh: 1 49 | --- !u!114 &1880447984609921524 50 | MonoBehaviour: 51 | m_ObjectHideFlags: 0 52 | m_CorrespondingSourceObject: {fileID: 0} 53 | m_PrefabInstance: {fileID: 0} 54 | m_PrefabAsset: {fileID: 0} 55 | m_GameObject: {fileID: 208096012819816926} 56 | m_Enabled: 1 57 | m_EditorHideFlags: 0 58 | m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} 59 | m_Name: 60 | m_EditorClassIdentifier: 61 | m_Material: {fileID: 0} 62 | m_Color: {r: 1, g: 1, b: 1, a: 1} 63 | m_RaycastTarget: 1 64 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 65 | m_Maskable: 1 66 | m_OnCullStateChanged: 67 | m_PersistentCalls: 68 | m_Calls: [] 69 | m_text: "\u6B63\u5728\u68C0\u67E5\u66F4\u65B0" 70 | m_isRightToLeft: 0 71 | m_fontAsset: {fileID: 11400000, guid: 36f8019232867c646b9cbdff7658e2e6, type: 2} 72 | m_sharedMaterial: {fileID: -6767376747244427359, guid: 36f8019232867c646b9cbdff7658e2e6, type: 2} 73 | m_fontSharedMaterials: [] 74 | m_fontMaterial: {fileID: 0} 75 | m_fontMaterials: [] 76 | m_fontColor32: 77 | serializedVersion: 2 78 | rgba: 4280558635 79 | m_fontColor: {r: 0.16981131, g: 0.14177643, b: 0.14177643, a: 1} 80 | m_enableVertexGradient: 0 81 | m_colorMode: 3 82 | m_fontColorGradient: 83 | topLeft: {r: 1, g: 1, b: 1, a: 1} 84 | topRight: {r: 1, g: 1, b: 1, a: 1} 85 | bottomLeft: {r: 1, g: 1, b: 1, a: 1} 86 | bottomRight: {r: 1, g: 1, b: 1, a: 1} 87 | m_fontColorGradientPreset: {fileID: 0} 88 | m_spriteAsset: {fileID: 0} 89 | m_tintAllSprites: 0 90 | m_StyleSheet: {fileID: 0} 91 | m_TextStyleHashCode: -1183493901 92 | m_overrideHtmlColors: 0 93 | m_faceColor: 94 | serializedVersion: 2 95 | rgba: 4294967295 96 | m_fontSize: 36 97 | m_fontSizeBase: 36 98 | m_fontWeight: 400 99 | m_enableAutoSizing: 0 100 | m_fontSizeMin: 18 101 | m_fontSizeMax: 72 102 | m_fontStyle: 0 103 | m_HorizontalAlignment: 2 104 | m_VerticalAlignment: 512 105 | m_textAlignment: 65535 106 | m_characterSpacing: 0 107 | m_wordSpacing: 0 108 | m_lineSpacing: 0 109 | m_lineSpacingMax: 0 110 | m_paragraphSpacing: 0 111 | m_charWidthMaxAdj: 0 112 | m_enableWordWrapping: 1 113 | m_wordWrappingRatios: 0.4 114 | m_overflowMode: 0 115 | m_linkedTextComponent: {fileID: 0} 116 | parentLinkedComponent: {fileID: 0} 117 | m_enableKerning: 1 118 | m_enableExtraPadding: 0 119 | checkPaddingRequired: 0 120 | m_isRichText: 1 121 | m_parseCtrlCharacters: 1 122 | m_isOrthographic: 1 123 | m_isCullingEnabled: 0 124 | m_horizontalMapping: 0 125 | m_verticalMapping: 0 126 | m_uvLineOffset: 0 127 | m_geometrySortingOrder: 0 128 | m_IsTextObjectScaleStatic: 0 129 | m_VertexBufferAutoSizeReduction: 0 130 | m_useMaxVisibleDescender: 1 131 | m_pageToDisplay: 1 132 | m_margin: {x: 0, y: 0, z: 0, w: 0} 133 | m_isUsingLegacyAnimationComponent: 0 134 | m_isVolumetricText: 0 135 | m_hasFontAssetChanged: 0 136 | m_baseMaterial: {fileID: 0} 137 | m_maskOffset: {x: 0, y: 0, z: 0, w: 0} 138 | --- !u!1 &334984951511249363 139 | GameObject: 140 | m_ObjectHideFlags: 0 141 | m_CorrespondingSourceObject: {fileID: 0} 142 | m_PrefabInstance: {fileID: 0} 143 | m_PrefabAsset: {fileID: 0} 144 | serializedVersion: 6 145 | m_Component: 146 | - component: {fileID: 3172693902633664966} 147 | - component: {fileID: 6337195599082181322} 148 | - component: {fileID: 7296481539075985023} 149 | m_Layer: 0 150 | m_Name: LoadingProgressText 151 | m_TagString: Untagged 152 | m_Icon: {fileID: 0} 153 | m_NavMeshLayer: 0 154 | m_StaticEditorFlags: 0 155 | m_IsActive: 1 156 | --- !u!224 &3172693902633664966 157 | RectTransform: 158 | m_ObjectHideFlags: 0 159 | m_CorrespondingSourceObject: {fileID: 0} 160 | m_PrefabInstance: {fileID: 0} 161 | m_PrefabAsset: {fileID: 0} 162 | m_GameObject: {fileID: 334984951511249363} 163 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 164 | m_LocalPosition: {x: 0, y: 0, z: 0} 165 | m_LocalScale: {x: 1, y: 1, z: 1} 166 | m_ConstrainProportionsScale: 0 167 | m_Children: [] 168 | m_Father: {fileID: 5456539686814339195} 169 | m_RootOrder: 2 170 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 171 | m_AnchorMin: {x: 0.5, y: 0.5} 172 | m_AnchorMax: {x: 0.5, y: 0.5} 173 | m_AnchoredPosition: {x: 0, y: 86} 174 | m_SizeDelta: {x: 200, y: 50} 175 | m_Pivot: {x: 0.5, y: 0.5} 176 | --- !u!222 &6337195599082181322 177 | CanvasRenderer: 178 | m_ObjectHideFlags: 0 179 | m_CorrespondingSourceObject: {fileID: 0} 180 | m_PrefabInstance: {fileID: 0} 181 | m_PrefabAsset: {fileID: 0} 182 | m_GameObject: {fileID: 334984951511249363} 183 | m_CullTransparentMesh: 1 184 | --- !u!114 &7296481539075985023 185 | MonoBehaviour: 186 | m_ObjectHideFlags: 0 187 | m_CorrespondingSourceObject: {fileID: 0} 188 | m_PrefabInstance: {fileID: 0} 189 | m_PrefabAsset: {fileID: 0} 190 | m_GameObject: {fileID: 334984951511249363} 191 | m_Enabled: 1 192 | m_EditorHideFlags: 0 193 | m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} 194 | m_Name: 195 | m_EditorClassIdentifier: 196 | m_Material: {fileID: 0} 197 | m_Color: {r: 1, g: 1, b: 1, a: 1} 198 | m_RaycastTarget: 1 199 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 200 | m_Maskable: 1 201 | m_OnCullStateChanged: 202 | m_PersistentCalls: 203 | m_Calls: [] 204 | m_text: 50% 205 | m_isRightToLeft: 0 206 | m_fontAsset: {fileID: 11400000, guid: 36f8019232867c646b9cbdff7658e2e6, type: 2} 207 | m_sharedMaterial: {fileID: -6767376747244427359, guid: 36f8019232867c646b9cbdff7658e2e6, type: 2} 208 | m_fontSharedMaterials: [] 209 | m_fontMaterial: {fileID: 0} 210 | m_fontMaterials: [] 211 | m_fontColor32: 212 | serializedVersion: 2 213 | rgba: 4294967295 214 | m_fontColor: {r: 1, g: 1, b: 1, a: 1} 215 | m_enableVertexGradient: 0 216 | m_colorMode: 3 217 | m_fontColorGradient: 218 | topLeft: {r: 1, g: 1, b: 1, a: 1} 219 | topRight: {r: 1, g: 1, b: 1, a: 1} 220 | bottomLeft: {r: 1, g: 1, b: 1, a: 1} 221 | bottomRight: {r: 1, g: 1, b: 1, a: 1} 222 | m_fontColorGradientPreset: {fileID: 0} 223 | m_spriteAsset: {fileID: 0} 224 | m_tintAllSprites: 0 225 | m_StyleSheet: {fileID: 0} 226 | m_TextStyleHashCode: -1183493901 227 | m_overrideHtmlColors: 0 228 | m_faceColor: 229 | serializedVersion: 2 230 | rgba: 4294967295 231 | m_fontSize: 30 232 | m_fontSizeBase: 30 233 | m_fontWeight: 400 234 | m_enableAutoSizing: 0 235 | m_fontSizeMin: 18 236 | m_fontSizeMax: 72 237 | m_fontStyle: 0 238 | m_HorizontalAlignment: 2 239 | m_VerticalAlignment: 512 240 | m_textAlignment: 65535 241 | m_characterSpacing: 0 242 | m_wordSpacing: 0 243 | m_lineSpacing: 0 244 | m_lineSpacingMax: 0 245 | m_paragraphSpacing: 0 246 | m_charWidthMaxAdj: 0 247 | m_enableWordWrapping: 1 248 | m_wordWrappingRatios: 0.4 249 | m_overflowMode: 0 250 | m_linkedTextComponent: {fileID: 0} 251 | parentLinkedComponent: {fileID: 0} 252 | m_enableKerning: 1 253 | m_enableExtraPadding: 0 254 | checkPaddingRequired: 0 255 | m_isRichText: 1 256 | m_parseCtrlCharacters: 1 257 | m_isOrthographic: 1 258 | m_isCullingEnabled: 0 259 | m_horizontalMapping: 0 260 | m_verticalMapping: 0 261 | m_uvLineOffset: 0 262 | m_geometrySortingOrder: 0 263 | m_IsTextObjectScaleStatic: 0 264 | m_VertexBufferAutoSizeReduction: 0 265 | m_useMaxVisibleDescender: 1 266 | m_pageToDisplay: 1 267 | m_margin: {x: 0, y: 0, z: 0, w: 0} 268 | m_isUsingLegacyAnimationComponent: 0 269 | m_isVolumetricText: 0 270 | m_hasFontAssetChanged: 0 271 | m_baseMaterial: {fileID: 0} 272 | m_maskOffset: {x: 0, y: 0, z: 0, w: 0} 273 | --- !u!1 &1123701429321701316 274 | GameObject: 275 | m_ObjectHideFlags: 0 276 | m_CorrespondingSourceObject: {fileID: 0} 277 | m_PrefabInstance: {fileID: 0} 278 | m_PrefabAsset: {fileID: 0} 279 | serializedVersion: 6 280 | m_Component: 281 | - component: {fileID: 5456539686814339195} 282 | m_Layer: 0 283 | m_Name: HotFixProgressPanel 284 | m_TagString: Untagged 285 | m_Icon: {fileID: 0} 286 | m_NavMeshLayer: 0 287 | m_StaticEditorFlags: 0 288 | m_IsActive: 1 289 | --- !u!224 &5456539686814339195 290 | RectTransform: 291 | m_ObjectHideFlags: 0 292 | m_CorrespondingSourceObject: {fileID: 0} 293 | m_PrefabInstance: {fileID: 0} 294 | m_PrefabAsset: {fileID: 0} 295 | m_GameObject: {fileID: 1123701429321701316} 296 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 297 | m_LocalPosition: {x: 0, y: 0, z: 0} 298 | m_LocalScale: {x: 1, y: 1, z: 1} 299 | m_ConstrainProportionsScale: 0 300 | m_Children: 301 | - {fileID: 4470291330515367484} 302 | - {fileID: 6110421669070930103} 303 | - {fileID: 3172693902633664966} 304 | - {fileID: 8647513967100720668} 305 | m_Father: {fileID: 0} 306 | m_RootOrder: 0 307 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 308 | m_AnchorMin: {x: 0.5, y: 0} 309 | m_AnchorMax: {x: 0.5, y: 0} 310 | m_AnchoredPosition: {x: 0, y: 0} 311 | m_SizeDelta: {x: 0, y: 0} 312 | m_Pivot: {x: 0.5, y: 0.5} 313 | --- !u!1 &3099826599417027770 314 | GameObject: 315 | m_ObjectHideFlags: 0 316 | m_CorrespondingSourceObject: {fileID: 0} 317 | m_PrefabInstance: {fileID: 0} 318 | m_PrefabAsset: {fileID: 0} 319 | serializedVersion: 6 320 | m_Component: 321 | - component: {fileID: 2628986474834600709} 322 | - component: {fileID: 7486347552832532661} 323 | - component: {fileID: 4133962839995778045} 324 | m_Layer: 0 325 | m_Name: LoadingProgressPoint 326 | m_TagString: Untagged 327 | m_Icon: {fileID: 0} 328 | m_NavMeshLayer: 0 329 | m_StaticEditorFlags: 0 330 | m_IsActive: 1 331 | --- !u!224 &2628986474834600709 332 | RectTransform: 333 | m_ObjectHideFlags: 0 334 | m_CorrespondingSourceObject: {fileID: 0} 335 | m_PrefabInstance: {fileID: 0} 336 | m_PrefabAsset: {fileID: 0} 337 | m_GameObject: {fileID: 3099826599417027770} 338 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 339 | m_LocalPosition: {x: 0, y: 0, z: 0} 340 | m_LocalScale: {x: 1, y: 1, z: 1} 341 | m_ConstrainProportionsScale: 0 342 | m_Children: [] 343 | m_Father: {fileID: 6110421669070930103} 344 | m_RootOrder: 0 345 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 346 | m_AnchorMin: {x: 0.5, y: 0.5} 347 | m_AnchorMax: {x: 0.5, y: 0.5} 348 | m_AnchoredPosition: {x: 0, y: 0} 349 | m_SizeDelta: {x: 80, y: 80} 350 | m_Pivot: {x: 0.5, y: 0.5} 351 | --- !u!222 &7486347552832532661 352 | CanvasRenderer: 353 | m_ObjectHideFlags: 0 354 | m_CorrespondingSourceObject: {fileID: 0} 355 | m_PrefabInstance: {fileID: 0} 356 | m_PrefabAsset: {fileID: 0} 357 | m_GameObject: {fileID: 3099826599417027770} 358 | m_CullTransparentMesh: 1 359 | --- !u!114 &4133962839995778045 360 | MonoBehaviour: 361 | m_ObjectHideFlags: 0 362 | m_CorrespondingSourceObject: {fileID: 0} 363 | m_PrefabInstance: {fileID: 0} 364 | m_PrefabAsset: {fileID: 0} 365 | m_GameObject: {fileID: 3099826599417027770} 366 | m_Enabled: 1 367 | m_EditorHideFlags: 0 368 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 369 | m_Name: 370 | m_EditorClassIdentifier: 371 | m_Material: {fileID: 0} 372 | m_Color: {r: 0.766, g: 0.766, b: 0.766, a: 1} 373 | m_RaycastTarget: 1 374 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 375 | m_Maskable: 1 376 | m_OnCullStateChanged: 377 | m_PersistentCalls: 378 | m_Calls: [] 379 | m_Sprite: {fileID: 21300000, guid: 0974a31d5b93ee5428a3566e164f1566, type: 3} 380 | m_Type: 0 381 | m_PreserveAspect: 0 382 | m_FillCenter: 1 383 | m_FillMethod: 4 384 | m_FillAmount: 1 385 | m_FillClockwise: 1 386 | m_FillOrigin: 0 387 | m_UseSpriteMesh: 0 388 | m_PixelsPerUnitMultiplier: 1 389 | --- !u!1 &5023647824485644597 390 | GameObject: 391 | m_ObjectHideFlags: 0 392 | m_CorrespondingSourceObject: {fileID: 0} 393 | m_PrefabInstance: {fileID: 0} 394 | m_PrefabAsset: {fileID: 0} 395 | serializedVersion: 6 396 | m_Component: 397 | - component: {fileID: 4470291330515367484} 398 | - component: {fileID: 2934406742509676577} 399 | - component: {fileID: 7833289984662660771} 400 | m_Layer: 0 401 | m_Name: LoadingProgressBG 402 | m_TagString: Untagged 403 | m_Icon: {fileID: 0} 404 | m_NavMeshLayer: 0 405 | m_StaticEditorFlags: 0 406 | m_IsActive: 1 407 | --- !u!224 &4470291330515367484 408 | RectTransform: 409 | m_ObjectHideFlags: 0 410 | m_CorrespondingSourceObject: {fileID: 0} 411 | m_PrefabInstance: {fileID: 0} 412 | m_PrefabAsset: {fileID: 0} 413 | m_GameObject: {fileID: 5023647824485644597} 414 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 415 | m_LocalPosition: {x: 0, y: 0, z: 0} 416 | m_LocalScale: {x: 1, y: 1, z: 1} 417 | m_ConstrainProportionsScale: 0 418 | m_Children: [] 419 | m_Father: {fileID: 5456539686814339195} 420 | m_RootOrder: 0 421 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 422 | m_AnchorMin: {x: 0.5, y: 0.5} 423 | m_AnchorMax: {x: 0.5, y: 0.5} 424 | m_AnchoredPosition: {x: 0, y: 88.26898} 425 | m_SizeDelta: {x: 1742.7588, y: 40} 426 | m_Pivot: {x: 0.5, y: 0.5} 427 | --- !u!222 &2934406742509676577 428 | CanvasRenderer: 429 | m_ObjectHideFlags: 0 430 | m_CorrespondingSourceObject: {fileID: 0} 431 | m_PrefabInstance: {fileID: 0} 432 | m_PrefabAsset: {fileID: 0} 433 | m_GameObject: {fileID: 5023647824485644597} 434 | m_CullTransparentMesh: 1 435 | --- !u!114 &7833289984662660771 436 | MonoBehaviour: 437 | m_ObjectHideFlags: 0 438 | m_CorrespondingSourceObject: {fileID: 0} 439 | m_PrefabInstance: {fileID: 0} 440 | m_PrefabAsset: {fileID: 0} 441 | m_GameObject: {fileID: 5023647824485644597} 442 | m_Enabled: 1 443 | m_EditorHideFlags: 0 444 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 445 | m_Name: 446 | m_EditorClassIdentifier: 447 | m_Material: {fileID: 0} 448 | m_Color: {r: 1, g: 1, b: 1, a: 1} 449 | m_RaycastTarget: 1 450 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 451 | m_Maskable: 1 452 | m_OnCullStateChanged: 453 | m_PersistentCalls: 454 | m_Calls: [] 455 | m_Sprite: {fileID: 21300000, guid: 59f3cae74e0cc4f4e8c283b32cdb96f0, type: 3} 456 | m_Type: 1 457 | m_PreserveAspect: 0 458 | m_FillCenter: 1 459 | m_FillMethod: 4 460 | m_FillAmount: 1 461 | m_FillClockwise: 1 462 | m_FillOrigin: 0 463 | m_UseSpriteMesh: 0 464 | m_PixelsPerUnitMultiplier: 2 465 | --- !u!1 &6261655222081718120 466 | GameObject: 467 | m_ObjectHideFlags: 0 468 | m_CorrespondingSourceObject: {fileID: 0} 469 | m_PrefabInstance: {fileID: 0} 470 | m_PrefabAsset: {fileID: 0} 471 | serializedVersion: 6 472 | m_Component: 473 | - component: {fileID: 6110421669070930103} 474 | - component: {fileID: 8318272324803318262} 475 | - component: {fileID: 1476059550557219976} 476 | m_Layer: 0 477 | m_Name: LoadingProgressFG 478 | m_TagString: Untagged 479 | m_Icon: {fileID: 0} 480 | m_NavMeshLayer: 0 481 | m_StaticEditorFlags: 0 482 | m_IsActive: 1 483 | --- !u!224 &6110421669070930103 484 | RectTransform: 485 | m_ObjectHideFlags: 0 486 | m_CorrespondingSourceObject: {fileID: 0} 487 | m_PrefabInstance: {fileID: 0} 488 | m_PrefabAsset: {fileID: 0} 489 | m_GameObject: {fileID: 6261655222081718120} 490 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 491 | m_LocalPosition: {x: 0, y: 0, z: 0} 492 | m_LocalScale: {x: 1, y: 1, z: 1} 493 | m_ConstrainProportionsScale: 0 494 | m_Children: 495 | - {fileID: 2628986474834600709} 496 | m_Father: {fileID: 5456539686814339195} 497 | m_RootOrder: 1 498 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 499 | m_AnchorMin: {x: 0.5, y: 0.5} 500 | m_AnchorMax: {x: 0.5, y: 0.5} 501 | m_AnchoredPosition: {x: -0.0001, y: 88.26898} 502 | m_SizeDelta: {x: 1742.7588, y: 40} 503 | m_Pivot: {x: 0.5, y: 0.5} 504 | --- !u!222 &8318272324803318262 505 | CanvasRenderer: 506 | m_ObjectHideFlags: 0 507 | m_CorrespondingSourceObject: {fileID: 0} 508 | m_PrefabInstance: {fileID: 0} 509 | m_PrefabAsset: {fileID: 0} 510 | m_GameObject: {fileID: 6261655222081718120} 511 | m_CullTransparentMesh: 1 512 | --- !u!114 &1476059550557219976 513 | MonoBehaviour: 514 | m_ObjectHideFlags: 0 515 | m_CorrespondingSourceObject: {fileID: 0} 516 | m_PrefabInstance: {fileID: 0} 517 | m_PrefabAsset: {fileID: 0} 518 | m_GameObject: {fileID: 6261655222081718120} 519 | m_Enabled: 1 520 | m_EditorHideFlags: 0 521 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 522 | m_Name: 523 | m_EditorClassIdentifier: 524 | m_Material: {fileID: 0} 525 | m_Color: {r: 0.24230155, g: 0.30861416, b: 0.31132078, a: 1} 526 | m_RaycastTarget: 1 527 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 528 | m_Maskable: 1 529 | m_OnCullStateChanged: 530 | m_PersistentCalls: 531 | m_Calls: [] 532 | m_Sprite: {fileID: 21300000, guid: 674787eb10556f14287c34d65078bd5d, type: 3} 533 | m_Type: 3 534 | m_PreserveAspect: 0 535 | m_FillCenter: 1 536 | m_FillMethod: 0 537 | m_FillAmount: 0.5 538 | m_FillClockwise: 1 539 | m_FillOrigin: 0 540 | m_UseSpriteMesh: 0 541 | m_PixelsPerUnitMultiplier: 1 542 | -------------------------------------------------------------------------------- /Resources/ResPrefabs/HotFixProgressPanel.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cea1159a7e85b3f40a118294ede251a2 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Resources/ResPrefabs/SangoPatchRoot.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &2274285450713248455 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 770158323821192275} 12 | m_Layer: 5 13 | m_Name: SangoPatchRoot 14 | m_TagString: Untagged 15 | m_Icon: {fileID: 0} 16 | m_NavMeshLayer: 0 17 | m_StaticEditorFlags: 0 18 | m_IsActive: 1 19 | --- !u!224 &770158323821192275 20 | RectTransform: 21 | m_ObjectHideFlags: 0 22 | m_CorrespondingSourceObject: {fileID: 0} 23 | m_PrefabInstance: {fileID: 0} 24 | m_PrefabAsset: {fileID: 0} 25 | m_GameObject: {fileID: 2274285450713248455} 26 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 27 | m_LocalPosition: {x: 0, y: 0, z: 0} 28 | m_LocalScale: {x: 1, y: 1, z: 1} 29 | m_ConstrainProportionsScale: 0 30 | m_Children: 31 | - {fileID: 82544663495226852} 32 | - {fileID: 1876427292118920351} 33 | - {fileID: 8091390473429781909} 34 | m_Father: {fileID: 0} 35 | m_RootOrder: 0 36 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 37 | m_AnchorMin: {x: 0, y: 0} 38 | m_AnchorMax: {x: 1, y: 1} 39 | m_AnchoredPosition: {x: 0, y: 0} 40 | m_SizeDelta: {x: 0, y: 0} 41 | m_Pivot: {x: 0, y: 0} 42 | --- !u!1001 &827656286555271066 43 | PrefabInstance: 44 | m_ObjectHideFlags: 0 45 | serializedVersion: 2 46 | m_Modification: 47 | m_TransformParent: {fileID: 770158323821192275} 48 | m_Modifications: 49 | - target: {fileID: 745676617468238462, guid: 1dc08fa7887ec744bba872b6d80d5e69, type: 3} 50 | propertyPath: m_Pivot.x 51 | value: 0.5 52 | objectReference: {fileID: 0} 53 | - target: {fileID: 745676617468238462, guid: 1dc08fa7887ec744bba872b6d80d5e69, type: 3} 54 | propertyPath: m_Pivot.y 55 | value: 0.5 56 | objectReference: {fileID: 0} 57 | - target: {fileID: 745676617468238462, guid: 1dc08fa7887ec744bba872b6d80d5e69, type: 3} 58 | propertyPath: m_RootOrder 59 | value: 0 60 | objectReference: {fileID: 0} 61 | - target: {fileID: 745676617468238462, guid: 1dc08fa7887ec744bba872b6d80d5e69, type: 3} 62 | propertyPath: m_AnchorMax.x 63 | value: 1 64 | objectReference: {fileID: 0} 65 | - target: {fileID: 745676617468238462, guid: 1dc08fa7887ec744bba872b6d80d5e69, type: 3} 66 | propertyPath: m_AnchorMax.y 67 | value: 0.5 68 | objectReference: {fileID: 0} 69 | - target: {fileID: 745676617468238462, guid: 1dc08fa7887ec744bba872b6d80d5e69, type: 3} 70 | propertyPath: m_AnchorMin.x 71 | value: 0 72 | objectReference: {fileID: 0} 73 | - target: {fileID: 745676617468238462, guid: 1dc08fa7887ec744bba872b6d80d5e69, type: 3} 74 | propertyPath: m_AnchorMin.y 75 | value: 0.5 76 | objectReference: {fileID: 0} 77 | - target: {fileID: 745676617468238462, guid: 1dc08fa7887ec744bba872b6d80d5e69, type: 3} 78 | propertyPath: m_SizeDelta.x 79 | value: 0 80 | objectReference: {fileID: 0} 81 | - target: {fileID: 745676617468238462, guid: 1dc08fa7887ec744bba872b6d80d5e69, type: 3} 82 | propertyPath: m_SizeDelta.y 83 | value: 1080 84 | objectReference: {fileID: 0} 85 | - target: {fileID: 745676617468238462, guid: 1dc08fa7887ec744bba872b6d80d5e69, type: 3} 86 | propertyPath: m_LocalPosition.x 87 | value: 0 88 | objectReference: {fileID: 0} 89 | - target: {fileID: 745676617468238462, guid: 1dc08fa7887ec744bba872b6d80d5e69, type: 3} 90 | propertyPath: m_LocalPosition.y 91 | value: 0 92 | objectReference: {fileID: 0} 93 | - target: {fileID: 745676617468238462, guid: 1dc08fa7887ec744bba872b6d80d5e69, type: 3} 94 | propertyPath: m_LocalPosition.z 95 | value: 0 96 | objectReference: {fileID: 0} 97 | - target: {fileID: 745676617468238462, guid: 1dc08fa7887ec744bba872b6d80d5e69, type: 3} 98 | propertyPath: m_LocalRotation.w 99 | value: 1 100 | objectReference: {fileID: 0} 101 | - target: {fileID: 745676617468238462, guid: 1dc08fa7887ec744bba872b6d80d5e69, type: 3} 102 | propertyPath: m_LocalRotation.x 103 | value: -0 104 | objectReference: {fileID: 0} 105 | - target: {fileID: 745676617468238462, guid: 1dc08fa7887ec744bba872b6d80d5e69, type: 3} 106 | propertyPath: m_LocalRotation.y 107 | value: -0 108 | objectReference: {fileID: 0} 109 | - target: {fileID: 745676617468238462, guid: 1dc08fa7887ec744bba872b6d80d5e69, type: 3} 110 | propertyPath: m_LocalRotation.z 111 | value: -0 112 | objectReference: {fileID: 0} 113 | - target: {fileID: 745676617468238462, guid: 1dc08fa7887ec744bba872b6d80d5e69, type: 3} 114 | propertyPath: m_AnchoredPosition.x 115 | value: 0 116 | objectReference: {fileID: 0} 117 | - target: {fileID: 745676617468238462, guid: 1dc08fa7887ec744bba872b6d80d5e69, type: 3} 118 | propertyPath: m_AnchoredPosition.y 119 | value: 0 120 | objectReference: {fileID: 0} 121 | - target: {fileID: 745676617468238462, guid: 1dc08fa7887ec744bba872b6d80d5e69, type: 3} 122 | propertyPath: m_LocalEulerAnglesHint.x 123 | value: 0 124 | objectReference: {fileID: 0} 125 | - target: {fileID: 745676617468238462, guid: 1dc08fa7887ec744bba872b6d80d5e69, type: 3} 126 | propertyPath: m_LocalEulerAnglesHint.y 127 | value: 0 128 | objectReference: {fileID: 0} 129 | - target: {fileID: 745676617468238462, guid: 1dc08fa7887ec744bba872b6d80d5e69, type: 3} 130 | propertyPath: m_LocalEulerAnglesHint.z 131 | value: 0 132 | objectReference: {fileID: 0} 133 | - target: {fileID: 1664767977149602139, guid: 1dc08fa7887ec744bba872b6d80d5e69, type: 3} 134 | propertyPath: m_Name 135 | value: HotFixBG 136 | objectReference: {fileID: 0} 137 | m_RemovedComponents: [] 138 | m_SourcePrefab: {fileID: 100100000, guid: 1dc08fa7887ec744bba872b6d80d5e69, type: 3} 139 | --- !u!224 &82544663495226852 stripped 140 | RectTransform: 141 | m_CorrespondingSourceObject: {fileID: 745676617468238462, guid: 1dc08fa7887ec744bba872b6d80d5e69, type: 3} 142 | m_PrefabInstance: {fileID: 827656286555271066} 143 | m_PrefabAsset: {fileID: 0} 144 | --- !u!1001 &5887310002791349476 145 | PrefabInstance: 146 | m_ObjectHideFlags: 0 147 | serializedVersion: 2 148 | m_Modification: 149 | m_TransformParent: {fileID: 770158323821192275} 150 | m_Modifications: 151 | - target: {fileID: 1123701429321701316, guid: cea1159a7e85b3f40a118294ede251a2, type: 3} 152 | propertyPath: m_Name 153 | value: HotFixProgressPanel 154 | objectReference: {fileID: 0} 155 | - target: {fileID: 5456539686814339195, guid: cea1159a7e85b3f40a118294ede251a2, type: 3} 156 | propertyPath: m_Pivot.x 157 | value: 0.5 158 | objectReference: {fileID: 0} 159 | - target: {fileID: 5456539686814339195, guid: cea1159a7e85b3f40a118294ede251a2, type: 3} 160 | propertyPath: m_Pivot.y 161 | value: 0.5 162 | objectReference: {fileID: 0} 163 | - target: {fileID: 5456539686814339195, guid: cea1159a7e85b3f40a118294ede251a2, type: 3} 164 | propertyPath: m_RootOrder 165 | value: 1 166 | objectReference: {fileID: 0} 167 | - target: {fileID: 5456539686814339195, guid: cea1159a7e85b3f40a118294ede251a2, type: 3} 168 | propertyPath: m_AnchorMax.x 169 | value: 0.5 170 | objectReference: {fileID: 0} 171 | - target: {fileID: 5456539686814339195, guid: cea1159a7e85b3f40a118294ede251a2, type: 3} 172 | propertyPath: m_AnchorMax.y 173 | value: 0 174 | objectReference: {fileID: 0} 175 | - target: {fileID: 5456539686814339195, guid: cea1159a7e85b3f40a118294ede251a2, type: 3} 176 | propertyPath: m_AnchorMin.x 177 | value: 0.5 178 | objectReference: {fileID: 0} 179 | - target: {fileID: 5456539686814339195, guid: cea1159a7e85b3f40a118294ede251a2, type: 3} 180 | propertyPath: m_AnchorMin.y 181 | value: 0 182 | objectReference: {fileID: 0} 183 | - target: {fileID: 5456539686814339195, guid: cea1159a7e85b3f40a118294ede251a2, type: 3} 184 | propertyPath: m_SizeDelta.x 185 | value: 0 186 | objectReference: {fileID: 0} 187 | - target: {fileID: 5456539686814339195, guid: cea1159a7e85b3f40a118294ede251a2, type: 3} 188 | propertyPath: m_SizeDelta.y 189 | value: 0 190 | objectReference: {fileID: 0} 191 | - target: {fileID: 5456539686814339195, guid: cea1159a7e85b3f40a118294ede251a2, type: 3} 192 | propertyPath: m_LocalPosition.x 193 | value: 0 194 | objectReference: {fileID: 0} 195 | - target: {fileID: 5456539686814339195, guid: cea1159a7e85b3f40a118294ede251a2, type: 3} 196 | propertyPath: m_LocalPosition.y 197 | value: 0 198 | objectReference: {fileID: 0} 199 | - target: {fileID: 5456539686814339195, guid: cea1159a7e85b3f40a118294ede251a2, type: 3} 200 | propertyPath: m_LocalPosition.z 201 | value: 0 202 | objectReference: {fileID: 0} 203 | - target: {fileID: 5456539686814339195, guid: cea1159a7e85b3f40a118294ede251a2, type: 3} 204 | propertyPath: m_LocalRotation.w 205 | value: 1 206 | objectReference: {fileID: 0} 207 | - target: {fileID: 5456539686814339195, guid: cea1159a7e85b3f40a118294ede251a2, type: 3} 208 | propertyPath: m_LocalRotation.x 209 | value: -0 210 | objectReference: {fileID: 0} 211 | - target: {fileID: 5456539686814339195, guid: cea1159a7e85b3f40a118294ede251a2, type: 3} 212 | propertyPath: m_LocalRotation.y 213 | value: -0 214 | objectReference: {fileID: 0} 215 | - target: {fileID: 5456539686814339195, guid: cea1159a7e85b3f40a118294ede251a2, type: 3} 216 | propertyPath: m_LocalRotation.z 217 | value: -0 218 | objectReference: {fileID: 0} 219 | - target: {fileID: 5456539686814339195, guid: cea1159a7e85b3f40a118294ede251a2, type: 3} 220 | propertyPath: m_AnchoredPosition.x 221 | value: 0 222 | objectReference: {fileID: 0} 223 | - target: {fileID: 5456539686814339195, guid: cea1159a7e85b3f40a118294ede251a2, type: 3} 224 | propertyPath: m_AnchoredPosition.y 225 | value: 25 226 | objectReference: {fileID: 0} 227 | - target: {fileID: 5456539686814339195, guid: cea1159a7e85b3f40a118294ede251a2, type: 3} 228 | propertyPath: m_LocalEulerAnglesHint.x 229 | value: 0 230 | objectReference: {fileID: 0} 231 | - target: {fileID: 5456539686814339195, guid: cea1159a7e85b3f40a118294ede251a2, type: 3} 232 | propertyPath: m_LocalEulerAnglesHint.y 233 | value: 0 234 | objectReference: {fileID: 0} 235 | - target: {fileID: 5456539686814339195, guid: cea1159a7e85b3f40a118294ede251a2, type: 3} 236 | propertyPath: m_LocalEulerAnglesHint.z 237 | value: 0 238 | objectReference: {fileID: 0} 239 | m_RemovedComponents: [] 240 | m_SourcePrefab: {fileID: 100100000, guid: cea1159a7e85b3f40a118294ede251a2, type: 3} 241 | --- !u!224 &1876427292118920351 stripped 242 | RectTransform: 243 | m_CorrespondingSourceObject: {fileID: 5456539686814339195, guid: cea1159a7e85b3f40a118294ede251a2, type: 3} 244 | m_PrefabInstance: {fileID: 5887310002791349476} 245 | m_PrefabAsset: {fileID: 0} 246 | --- !u!1001 &6956855755700825159 247 | PrefabInstance: 248 | m_ObjectHideFlags: 0 249 | serializedVersion: 2 250 | m_Modification: 251 | m_TransformParent: {fileID: 770158323821192275} 252 | m_Modifications: 253 | - target: {fileID: 1207478930461614546, guid: c68d29858286fe8409e7ce75f46b6885, type: 3} 254 | propertyPath: m_Pivot.x 255 | value: 0.5 256 | objectReference: {fileID: 0} 257 | - target: {fileID: 1207478930461614546, guid: c68d29858286fe8409e7ce75f46b6885, type: 3} 258 | propertyPath: m_Pivot.y 259 | value: 0.5 260 | objectReference: {fileID: 0} 261 | - target: {fileID: 1207478930461614546, guid: c68d29858286fe8409e7ce75f46b6885, type: 3} 262 | propertyPath: m_RootOrder 263 | value: 2 264 | objectReference: {fileID: 0} 265 | - target: {fileID: 1207478930461614546, guid: c68d29858286fe8409e7ce75f46b6885, type: 3} 266 | propertyPath: m_AnchorMax.x 267 | value: 0.5 268 | objectReference: {fileID: 0} 269 | - target: {fileID: 1207478930461614546, guid: c68d29858286fe8409e7ce75f46b6885, type: 3} 270 | propertyPath: m_AnchorMax.y 271 | value: 0.5 272 | objectReference: {fileID: 0} 273 | - target: {fileID: 1207478930461614546, guid: c68d29858286fe8409e7ce75f46b6885, type: 3} 274 | propertyPath: m_AnchorMin.x 275 | value: 0.5 276 | objectReference: {fileID: 0} 277 | - target: {fileID: 1207478930461614546, guid: c68d29858286fe8409e7ce75f46b6885, type: 3} 278 | propertyPath: m_AnchorMin.y 279 | value: 0.5 280 | objectReference: {fileID: 0} 281 | - target: {fileID: 1207478930461614546, guid: c68d29858286fe8409e7ce75f46b6885, type: 3} 282 | propertyPath: m_SizeDelta.x 283 | value: 100 284 | objectReference: {fileID: 0} 285 | - target: {fileID: 1207478930461614546, guid: c68d29858286fe8409e7ce75f46b6885, type: 3} 286 | propertyPath: m_SizeDelta.y 287 | value: 100 288 | objectReference: {fileID: 0} 289 | - target: {fileID: 1207478930461614546, guid: c68d29858286fe8409e7ce75f46b6885, type: 3} 290 | propertyPath: m_LocalPosition.x 291 | value: 0 292 | objectReference: {fileID: 0} 293 | - target: {fileID: 1207478930461614546, guid: c68d29858286fe8409e7ce75f46b6885, type: 3} 294 | propertyPath: m_LocalPosition.y 295 | value: 0 296 | objectReference: {fileID: 0} 297 | - target: {fileID: 1207478930461614546, guid: c68d29858286fe8409e7ce75f46b6885, type: 3} 298 | propertyPath: m_LocalPosition.z 299 | value: 0 300 | objectReference: {fileID: 0} 301 | - target: {fileID: 1207478930461614546, guid: c68d29858286fe8409e7ce75f46b6885, type: 3} 302 | propertyPath: m_LocalRotation.w 303 | value: 1 304 | objectReference: {fileID: 0} 305 | - target: {fileID: 1207478930461614546, guid: c68d29858286fe8409e7ce75f46b6885, type: 3} 306 | propertyPath: m_LocalRotation.x 307 | value: -0 308 | objectReference: {fileID: 0} 309 | - target: {fileID: 1207478930461614546, guid: c68d29858286fe8409e7ce75f46b6885, type: 3} 310 | propertyPath: m_LocalRotation.y 311 | value: -0 312 | objectReference: {fileID: 0} 313 | - target: {fileID: 1207478930461614546, guid: c68d29858286fe8409e7ce75f46b6885, type: 3} 314 | propertyPath: m_LocalRotation.z 315 | value: -0 316 | objectReference: {fileID: 0} 317 | - target: {fileID: 1207478930461614546, guid: c68d29858286fe8409e7ce75f46b6885, type: 3} 318 | propertyPath: m_AnchoredPosition.x 319 | value: 0 320 | objectReference: {fileID: 0} 321 | - target: {fileID: 1207478930461614546, guid: c68d29858286fe8409e7ce75f46b6885, type: 3} 322 | propertyPath: m_AnchoredPosition.y 323 | value: 0 324 | objectReference: {fileID: 0} 325 | - target: {fileID: 1207478930461614546, guid: c68d29858286fe8409e7ce75f46b6885, type: 3} 326 | propertyPath: m_LocalEulerAnglesHint.x 327 | value: 0 328 | objectReference: {fileID: 0} 329 | - target: {fileID: 1207478930461614546, guid: c68d29858286fe8409e7ce75f46b6885, type: 3} 330 | propertyPath: m_LocalEulerAnglesHint.y 331 | value: 0 332 | objectReference: {fileID: 0} 333 | - target: {fileID: 1207478930461614546, guid: c68d29858286fe8409e7ce75f46b6885, type: 3} 334 | propertyPath: m_LocalEulerAnglesHint.z 335 | value: 0 336 | objectReference: {fileID: 0} 337 | - target: {fileID: 8372635064853897010, guid: c68d29858286fe8409e7ce75f46b6885, type: 3} 338 | propertyPath: m_Name 339 | value: MessageBox 340 | objectReference: {fileID: 0} 341 | m_RemovedComponents: [] 342 | m_SourcePrefab: {fileID: 100100000, guid: c68d29858286fe8409e7ce75f46b6885, type: 3} 343 | --- !u!224 &8091390473429781909 stripped 344 | RectTransform: 345 | m_CorrespondingSourceObject: {fileID: 1207478930461614546, guid: c68d29858286fe8409e7ce75f46b6885, type: 3} 346 | m_PrefabInstance: {fileID: 6956855755700825159} 347 | m_PrefabAsset: {fileID: 0} 348 | -------------------------------------------------------------------------------- /Resources/ResPrefabs/SangoPatchRoot.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 92e1a3357585db6459bd2d98f01ace11 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Resources/ResSprites.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d7c56c08b3b701a43b5bcc8e6059a7b3 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Resources/ResSprites/Gcg_Loading_Bg2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gaolingx/SangoUtils.Hotfix_YooAsset/717e5e8d43dd080a7b25adef8bed4f7bb33dce69/Resources/ResSprites/Gcg_Loading_Bg2.png -------------------------------------------------------------------------------- /Resources/ResSprites/Gcg_Loading_Bg2.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0bb95d0c6588ec441b3543f6b7e71753 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 12 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | flipGreenChannel: 0 24 | isReadable: 0 25 | streamingMipmaps: 0 26 | streamingMipmapsPriority: 0 27 | vTOnly: 0 28 | ignoreMipmapLimit: 0 29 | grayScaleToAlpha: 0 30 | generateCubemap: 6 31 | cubemapConvolution: 0 32 | seamlessCubemap: 0 33 | textureFormat: 1 34 | maxTextureSize: 2048 35 | textureSettings: 36 | serializedVersion: 2 37 | filterMode: 1 38 | aniso: 1 39 | mipBias: 0 40 | wrapU: 1 41 | wrapV: 1 42 | wrapW: 0 43 | nPOTScale: 0 44 | lightmap: 0 45 | compressionQuality: 50 46 | spriteMode: 1 47 | spriteExtrude: 1 48 | spriteMeshType: 1 49 | alignment: 0 50 | spritePivot: {x: 0.5, y: 0.5} 51 | spritePixelsToUnits: 100 52 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 53 | spriteGenerateFallbackPhysicsShape: 1 54 | alphaUsage: 1 55 | alphaIsTransparency: 1 56 | spriteTessellationDetail: -1 57 | textureType: 8 58 | textureShape: 1 59 | singleChannelComponent: 0 60 | flipbookRows: 1 61 | flipbookColumns: 1 62 | maxTextureSizeSet: 0 63 | compressionQualitySet: 0 64 | textureFormatSet: 0 65 | ignorePngGamma: 0 66 | applyGammaDecoding: 0 67 | swizzle: 50462976 68 | cookieLightType: 0 69 | platformSettings: 70 | - serializedVersion: 3 71 | buildTarget: DefaultTexturePlatform 72 | maxTextureSize: 2048 73 | resizeAlgorithm: 0 74 | textureFormat: -1 75 | textureCompression: 1 76 | compressionQuality: 50 77 | crunchedCompression: 0 78 | allowsAlphaSplitting: 0 79 | overridden: 0 80 | ignorePlatformSupport: 0 81 | androidETC2FallbackOverride: 0 82 | forceMaximumCompressionQuality_BC6H_BC7: 0 83 | - serializedVersion: 3 84 | buildTarget: Standalone 85 | maxTextureSize: 2048 86 | resizeAlgorithm: 0 87 | textureFormat: -1 88 | textureCompression: 1 89 | compressionQuality: 50 90 | crunchedCompression: 0 91 | allowsAlphaSplitting: 0 92 | overridden: 0 93 | ignorePlatformSupport: 0 94 | androidETC2FallbackOverride: 0 95 | forceMaximumCompressionQuality_BC6H_BC7: 0 96 | - serializedVersion: 3 97 | buildTarget: Server 98 | maxTextureSize: 2048 99 | resizeAlgorithm: 0 100 | textureFormat: -1 101 | textureCompression: 1 102 | compressionQuality: 50 103 | crunchedCompression: 0 104 | allowsAlphaSplitting: 0 105 | overridden: 0 106 | ignorePlatformSupport: 0 107 | androidETC2FallbackOverride: 0 108 | forceMaximumCompressionQuality_BC6H_BC7: 0 109 | - serializedVersion: 3 110 | buildTarget: Android 111 | maxTextureSize: 2048 112 | resizeAlgorithm: 0 113 | textureFormat: -1 114 | textureCompression: 1 115 | compressionQuality: 50 116 | crunchedCompression: 0 117 | allowsAlphaSplitting: 0 118 | overridden: 0 119 | ignorePlatformSupport: 0 120 | androidETC2FallbackOverride: 0 121 | forceMaximumCompressionQuality_BC6H_BC7: 0 122 | - serializedVersion: 3 123 | buildTarget: iPhone 124 | maxTextureSize: 2048 125 | resizeAlgorithm: 0 126 | textureFormat: -1 127 | textureCompression: 1 128 | compressionQuality: 50 129 | crunchedCompression: 0 130 | allowsAlphaSplitting: 0 131 | overridden: 0 132 | ignorePlatformSupport: 0 133 | androidETC2FallbackOverride: 0 134 | forceMaximumCompressionQuality_BC6H_BC7: 0 135 | - serializedVersion: 3 136 | buildTarget: WebGL 137 | maxTextureSize: 2048 138 | resizeAlgorithm: 0 139 | textureFormat: -1 140 | textureCompression: 1 141 | compressionQuality: 50 142 | crunchedCompression: 0 143 | allowsAlphaSplitting: 0 144 | overridden: 0 145 | ignorePlatformSupport: 0 146 | androidETC2FallbackOverride: 0 147 | forceMaximumCompressionQuality_BC6H_BC7: 0 148 | - serializedVersion: 3 149 | buildTarget: Windows Store Apps 150 | maxTextureSize: 2048 151 | resizeAlgorithm: 0 152 | textureFormat: -1 153 | textureCompression: 1 154 | compressionQuality: 50 155 | crunchedCompression: 0 156 | allowsAlphaSplitting: 0 157 | overridden: 0 158 | ignorePlatformSupport: 0 159 | androidETC2FallbackOverride: 0 160 | forceMaximumCompressionQuality_BC6H_BC7: 0 161 | - serializedVersion: 3 162 | buildTarget: tvOS 163 | maxTextureSize: 2048 164 | resizeAlgorithm: 0 165 | textureFormat: -1 166 | textureCompression: 1 167 | compressionQuality: 50 168 | crunchedCompression: 0 169 | allowsAlphaSplitting: 0 170 | overridden: 0 171 | ignorePlatformSupport: 0 172 | androidETC2FallbackOverride: 0 173 | forceMaximumCompressionQuality_BC6H_BC7: 0 174 | spriteSheet: 175 | serializedVersion: 2 176 | sprites: [] 177 | outline: [] 178 | physicsShape: [] 179 | bones: [] 180 | spriteID: 5e97eb03825dee720800000000000000 181 | internalID: 0 182 | vertices: [] 183 | indices: 184 | edges: [] 185 | weights: [] 186 | secondaryTextures: [] 187 | nameFileIdTable: {} 188 | mipmapLimitGroupName: 189 | pSDRemoveMatte: 0 190 | userData: 191 | assetBundleName: 192 | assetBundleVariant: 193 | -------------------------------------------------------------------------------- /Resources/ResSprites/UI_FleurFairDungeon_Btn_Bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gaolingx/SangoUtils.Hotfix_YooAsset/717e5e8d43dd080a7b25adef8bed4f7bb33dce69/Resources/ResSprites/UI_FleurFairDungeon_Btn_Bg.png -------------------------------------------------------------------------------- /Resources/ResSprites/UI_FleurFairDungeon_Btn_Bg.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bf7e1c548030f47449f2785f995df1ae 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 12 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | flipGreenChannel: 0 24 | isReadable: 0 25 | streamingMipmaps: 0 26 | streamingMipmapsPriority: 0 27 | vTOnly: 0 28 | ignoreMipmapLimit: 0 29 | grayScaleToAlpha: 0 30 | generateCubemap: 6 31 | cubemapConvolution: 0 32 | seamlessCubemap: 0 33 | textureFormat: 1 34 | maxTextureSize: 2048 35 | textureSettings: 36 | serializedVersion: 2 37 | filterMode: 1 38 | aniso: 1 39 | mipBias: 0 40 | wrapU: 1 41 | wrapV: 1 42 | wrapW: 0 43 | nPOTScale: 0 44 | lightmap: 0 45 | compressionQuality: 50 46 | spriteMode: 1 47 | spriteExtrude: 1 48 | spriteMeshType: 1 49 | alignment: 0 50 | spritePivot: {x: 0.5, y: 0.5} 51 | spritePixelsToUnits: 100 52 | spriteBorder: {x: 59, y: 0, z: 59, w: 0} 53 | spriteGenerateFallbackPhysicsShape: 1 54 | alphaUsage: 1 55 | alphaIsTransparency: 1 56 | spriteTessellationDetail: -1 57 | textureType: 8 58 | textureShape: 1 59 | singleChannelComponent: 0 60 | flipbookRows: 1 61 | flipbookColumns: 1 62 | maxTextureSizeSet: 0 63 | compressionQualitySet: 0 64 | textureFormatSet: 0 65 | ignorePngGamma: 0 66 | applyGammaDecoding: 0 67 | swizzle: 50462976 68 | cookieLightType: 0 69 | platformSettings: 70 | - serializedVersion: 3 71 | buildTarget: DefaultTexturePlatform 72 | maxTextureSize: 2048 73 | resizeAlgorithm: 0 74 | textureFormat: -1 75 | textureCompression: 1 76 | compressionQuality: 50 77 | crunchedCompression: 0 78 | allowsAlphaSplitting: 0 79 | overridden: 0 80 | ignorePlatformSupport: 0 81 | androidETC2FallbackOverride: 0 82 | forceMaximumCompressionQuality_BC6H_BC7: 0 83 | - serializedVersion: 3 84 | buildTarget: Standalone 85 | maxTextureSize: 2048 86 | resizeAlgorithm: 0 87 | textureFormat: -1 88 | textureCompression: 1 89 | compressionQuality: 50 90 | crunchedCompression: 0 91 | allowsAlphaSplitting: 0 92 | overridden: 0 93 | ignorePlatformSupport: 0 94 | androidETC2FallbackOverride: 0 95 | forceMaximumCompressionQuality_BC6H_BC7: 0 96 | - serializedVersion: 3 97 | buildTarget: Server 98 | maxTextureSize: 2048 99 | resizeAlgorithm: 0 100 | textureFormat: -1 101 | textureCompression: 1 102 | compressionQuality: 50 103 | crunchedCompression: 0 104 | allowsAlphaSplitting: 0 105 | overridden: 0 106 | ignorePlatformSupport: 0 107 | androidETC2FallbackOverride: 0 108 | forceMaximumCompressionQuality_BC6H_BC7: 0 109 | - serializedVersion: 3 110 | buildTarget: Android 111 | maxTextureSize: 2048 112 | resizeAlgorithm: 0 113 | textureFormat: -1 114 | textureCompression: 1 115 | compressionQuality: 50 116 | crunchedCompression: 0 117 | allowsAlphaSplitting: 0 118 | overridden: 0 119 | ignorePlatformSupport: 0 120 | androidETC2FallbackOverride: 0 121 | forceMaximumCompressionQuality_BC6H_BC7: 0 122 | - serializedVersion: 3 123 | buildTarget: iPhone 124 | maxTextureSize: 2048 125 | resizeAlgorithm: 0 126 | textureFormat: -1 127 | textureCompression: 1 128 | compressionQuality: 50 129 | crunchedCompression: 0 130 | allowsAlphaSplitting: 0 131 | overridden: 0 132 | ignorePlatformSupport: 0 133 | androidETC2FallbackOverride: 0 134 | forceMaximumCompressionQuality_BC6H_BC7: 0 135 | - serializedVersion: 3 136 | buildTarget: WebGL 137 | maxTextureSize: 2048 138 | resizeAlgorithm: 0 139 | textureFormat: -1 140 | textureCompression: 1 141 | compressionQuality: 50 142 | crunchedCompression: 0 143 | allowsAlphaSplitting: 0 144 | overridden: 0 145 | ignorePlatformSupport: 0 146 | androidETC2FallbackOverride: 0 147 | forceMaximumCompressionQuality_BC6H_BC7: 0 148 | - serializedVersion: 3 149 | buildTarget: Windows Store Apps 150 | maxTextureSize: 2048 151 | resizeAlgorithm: 0 152 | textureFormat: -1 153 | textureCompression: 1 154 | compressionQuality: 50 155 | crunchedCompression: 0 156 | allowsAlphaSplitting: 0 157 | overridden: 0 158 | ignorePlatformSupport: 0 159 | androidETC2FallbackOverride: 0 160 | forceMaximumCompressionQuality_BC6H_BC7: 0 161 | - serializedVersion: 3 162 | buildTarget: tvOS 163 | maxTextureSize: 2048 164 | resizeAlgorithm: 0 165 | textureFormat: -1 166 | textureCompression: 1 167 | compressionQuality: 50 168 | crunchedCompression: 0 169 | allowsAlphaSplitting: 0 170 | overridden: 0 171 | ignorePlatformSupport: 0 172 | androidETC2FallbackOverride: 0 173 | forceMaximumCompressionQuality_BC6H_BC7: 0 174 | spriteSheet: 175 | serializedVersion: 2 176 | sprites: [] 177 | outline: [] 178 | physicsShape: [] 179 | bones: [] 180 | spriteID: 5e97eb03825dee720800000000000000 181 | internalID: 1537655665 182 | vertices: [] 183 | indices: 184 | edges: [] 185 | weights: [] 186 | secondaryTextures: [] 187 | nameFileIdTable: {} 188 | mipmapLimitGroupName: 189 | pSDRemoveMatte: 0 190 | userData: 191 | assetBundleName: 192 | assetBundleVariant: 193 | -------------------------------------------------------------------------------- /Resources/ResSprites/UI_Frm_FungusFighter_Puzzle_Card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gaolingx/SangoUtils.Hotfix_YooAsset/717e5e8d43dd080a7b25adef8bed4f7bb33dce69/Resources/ResSprites/UI_Frm_FungusFighter_Puzzle_Card.png -------------------------------------------------------------------------------- /Resources/ResSprites/UI_Frm_FungusFighter_Puzzle_Card.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ffd84c53b30ff6241b86cdbfa0869535 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 12 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | flipGreenChannel: 0 24 | isReadable: 0 25 | streamingMipmaps: 0 26 | streamingMipmapsPriority: 0 27 | vTOnly: 0 28 | ignoreMipmapLimit: 0 29 | grayScaleToAlpha: 0 30 | generateCubemap: 6 31 | cubemapConvolution: 0 32 | seamlessCubemap: 0 33 | textureFormat: 1 34 | maxTextureSize: 2048 35 | textureSettings: 36 | serializedVersion: 2 37 | filterMode: 1 38 | aniso: 1 39 | mipBias: 0 40 | wrapU: 1 41 | wrapV: 1 42 | wrapW: 0 43 | nPOTScale: 0 44 | lightmap: 0 45 | compressionQuality: 50 46 | spriteMode: 1 47 | spriteExtrude: 1 48 | spriteMeshType: 1 49 | alignment: 0 50 | spritePivot: {x: 0.5, y: 0.5} 51 | spritePixelsToUnits: 100 52 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 53 | spriteGenerateFallbackPhysicsShape: 1 54 | alphaUsage: 1 55 | alphaIsTransparency: 1 56 | spriteTessellationDetail: -1 57 | textureType: 8 58 | textureShape: 1 59 | singleChannelComponent: 0 60 | flipbookRows: 1 61 | flipbookColumns: 1 62 | maxTextureSizeSet: 0 63 | compressionQualitySet: 0 64 | textureFormatSet: 0 65 | ignorePngGamma: 0 66 | applyGammaDecoding: 0 67 | swizzle: 50462976 68 | cookieLightType: 0 69 | platformSettings: 70 | - serializedVersion: 3 71 | buildTarget: DefaultTexturePlatform 72 | maxTextureSize: 2048 73 | resizeAlgorithm: 0 74 | textureFormat: -1 75 | textureCompression: 1 76 | compressionQuality: 50 77 | crunchedCompression: 0 78 | allowsAlphaSplitting: 0 79 | overridden: 0 80 | ignorePlatformSupport: 0 81 | androidETC2FallbackOverride: 0 82 | forceMaximumCompressionQuality_BC6H_BC7: 0 83 | - serializedVersion: 3 84 | buildTarget: Standalone 85 | maxTextureSize: 2048 86 | resizeAlgorithm: 0 87 | textureFormat: -1 88 | textureCompression: 1 89 | compressionQuality: 50 90 | crunchedCompression: 0 91 | allowsAlphaSplitting: 0 92 | overridden: 0 93 | ignorePlatformSupport: 0 94 | androidETC2FallbackOverride: 0 95 | forceMaximumCompressionQuality_BC6H_BC7: 0 96 | - serializedVersion: 3 97 | buildTarget: Server 98 | maxTextureSize: 2048 99 | resizeAlgorithm: 0 100 | textureFormat: -1 101 | textureCompression: 1 102 | compressionQuality: 50 103 | crunchedCompression: 0 104 | allowsAlphaSplitting: 0 105 | overridden: 0 106 | ignorePlatformSupport: 0 107 | androidETC2FallbackOverride: 0 108 | forceMaximumCompressionQuality_BC6H_BC7: 0 109 | - serializedVersion: 3 110 | buildTarget: Android 111 | maxTextureSize: 2048 112 | resizeAlgorithm: 0 113 | textureFormat: -1 114 | textureCompression: 1 115 | compressionQuality: 50 116 | crunchedCompression: 0 117 | allowsAlphaSplitting: 0 118 | overridden: 0 119 | ignorePlatformSupport: 0 120 | androidETC2FallbackOverride: 0 121 | forceMaximumCompressionQuality_BC6H_BC7: 0 122 | - serializedVersion: 3 123 | buildTarget: iPhone 124 | maxTextureSize: 2048 125 | resizeAlgorithm: 0 126 | textureFormat: -1 127 | textureCompression: 1 128 | compressionQuality: 50 129 | crunchedCompression: 0 130 | allowsAlphaSplitting: 0 131 | overridden: 0 132 | ignorePlatformSupport: 0 133 | androidETC2FallbackOverride: 0 134 | forceMaximumCompressionQuality_BC6H_BC7: 0 135 | - serializedVersion: 3 136 | buildTarget: WebGL 137 | maxTextureSize: 2048 138 | resizeAlgorithm: 0 139 | textureFormat: -1 140 | textureCompression: 1 141 | compressionQuality: 50 142 | crunchedCompression: 0 143 | allowsAlphaSplitting: 0 144 | overridden: 0 145 | ignorePlatformSupport: 0 146 | androidETC2FallbackOverride: 0 147 | forceMaximumCompressionQuality_BC6H_BC7: 0 148 | - serializedVersion: 3 149 | buildTarget: Windows Store Apps 150 | maxTextureSize: 2048 151 | resizeAlgorithm: 0 152 | textureFormat: -1 153 | textureCompression: 1 154 | compressionQuality: 50 155 | crunchedCompression: 0 156 | allowsAlphaSplitting: 0 157 | overridden: 0 158 | ignorePlatformSupport: 0 159 | androidETC2FallbackOverride: 0 160 | forceMaximumCompressionQuality_BC6H_BC7: 0 161 | - serializedVersion: 3 162 | buildTarget: tvOS 163 | maxTextureSize: 2048 164 | resizeAlgorithm: 0 165 | textureFormat: -1 166 | textureCompression: 1 167 | compressionQuality: 50 168 | crunchedCompression: 0 169 | allowsAlphaSplitting: 0 170 | overridden: 0 171 | ignorePlatformSupport: 0 172 | androidETC2FallbackOverride: 0 173 | forceMaximumCompressionQuality_BC6H_BC7: 0 174 | spriteSheet: 175 | serializedVersion: 2 176 | sprites: [] 177 | outline: [] 178 | physicsShape: [] 179 | bones: [] 180 | spriteID: 5e97eb03825dee720800000000000000 181 | internalID: 0 182 | vertices: [] 183 | indices: 184 | edges: [] 185 | weights: [] 186 | secondaryTextures: [] 187 | nameFileIdTable: {} 188 | mipmapLimitGroupName: 189 | pSDRemoveMatte: 0 190 | userData: 191 | assetBundleName: 192 | assetBundleVariant: 193 | -------------------------------------------------------------------------------- /Resources/ResSprites/UI_Img_CoopChapter_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gaolingx/SangoUtils.Hotfix_YooAsset/717e5e8d43dd080a7b25adef8bed4f7bb33dce69/Resources/ResSprites/UI_Img_CoopChapter_2.png -------------------------------------------------------------------------------- /Resources/ResSprites/UI_Img_CoopChapter_2.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 674787eb10556f14287c34d65078bd5d 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 12 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | flipGreenChannel: 0 24 | isReadable: 0 25 | streamingMipmaps: 0 26 | streamingMipmapsPriority: 0 27 | vTOnly: 0 28 | ignoreMipmapLimit: 0 29 | grayScaleToAlpha: 0 30 | generateCubemap: 6 31 | cubemapConvolution: 0 32 | seamlessCubemap: 0 33 | textureFormat: 1 34 | maxTextureSize: 2048 35 | textureSettings: 36 | serializedVersion: 2 37 | filterMode: 1 38 | aniso: 1 39 | mipBias: 0 40 | wrapU: 1 41 | wrapV: 1 42 | wrapW: 0 43 | nPOTScale: 0 44 | lightmap: 0 45 | compressionQuality: 50 46 | spriteMode: 1 47 | spriteExtrude: 1 48 | spriteMeshType: 1 49 | alignment: 0 50 | spritePivot: {x: 0.5, y: 0.5} 51 | spritePixelsToUnits: 100 52 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 53 | spriteGenerateFallbackPhysicsShape: 1 54 | alphaUsage: 1 55 | alphaIsTransparency: 1 56 | spriteTessellationDetail: -1 57 | textureType: 8 58 | textureShape: 1 59 | singleChannelComponent: 0 60 | flipbookRows: 1 61 | flipbookColumns: 1 62 | maxTextureSizeSet: 0 63 | compressionQualitySet: 0 64 | textureFormatSet: 0 65 | ignorePngGamma: 0 66 | applyGammaDecoding: 0 67 | swizzle: 50462976 68 | cookieLightType: 0 69 | platformSettings: 70 | - serializedVersion: 3 71 | buildTarget: DefaultTexturePlatform 72 | maxTextureSize: 2048 73 | resizeAlgorithm: 0 74 | textureFormat: -1 75 | textureCompression: 1 76 | compressionQuality: 50 77 | crunchedCompression: 0 78 | allowsAlphaSplitting: 0 79 | overridden: 0 80 | ignorePlatformSupport: 0 81 | androidETC2FallbackOverride: 0 82 | forceMaximumCompressionQuality_BC6H_BC7: 0 83 | - serializedVersion: 3 84 | buildTarget: Standalone 85 | maxTextureSize: 2048 86 | resizeAlgorithm: 0 87 | textureFormat: -1 88 | textureCompression: 1 89 | compressionQuality: 50 90 | crunchedCompression: 0 91 | allowsAlphaSplitting: 0 92 | overridden: 0 93 | ignorePlatformSupport: 0 94 | androidETC2FallbackOverride: 0 95 | forceMaximumCompressionQuality_BC6H_BC7: 0 96 | - serializedVersion: 3 97 | buildTarget: Server 98 | maxTextureSize: 2048 99 | resizeAlgorithm: 0 100 | textureFormat: -1 101 | textureCompression: 1 102 | compressionQuality: 50 103 | crunchedCompression: 0 104 | allowsAlphaSplitting: 0 105 | overridden: 0 106 | ignorePlatformSupport: 0 107 | androidETC2FallbackOverride: 0 108 | forceMaximumCompressionQuality_BC6H_BC7: 0 109 | - serializedVersion: 3 110 | buildTarget: Android 111 | maxTextureSize: 2048 112 | resizeAlgorithm: 0 113 | textureFormat: -1 114 | textureCompression: 1 115 | compressionQuality: 50 116 | crunchedCompression: 0 117 | allowsAlphaSplitting: 0 118 | overridden: 0 119 | ignorePlatformSupport: 0 120 | androidETC2FallbackOverride: 0 121 | forceMaximumCompressionQuality_BC6H_BC7: 0 122 | - serializedVersion: 3 123 | buildTarget: iPhone 124 | maxTextureSize: 2048 125 | resizeAlgorithm: 0 126 | textureFormat: -1 127 | textureCompression: 1 128 | compressionQuality: 50 129 | crunchedCompression: 0 130 | allowsAlphaSplitting: 0 131 | overridden: 0 132 | ignorePlatformSupport: 0 133 | androidETC2FallbackOverride: 0 134 | forceMaximumCompressionQuality_BC6H_BC7: 0 135 | - serializedVersion: 3 136 | buildTarget: WebGL 137 | maxTextureSize: 2048 138 | resizeAlgorithm: 0 139 | textureFormat: -1 140 | textureCompression: 1 141 | compressionQuality: 50 142 | crunchedCompression: 0 143 | allowsAlphaSplitting: 0 144 | overridden: 0 145 | ignorePlatformSupport: 0 146 | androidETC2FallbackOverride: 0 147 | forceMaximumCompressionQuality_BC6H_BC7: 0 148 | - serializedVersion: 3 149 | buildTarget: Windows Store Apps 150 | maxTextureSize: 2048 151 | resizeAlgorithm: 0 152 | textureFormat: -1 153 | textureCompression: 1 154 | compressionQuality: 50 155 | crunchedCompression: 0 156 | allowsAlphaSplitting: 0 157 | overridden: 0 158 | ignorePlatformSupport: 0 159 | androidETC2FallbackOverride: 0 160 | forceMaximumCompressionQuality_BC6H_BC7: 0 161 | - serializedVersion: 3 162 | buildTarget: tvOS 163 | maxTextureSize: 2048 164 | resizeAlgorithm: 0 165 | textureFormat: -1 166 | textureCompression: 1 167 | compressionQuality: 50 168 | crunchedCompression: 0 169 | allowsAlphaSplitting: 0 170 | overridden: 0 171 | ignorePlatformSupport: 0 172 | androidETC2FallbackOverride: 0 173 | forceMaximumCompressionQuality_BC6H_BC7: 0 174 | spriteSheet: 175 | serializedVersion: 2 176 | sprites: [] 177 | outline: [] 178 | physicsShape: [] 179 | bones: [] 180 | spriteID: 5e97eb03825dee720800000000000000 181 | internalID: 0 182 | vertices: [] 183 | indices: 184 | edges: [] 185 | weights: [] 186 | secondaryTextures: [] 187 | nameFileIdTable: {} 188 | mipmapLimitGroupName: 189 | pSDRemoveMatte: 0 190 | userData: 191 | assetBundleName: 192 | assetBundleVariant: 193 | -------------------------------------------------------------------------------- /Resources/ResSprites/UI_Img_CoopChapter_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gaolingx/SangoUtils.Hotfix_YooAsset/717e5e8d43dd080a7b25adef8bed4f7bb33dce69/Resources/ResSprites/UI_Img_CoopChapter_3.png -------------------------------------------------------------------------------- /Resources/ResSprites/UI_Img_CoopChapter_3.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 59f3cae74e0cc4f4e8c283b32cdb96f0 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 12 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | flipGreenChannel: 0 24 | isReadable: 0 25 | streamingMipmaps: 0 26 | streamingMipmapsPriority: 0 27 | vTOnly: 0 28 | ignoreMipmapLimit: 0 29 | grayScaleToAlpha: 0 30 | generateCubemap: 6 31 | cubemapConvolution: 0 32 | seamlessCubemap: 0 33 | textureFormat: 1 34 | maxTextureSize: 2048 35 | textureSettings: 36 | serializedVersion: 2 37 | filterMode: 1 38 | aniso: 1 39 | mipBias: 0 40 | wrapU: 1 41 | wrapV: 1 42 | wrapW: 0 43 | nPOTScale: 0 44 | lightmap: 0 45 | compressionQuality: 50 46 | spriteMode: 1 47 | spriteExtrude: 1 48 | spriteMeshType: 1 49 | alignment: 0 50 | spritePivot: {x: 0.5, y: 0.5} 51 | spritePixelsToUnits: 100 52 | spriteBorder: {x: 57, y: 0, z: 60, w: 0} 53 | spriteGenerateFallbackPhysicsShape: 1 54 | alphaUsage: 1 55 | alphaIsTransparency: 1 56 | spriteTessellationDetail: -1 57 | textureType: 8 58 | textureShape: 1 59 | singleChannelComponent: 0 60 | flipbookRows: 1 61 | flipbookColumns: 1 62 | maxTextureSizeSet: 0 63 | compressionQualitySet: 0 64 | textureFormatSet: 0 65 | ignorePngGamma: 0 66 | applyGammaDecoding: 0 67 | swizzle: 50462976 68 | cookieLightType: 0 69 | platformSettings: 70 | - serializedVersion: 3 71 | buildTarget: DefaultTexturePlatform 72 | maxTextureSize: 2048 73 | resizeAlgorithm: 0 74 | textureFormat: -1 75 | textureCompression: 1 76 | compressionQuality: 50 77 | crunchedCompression: 0 78 | allowsAlphaSplitting: 0 79 | overridden: 0 80 | ignorePlatformSupport: 0 81 | androidETC2FallbackOverride: 0 82 | forceMaximumCompressionQuality_BC6H_BC7: 0 83 | - serializedVersion: 3 84 | buildTarget: Standalone 85 | maxTextureSize: 2048 86 | resizeAlgorithm: 0 87 | textureFormat: -1 88 | textureCompression: 1 89 | compressionQuality: 50 90 | crunchedCompression: 0 91 | allowsAlphaSplitting: 0 92 | overridden: 0 93 | ignorePlatformSupport: 0 94 | androidETC2FallbackOverride: 0 95 | forceMaximumCompressionQuality_BC6H_BC7: 0 96 | - serializedVersion: 3 97 | buildTarget: Server 98 | maxTextureSize: 2048 99 | resizeAlgorithm: 0 100 | textureFormat: -1 101 | textureCompression: 1 102 | compressionQuality: 50 103 | crunchedCompression: 0 104 | allowsAlphaSplitting: 0 105 | overridden: 0 106 | ignorePlatformSupport: 0 107 | androidETC2FallbackOverride: 0 108 | forceMaximumCompressionQuality_BC6H_BC7: 0 109 | - serializedVersion: 3 110 | buildTarget: Android 111 | maxTextureSize: 2048 112 | resizeAlgorithm: 0 113 | textureFormat: -1 114 | textureCompression: 1 115 | compressionQuality: 50 116 | crunchedCompression: 0 117 | allowsAlphaSplitting: 0 118 | overridden: 0 119 | ignorePlatformSupport: 0 120 | androidETC2FallbackOverride: 0 121 | forceMaximumCompressionQuality_BC6H_BC7: 0 122 | - serializedVersion: 3 123 | buildTarget: iPhone 124 | maxTextureSize: 2048 125 | resizeAlgorithm: 0 126 | textureFormat: -1 127 | textureCompression: 1 128 | compressionQuality: 50 129 | crunchedCompression: 0 130 | allowsAlphaSplitting: 0 131 | overridden: 0 132 | ignorePlatformSupport: 0 133 | androidETC2FallbackOverride: 0 134 | forceMaximumCompressionQuality_BC6H_BC7: 0 135 | - serializedVersion: 3 136 | buildTarget: WebGL 137 | maxTextureSize: 2048 138 | resizeAlgorithm: 0 139 | textureFormat: -1 140 | textureCompression: 1 141 | compressionQuality: 50 142 | crunchedCompression: 0 143 | allowsAlphaSplitting: 0 144 | overridden: 0 145 | ignorePlatformSupport: 0 146 | androidETC2FallbackOverride: 0 147 | forceMaximumCompressionQuality_BC6H_BC7: 0 148 | - serializedVersion: 3 149 | buildTarget: Windows Store Apps 150 | maxTextureSize: 2048 151 | resizeAlgorithm: 0 152 | textureFormat: -1 153 | textureCompression: 1 154 | compressionQuality: 50 155 | crunchedCompression: 0 156 | allowsAlphaSplitting: 0 157 | overridden: 0 158 | ignorePlatformSupport: 0 159 | androidETC2FallbackOverride: 0 160 | forceMaximumCompressionQuality_BC6H_BC7: 0 161 | - serializedVersion: 3 162 | buildTarget: tvOS 163 | maxTextureSize: 2048 164 | resizeAlgorithm: 0 165 | textureFormat: -1 166 | textureCompression: 1 167 | compressionQuality: 50 168 | crunchedCompression: 0 169 | allowsAlphaSplitting: 0 170 | overridden: 0 171 | ignorePlatformSupport: 0 172 | androidETC2FallbackOverride: 0 173 | forceMaximumCompressionQuality_BC6H_BC7: 0 174 | spriteSheet: 175 | serializedVersion: 2 176 | sprites: [] 177 | outline: [] 178 | physicsShape: [] 179 | bones: [] 180 | spriteID: 5e97eb03825dee720800000000000000 181 | internalID: 1537655665 182 | vertices: [] 183 | indices: 184 | edges: [] 185 | weights: [] 186 | secondaryTextures: [] 187 | nameFileIdTable: {} 188 | mipmapLimitGroupName: 189 | pSDRemoveMatte: 0 190 | userData: 191 | assetBundleName: 192 | assetBundleVariant: 193 | -------------------------------------------------------------------------------- /Resources/ResSprites/UI_Irodori_Stage_Btn_Shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gaolingx/SangoUtils.Hotfix_YooAsset/717e5e8d43dd080a7b25adef8bed4f7bb33dce69/Resources/ResSprites/UI_Irodori_Stage_Btn_Shadow.png -------------------------------------------------------------------------------- /Resources/ResSprites/UI_Irodori_Stage_Btn_Shadow.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0974a31d5b93ee5428a3566e164f1566 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 12 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | flipGreenChannel: 0 24 | isReadable: 0 25 | streamingMipmaps: 0 26 | streamingMipmapsPriority: 0 27 | vTOnly: 0 28 | ignoreMipmapLimit: 0 29 | grayScaleToAlpha: 0 30 | generateCubemap: 6 31 | cubemapConvolution: 0 32 | seamlessCubemap: 0 33 | textureFormat: 1 34 | maxTextureSize: 2048 35 | textureSettings: 36 | serializedVersion: 2 37 | filterMode: 1 38 | aniso: 1 39 | mipBias: 0 40 | wrapU: 1 41 | wrapV: 1 42 | wrapW: 0 43 | nPOTScale: 0 44 | lightmap: 0 45 | compressionQuality: 50 46 | spriteMode: 1 47 | spriteExtrude: 1 48 | spriteMeshType: 1 49 | alignment: 0 50 | spritePivot: {x: 0.5, y: 0.5} 51 | spritePixelsToUnits: 100 52 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 53 | spriteGenerateFallbackPhysicsShape: 1 54 | alphaUsage: 1 55 | alphaIsTransparency: 1 56 | spriteTessellationDetail: -1 57 | textureType: 8 58 | textureShape: 1 59 | singleChannelComponent: 0 60 | flipbookRows: 1 61 | flipbookColumns: 1 62 | maxTextureSizeSet: 0 63 | compressionQualitySet: 0 64 | textureFormatSet: 0 65 | ignorePngGamma: 0 66 | applyGammaDecoding: 0 67 | swizzle: 50462976 68 | cookieLightType: 0 69 | platformSettings: 70 | - serializedVersion: 3 71 | buildTarget: DefaultTexturePlatform 72 | maxTextureSize: 2048 73 | resizeAlgorithm: 0 74 | textureFormat: -1 75 | textureCompression: 1 76 | compressionQuality: 50 77 | crunchedCompression: 0 78 | allowsAlphaSplitting: 0 79 | overridden: 0 80 | ignorePlatformSupport: 0 81 | androidETC2FallbackOverride: 0 82 | forceMaximumCompressionQuality_BC6H_BC7: 0 83 | - serializedVersion: 3 84 | buildTarget: Standalone 85 | maxTextureSize: 2048 86 | resizeAlgorithm: 0 87 | textureFormat: -1 88 | textureCompression: 1 89 | compressionQuality: 50 90 | crunchedCompression: 0 91 | allowsAlphaSplitting: 0 92 | overridden: 0 93 | ignorePlatformSupport: 0 94 | androidETC2FallbackOverride: 0 95 | forceMaximumCompressionQuality_BC6H_BC7: 0 96 | - serializedVersion: 3 97 | buildTarget: Server 98 | maxTextureSize: 2048 99 | resizeAlgorithm: 0 100 | textureFormat: -1 101 | textureCompression: 1 102 | compressionQuality: 50 103 | crunchedCompression: 0 104 | allowsAlphaSplitting: 0 105 | overridden: 0 106 | ignorePlatformSupport: 0 107 | androidETC2FallbackOverride: 0 108 | forceMaximumCompressionQuality_BC6H_BC7: 0 109 | - serializedVersion: 3 110 | buildTarget: Android 111 | maxTextureSize: 2048 112 | resizeAlgorithm: 0 113 | textureFormat: -1 114 | textureCompression: 1 115 | compressionQuality: 50 116 | crunchedCompression: 0 117 | allowsAlphaSplitting: 0 118 | overridden: 0 119 | ignorePlatformSupport: 0 120 | androidETC2FallbackOverride: 0 121 | forceMaximumCompressionQuality_BC6H_BC7: 0 122 | - serializedVersion: 3 123 | buildTarget: iPhone 124 | maxTextureSize: 2048 125 | resizeAlgorithm: 0 126 | textureFormat: -1 127 | textureCompression: 1 128 | compressionQuality: 50 129 | crunchedCompression: 0 130 | allowsAlphaSplitting: 0 131 | overridden: 0 132 | ignorePlatformSupport: 0 133 | androidETC2FallbackOverride: 0 134 | forceMaximumCompressionQuality_BC6H_BC7: 0 135 | - serializedVersion: 3 136 | buildTarget: WebGL 137 | maxTextureSize: 2048 138 | resizeAlgorithm: 0 139 | textureFormat: -1 140 | textureCompression: 1 141 | compressionQuality: 50 142 | crunchedCompression: 0 143 | allowsAlphaSplitting: 0 144 | overridden: 0 145 | ignorePlatformSupport: 0 146 | androidETC2FallbackOverride: 0 147 | forceMaximumCompressionQuality_BC6H_BC7: 0 148 | - serializedVersion: 3 149 | buildTarget: Windows Store Apps 150 | maxTextureSize: 2048 151 | resizeAlgorithm: 0 152 | textureFormat: -1 153 | textureCompression: 1 154 | compressionQuality: 50 155 | crunchedCompression: 0 156 | allowsAlphaSplitting: 0 157 | overridden: 0 158 | ignorePlatformSupport: 0 159 | androidETC2FallbackOverride: 0 160 | forceMaximumCompressionQuality_BC6H_BC7: 0 161 | - serializedVersion: 3 162 | buildTarget: tvOS 163 | maxTextureSize: 2048 164 | resizeAlgorithm: 0 165 | textureFormat: -1 166 | textureCompression: 1 167 | compressionQuality: 50 168 | crunchedCompression: 0 169 | allowsAlphaSplitting: 0 170 | overridden: 0 171 | ignorePlatformSupport: 0 172 | androidETC2FallbackOverride: 0 173 | forceMaximumCompressionQuality_BC6H_BC7: 0 174 | spriteSheet: 175 | serializedVersion: 2 176 | sprites: [] 177 | outline: [] 178 | physicsShape: [] 179 | bones: [] 180 | spriteID: 5e97eb03825dee720800000000000000 181 | internalID: 0 182 | vertices: [] 183 | indices: 184 | edges: [] 185 | weights: [] 186 | secondaryTextures: [] 187 | nameFileIdTable: {} 188 | mipmapLimitGroupName: 189 | pSDRemoveMatte: 0 190 | userData: 191 | assetBundleName: 192 | assetBundleVariant: 193 | -------------------------------------------------------------------------------- /Scripts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 62e3192ddf0ba2541b1c85b81b2c21e8 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Scripts/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6b2ec43cdd3a59e4e99a6ce8b474a5b4 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Scripts/Editor/Encryption.cs: -------------------------------------------------------------------------------- 1 | using SangoUtils.Patchs_YooAsset; 2 | using System; 3 | using System.IO; 4 | using System.Text; 5 | using YooAsset; 6 | 7 | /// 8 | /// 文件偏移加密方式 9 | /// 10 | public class FileOffsetEncryption : IEncryptionServices 11 | { 12 | public EncryptResult Encrypt(EncryptFileInfo fileInfo) 13 | { 14 | // 注意:只对音频资源包加密 15 | if (fileInfo.BundleName.Contains("_gameres_audio")) 16 | { 17 | int offset = 32; 18 | byte[] fileData = File.ReadAllBytes(fileInfo.FilePath); 19 | var encryptedData = new byte[fileData.Length + offset]; 20 | Buffer.BlockCopy(fileData, 0, encryptedData, offset, fileData.Length); 21 | 22 | EncryptResult result = new EncryptResult(); 23 | result.Encrypted = true; 24 | result.EncryptedData = encryptedData; 25 | return result; 26 | } 27 | else 28 | { 29 | EncryptResult result = new EncryptResult(); 30 | result.Encrypted = false; 31 | return result; 32 | } 33 | } 34 | } 35 | 36 | /// 37 | /// 文件流加密方式 38 | /// 39 | public class FileStreamEncryption : IEncryptionServices 40 | { 41 | public EncryptResult Encrypt(EncryptFileInfo fileInfo) 42 | { 43 | if (fileInfo.BundleName.Contains("_gameres_audio")) 44 | { 45 | var fileData = File.ReadAllBytes(fileInfo.FilePath); 46 | for (int i = 0; i < fileData.Length; i++) 47 | { 48 | fileData[i] ^= BundleStream.KEY; 49 | } 50 | 51 | EncryptResult result = new EncryptResult(); 52 | result.Encrypted = true; 53 | result.EncryptedData = fileData; 54 | return result; 55 | } 56 | else 57 | { 58 | EncryptResult result = new EncryptResult(); 59 | result.Encrypted = false; 60 | return result; 61 | } 62 | } 63 | } -------------------------------------------------------------------------------- /Scripts/Editor/Encryption.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 339682333f36d014e942a790dea6b1f7 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/Editor/SangoUtils_Patch_YooAsset.Editor.asmdef: -------------------------------------------------------------------------------- 1 | { 2 | "name": "SangoUtils_Patch_YooAsset.Editor", 3 | "rootNamespace": "", 4 | "references": [ 5 | "GUID:19c91f21cad552f428e76ba715f6e221", 6 | "GUID:e34a5702dd353724aa315fb8011f08c3" 7 | ], 8 | "includePlatforms": [ 9 | "Editor" 10 | ], 11 | "excludePlatforms": [], 12 | "allowUnsafeCode": false, 13 | "overrideReferences": false, 14 | "precompiledReferences": [], 15 | "autoReferenced": true, 16 | "defineConstraints": [], 17 | "versionDefines": [], 18 | "noEngineReferences": false 19 | } -------------------------------------------------------------------------------- /Scripts/Editor/SangoUtils_Patch_YooAsset.Editor.asmdef.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6463a4f8222b0e94d8d2deb44b49d5c0 3 | AssemblyDefinitionImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Scripts/Runtime.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b76f24dc5a0e97944bfff699e80e57f0 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Scripts/Runtime/PatchOperationOP.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 64f6f1179a786e542927bb2f03ca3383 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Scripts/Runtime/PatchOperationOP/PatchOperationOP_ClearPackageCache.cs: -------------------------------------------------------------------------------- 1 | using SangoUtils.Patchs_YooAsset.Utils; 2 | using YooAsset; 3 | 4 | namespace SangoUtils.Patchs_YooAsset 5 | { 6 | internal class PatchOperationOP_ClearPackageCache : PatchOperationOP_Base 7 | { 8 | internal override PatchOperationEventCode PatchOperationEventCode => PatchOperationEventCode.ClearPackageCache; 9 | 10 | internal override void OnEvent() 11 | { 12 | EventBus_Patchs.SangoPatchRoot.SendMessage(this, new PatchSystemEventArgs(PatchSystemEventCode.PatchStatesChange, "清理未使用的缓存文件!")); 13 | var packageName = EventBus_Patchs.PatchOperation.PatchOperationData.PatchConfig.PackageName; 14 | var package = YooAssets.GetPackage(packageName); 15 | var operation = package.ClearUnusedCacheFilesAsync(); 16 | operation.Completed += Operation_Completed; 17 | } 18 | 19 | private void Operation_Completed(AsyncOperationBase obj) 20 | { 21 | EventBus_Patchs.PatchOperation.SendMessage(this, new PatchOperationEventArgs(PatchOperationEventCode.LoadHotfixDlls)); 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /Scripts/Runtime/PatchOperationOP/PatchOperationOP_ClearPackageCache.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1de29b1e066adf645ae56a59ca3f6cec 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/Runtime/PatchOperationOP/PatchOperationOP_CreatePackageDownloader.cs: -------------------------------------------------------------------------------- 1 | using SangoUtils.Patchs_YooAsset.Utils; 2 | using System.Collections; 3 | using UnityEngine; 4 | using YooAsset; 5 | 6 | namespace SangoUtils.Patchs_YooAsset 7 | { 8 | internal class PatchOperationOP_CreatePackageDownloader : PatchOperationOP_Base 9 | { 10 | internal override PatchOperationEventCode PatchOperationEventCode => PatchOperationEventCode.CreatePackageDownloader; 11 | 12 | internal override void OnEvent() 13 | { 14 | EventBus_Patchs.SangoPatchRoot.SendMessage(this, new PatchSystemEventArgs(PatchSystemEventCode.PatchStatesChange, "创建补丁下载器!")); 15 | CreateDownloader().Start(); 16 | } 17 | 18 | private IEnumerator CreateDownloader() 19 | { 20 | yield return new WaitForSecondsRealtime(0.5f); 21 | 22 | var packageName = EventBus_Patchs.PatchOperation.PatchOperationData.PatchConfig.PackageName; 23 | var package = YooAssets.GetPackage(packageName); 24 | int downloadingMaxNum = EventBus_Patchs.PatchOperation.PatchOperationData.PatchConfig.DownloadingMaxNum; 25 | int failedTryAgain = EventBus_Patchs.PatchOperation.PatchOperationData.PatchConfig.FailedTryAgain; 26 | int timeout = EventBus_Patchs.PatchOperation.PatchOperationData.PatchConfig.Timeout; 27 | var downloader = package.CreateResourceDownloader(downloadingMaxNum, failedTryAgain, timeout); 28 | 29 | EventBus_Patchs.PatchOperation.PatchOperationData.ResourceDownloaderOperation = downloader; 30 | 31 | if (downloader.TotalDownloadCount == 0) 32 | { 33 | Debug.Log("Not found any download files !"); 34 | EventBus_Patchs.PatchOperation.SendMessage(this, new PatchOperationEventArgs(PatchOperationEventCode.ClearPackageCache)); 35 | } 36 | else 37 | { 38 | // 发现新更新文件后,挂起流程系统 39 | // 注意:开发者需要在下载前检测磁盘空间不足 40 | int totalDownloadCount = downloader.TotalDownloadCount; 41 | long totalDownloadBytes = downloader.TotalDownloadBytes; 42 | EventBus_Patchs.SangoPatchRoot.SendMessage(this, new PatchSystemEventArgs(PatchSystemEventCode.FoundUpdateFiles, totalDownloadCount, totalDownloadBytes)); 43 | } 44 | } 45 | } 46 | } -------------------------------------------------------------------------------- /Scripts/Runtime/PatchOperationOP/PatchOperationOP_CreatePackageDownloader.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3f7811aa154668147b4a57e540542f67 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/Runtime/PatchOperationOP/PatchOperationOP_DownloadPackageFiles.cs: -------------------------------------------------------------------------------- 1 | using SangoUtils.Patchs_YooAsset.Utils; 2 | using System.Collections; 3 | using YooAsset; 4 | 5 | namespace SangoUtils.Patchs_YooAsset 6 | { 7 | internal class PatchOperationOP_DownloadPackageFiles : PatchOperationOP_Base 8 | { 9 | internal override PatchOperationEventCode PatchOperationEventCode => PatchOperationEventCode.DownloadPackageFiles; 10 | 11 | internal override void OnEvent() 12 | { 13 | EventBus_Patchs.SangoPatchRoot.SendMessage(this, new PatchSystemEventArgs(PatchSystemEventCode.PatchStatesChange, "开始下载补丁文件!")); 14 | BeginDownload().Start(); 15 | } 16 | 17 | private IEnumerator BeginDownload() 18 | { 19 | var downloader = EventBus_Patchs.PatchOperation.PatchOperationData.ResourceDownloaderOperation; 20 | downloader.OnDownloadErrorCallback = delegate (string fileName, string error) 21 | { 22 | EventBus_Patchs.SangoPatchRoot.SendMessage(this, new PatchSystemEventArgs(PatchSystemEventCode.WebFileDownloadFailed, fileName, error)); 23 | }; 24 | downloader.OnDownloadProgressCallback = delegate (int totalDownloadCount, int currentDownloadCount, long totalDownloadSizeBytes, long currentDownloadSizeBytes) 25 | { 26 | EventBus_Patchs.SangoPatchRoot.SendMessage(this, new PatchSystem_DownloadProgressUpdateEventArgs 27 | (totalDownloadCount, currentDownloadCount, totalDownloadSizeBytes, currentDownloadSizeBytes)); 28 | }; 29 | downloader.BeginDownload(); 30 | yield return downloader; 31 | 32 | if (downloader.Status != EOperationStatus.Succeed) 33 | yield break; 34 | 35 | EventBus_Patchs.PatchOperation.SendMessage(this, new PatchOperationEventArgs(PatchOperationEventCode.DownloadPackageOver)); 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /Scripts/Runtime/PatchOperationOP/PatchOperationOP_DownloadPackageFiles.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4cc05630bcfadaa42ae14e1889f1a725 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/Runtime/PatchOperationOP/PatchOperationOP_DownloadPackageOver.cs: -------------------------------------------------------------------------------- 1 | using SangoUtils.Patchs_YooAsset.Utils; 2 | 3 | namespace SangoUtils.Patchs_YooAsset 4 | { 5 | internal class PatchOperationOP_DownloadPackageOver : PatchOperationOP_Base 6 | { 7 | internal override PatchOperationEventCode PatchOperationEventCode => PatchOperationEventCode.DownloadPackageOver; 8 | 9 | internal override void OnEvent() 10 | { 11 | EventBus_Patchs.PatchOperation.SendMessage(this, new PatchOperationEventArgs(PatchOperationEventCode.ClearPackageCache)); 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /Scripts/Runtime/PatchOperationOP/PatchOperationOP_DownloadPackageOver.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d20254db9f3efc544af97b53a68817ab 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/Runtime/PatchOperationOP/PatchOperationOP_InitializePackage.cs: -------------------------------------------------------------------------------- 1 | using SangoUtils.Patchs_YooAsset.Utils; 2 | using System.Collections; 3 | using System.IO; 4 | using UnityEngine; 5 | using YooAsset; 6 | 7 | namespace SangoUtils.Patchs_YooAsset 8 | { 9 | internal class PatchOperationOP_InitializePackage : PatchOperationOP_Base 10 | { 11 | internal override PatchOperationEventCode PatchOperationEventCode => PatchOperationEventCode.InitializePackage; 12 | 13 | internal override void OnEvent() 14 | { 15 | InitPackage().Start(); 16 | } 17 | 18 | private IEnumerator InitPackage() 19 | { 20 | EPlayMode playMode = EventBus_Patchs.PatchOperation.PatchOperationData.PatchConfig.PlayMode; 21 | string packageName = EventBus_Patchs.PatchOperation.PatchOperationData.PatchConfig.PackageName; 22 | string buildPipeline = EventBus_Patchs.PatchOperation.PatchOperationData.PatchConfig.BuildPipeline.ToString(); 23 | 24 | var package = YooAssets.TryGetPackage(packageName); 25 | if (package == null) 26 | package = YooAssets.CreatePackage(packageName); 27 | 28 | InitializationOperation initializationOperation = null; 29 | if (playMode == EPlayMode.EditorSimulateMode) 30 | { 31 | var createParameters = new EditorSimulateModeParameters(); 32 | createParameters.SimulateManifestFilePath = EditorSimulateModeHelper.SimulateBuild(buildPipeline, packageName); 33 | initializationOperation = package.InitializeAsync(createParameters); 34 | } 35 | 36 | if (playMode == EPlayMode.OfflinePlayMode) 37 | { 38 | var createParameters = new OfflinePlayModeParameters(); 39 | createParameters.DecryptionServices = new FileStreamDecryption(); 40 | initializationOperation = package.InitializeAsync(createParameters); 41 | } 42 | 43 | if (playMode == EPlayMode.HostPlayMode) 44 | { 45 | string defaultHostServer = GetHostServerURL(); 46 | string fallbackHostServer = GetHostServerURL(); 47 | var createParameters = new HostPlayModeParameters(); 48 | createParameters.DecryptionServices = new FileStreamDecryption(); 49 | createParameters.BuildinQueryServices = new GameQueryServices(); 50 | createParameters.RemoteServices = new RemoteServices(defaultHostServer, fallbackHostServer); 51 | initializationOperation = package.InitializeAsync(createParameters); 52 | } 53 | 54 | if (playMode == EPlayMode.WebPlayMode) 55 | { 56 | string defaultHostServer = GetHostServerURL(); 57 | string fallbackHostServer = GetHostServerURL(); 58 | var createParameters = new WebPlayModeParameters(); 59 | createParameters.DecryptionServices = new FileStreamDecryption(); 60 | createParameters.BuildinQueryServices = new GameQueryServices(); 61 | createParameters.RemoteServices = new RemoteServices(defaultHostServer, fallbackHostServer); 62 | initializationOperation = package.InitializeAsync(createParameters); 63 | } 64 | 65 | yield return initializationOperation; 66 | 67 | if (initializationOperation.Status != EOperationStatus.Succeed) 68 | { 69 | Debug.LogWarning($"{initializationOperation.Error}"); 70 | EventBus_Patchs.SangoPatchRoot.SendMessage(this, new PatchSystemEventArgs(PatchSystemEventCode.InitializeFailed)); 71 | } 72 | else 73 | { 74 | Debug.Log($"Init resource package version : {initializationOperation?.PackageVersion}"); 75 | EventBus_Patchs.PatchOperation.SendMessage(this, new PatchOperationEventArgs(PatchOperationEventCode.UpdatePackageVersion)); 76 | } 77 | } 78 | 79 | private string GetHostServerURL() 80 | { 81 | string hostServerIP = EventBus_Patchs.PatchOperation.PatchOperationData.PatchConfig.HostServerIP; 82 | string appID = EventBus_Patchs.PatchOperation.PatchOperationData.PatchConfig.AppID; 83 | string appVersion = EventBus_Patchs.PatchOperation.PatchOperationData.PatchConfig.AppVersion; 84 | 85 | #if UNITY_EDITOR 86 | if (UnityEditor.EditorUserBuildSettings.activeBuildTarget == UnityEditor.BuildTarget.Android) 87 | return $"{hostServerIP}/CDN/Editor/Unity/{appID}/Patch/Android/{appVersion}"; 88 | else if (UnityEditor.EditorUserBuildSettings.activeBuildTarget == UnityEditor.BuildTarget.iOS) 89 | return $"{hostServerIP}/CDN/Editor/Unity/{appID}/Patch/IOS/{appVersion}"; 90 | else if (UnityEditor.EditorUserBuildSettings.activeBuildTarget == UnityEditor.BuildTarget.WebGL) 91 | return $"{hostServerIP}/CDN/Editor/Unity/{appID}/Patch/WebGL/{appVersion}"; 92 | else 93 | return $"{hostServerIP}/CDN/Editor/Unity/{appID}/Patch/PC/{appVersion}"; 94 | #else 95 | if (Application.platform == RuntimePlatform.Android) 96 | return $"{hostServerIP}/CDN/Online/Unity/{appID}/Patch/Android/{appVersion}"; 97 | else if (Application.platform == RuntimePlatform.IPhonePlayer) 98 | return $"{hostServerIP}/CDN/Online/Unity/{appID}/Patch/IOS/{appVersion}"; 99 | else if (Application.platform == RuntimePlatform.WebGLPlayer) 100 | return $"{hostServerIP}/CDN/Online/Unity/{appID}/Patch/WebGL/{appVersion}"; 101 | else 102 | return $"{hostServerIP}/CDN/Online/Unity/{appID}/Patch/PC/{appVersion}"; 103 | #endif 104 | } 105 | 106 | private class RemoteServices : IRemoteServices 107 | { 108 | private readonly string _defaultHostServer; 109 | private readonly string _fallbackHostServer; 110 | 111 | public RemoteServices(string defaultHostServer, string fallbackHostServer) 112 | { 113 | _defaultHostServer = defaultHostServer; 114 | _fallbackHostServer = fallbackHostServer; 115 | } 116 | string IRemoteServices.GetRemoteMainURL(string fileName) 117 | { 118 | return $"{_defaultHostServer}/{fileName}"; 119 | } 120 | string IRemoteServices.GetRemoteFallbackURL(string fileName) 121 | { 122 | return $"{_fallbackHostServer}/{fileName}"; 123 | } 124 | } 125 | 126 | private class FileStreamDecryption : IDecryptionServices 127 | { 128 | AssetBundle IDecryptionServices.LoadAssetBundle(DecryptFileInfo fileInfo, out Stream managedStream) 129 | { 130 | BundleStream bundleStream = new BundleStream(fileInfo.FileLoadPath, FileMode.Open, FileAccess.Read, FileShare.Read); 131 | managedStream = bundleStream; 132 | return AssetBundle.LoadFromStream(bundleStream, fileInfo.ConentCRC, GetManagedReadBufferSize()); 133 | } 134 | 135 | AssetBundleCreateRequest IDecryptionServices.LoadAssetBundleAsync(DecryptFileInfo fileInfo, out Stream managedStream) 136 | { 137 | BundleStream bundleStream = new BundleStream(fileInfo.FileLoadPath, FileMode.Open, FileAccess.Read, FileShare.Read); 138 | managedStream = bundleStream; 139 | return AssetBundle.LoadFromStreamAsync(bundleStream, fileInfo.ConentCRC, GetManagedReadBufferSize()); 140 | } 141 | 142 | private static uint GetManagedReadBufferSize() 143 | { 144 | return 1024; 145 | } 146 | } 147 | 148 | private class FileOffsetDecryption : IDecryptionServices 149 | { 150 | AssetBundle IDecryptionServices.LoadAssetBundle(DecryptFileInfo fileInfo, out Stream managedStream) 151 | { 152 | managedStream = null; 153 | return AssetBundle.LoadFromFile(fileInfo.FileLoadPath, fileInfo.ConentCRC, GetFileOffset()); 154 | } 155 | 156 | AssetBundleCreateRequest IDecryptionServices.LoadAssetBundleAsync(DecryptFileInfo fileInfo, out Stream managedStream) 157 | { 158 | managedStream = null; 159 | return AssetBundle.LoadFromFileAsync(fileInfo.FileLoadPath, fileInfo.ConentCRC, GetFileOffset()); 160 | } 161 | 162 | private static ulong GetFileOffset() 163 | { 164 | return 32; 165 | } 166 | } 167 | } 168 | 169 | public class BundleStream : FileStream 170 | { 171 | public const byte KEY = 64; 172 | 173 | public BundleStream(string path, FileMode mode, FileAccess access, FileShare share) : base(path, mode, access, share) 174 | { 175 | } 176 | public BundleStream(string path, FileMode mode) : base(path, mode) 177 | { 178 | } 179 | 180 | public override int Read(byte[] array, int offset, int count) 181 | { 182 | var index = base.Read(array, offset, count); 183 | for (int i = 0; i < array.Length; i++) 184 | { 185 | array[i] ^= KEY; 186 | } 187 | return index; 188 | } 189 | } 190 | } -------------------------------------------------------------------------------- /Scripts/Runtime/PatchOperationOP/PatchOperationOP_InitializePackage.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c68af4de50328424090ae1e6b5a03582 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/Runtime/PatchOperationOP/PatchOperationOP_UpdateLoadHotfixDll.cs: -------------------------------------------------------------------------------- 1 | using HybridCLR; 2 | using SangoUtils.Patchs_YooAsset.Utils; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using UnityEngine; 6 | using YooAsset; 7 | 8 | namespace SangoUtils.Patchs_YooAsset 9 | { 10 | internal class PatchOperationOP_UpdateLoadHotfixDll : PatchOperationOP_Base 11 | { 12 | internal override PatchOperationEventCode PatchOperationEventCode => PatchOperationEventCode.LoadHotfixDlls; 13 | 14 | internal override void OnEvent() 15 | { 16 | EnterSangoGameRoot(); 17 | EventBus_Patchs.PatchOperation.SendMessage(this, new PatchOperationEventArgs(PatchOperationEventCode.UpdaterDone)); 18 | } 19 | 20 | #region EnterGameRoot 21 | internal void EnterSangoGameRoot() 22 | { 23 | var HotDllList = EventBus_Patchs.PatchOperation.PatchOperationData.PatchConfig.HotUpdateDllList; 24 | var AOTMetaAssemblyNames = EventBus_Patchs.PatchOperation.PatchOperationData.PatchConfig.AOTMetaAssemblyNames; 25 | 26 | LoadDll(AOTMetaAssemblyNames, HotDllList); 27 | LoadMetadataForAOTAssemblies(AOTMetaAssemblyNames); 28 | 29 | #if !UNITY_EDITOR 30 | LoadHotAssembly(HotDllList); 31 | #endif 32 | } 33 | 34 | #endregion 35 | 36 | 37 | //获取资源二进制 38 | private static Dictionary _dllAssetDataDict = new Dictionary(); 39 | private static byte[] GetAssetData(string dllName) 40 | { 41 | return _dllAssetDataDict[dllName]; 42 | } 43 | 44 | #region LoadAssemblies 45 | internal void LoadDll(List AOTMetaAssemblyNames, List HotDllList) 46 | { 47 | var packageName = EventBus_Patchs.PatchOperation.PatchOperationData.PatchConfig.PackageName; 48 | 49 | var dllNameList = new List().Concat(AOTMetaAssemblyNames).Concat(HotDllList); 50 | foreach (var dllName in dllNameList) 51 | { 52 | byte[] fileData = SangoAssetService.Instance.LoadTextAsset(packageName, dllName, true).bytes; 53 | _dllAssetDataDict.Add(dllName, fileData); 54 | Debug.Log($"dll:{dllName} size:{fileData.Length}"); 55 | } 56 | } 57 | 58 | /// 59 | /// 为aot assembly加载原始metadata, 这个代码放aot或者热更新都行。 60 | /// 一旦加载后,如果AOT泛型函数对应native实现不存在,则自动替换为解释模式执行 61 | /// 62 | internal static void LoadMetadataForAOTAssemblies(List AOTMetaAssemblyNames) 63 | { 64 | // 可以加载任意aot assembly的对应的dll。但要求dll必须与unity build过程中生成的裁剪后的dll一致,而不能直接使用原始dll。 65 | // 我们在BuildProcessors里添加了处理代码,这些裁剪后的dll在打包时自动被复制到 {项目目录}/HybridCLRData/AssembliesPostIl2CppStrip/{Target} 目录。 66 | 67 | /// 注意,补充元数据是给AOT dll补充元数据,而不是给热更新dll补充元数据。 68 | /// 热更新dll不缺元数据,不需要补充,如果调用LoadMetadataForAOTAssembly会返回错误 69 | /// 70 | HomologousImageMode mode = HomologousImageMode.SuperSet; 71 | foreach (var aotDllName in AOTMetaAssemblyNames) 72 | { 73 | byte[] dllBytes = GetAssetData(aotDllName); 74 | // 加载assembly对应的dll,会自动为它hook。一旦aot泛型函数的native函数不存在,用解释器版本代码 75 | LoadImageErrorCode err = RuntimeApi.LoadMetadataForAOTAssembly(dllBytes, mode); 76 | Debug.Log($"LoadMetadataForAOTAssembly:{aotDllName}. mode:{mode} return:{err}"); 77 | } 78 | } 79 | 80 | internal static void LoadHotAssembly(List HotDllList) 81 | { 82 | for (int i = 0; i < HotDllList.Count; i++) 83 | { 84 | System.Reflection.Assembly.Load(GetAssetData(HotDllList[i])); 85 | } 86 | } 87 | 88 | #endregion 89 | } 90 | } -------------------------------------------------------------------------------- /Scripts/Runtime/PatchOperationOP/PatchOperationOP_UpdateLoadHotfixDll.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7361168002281fc4a97738c8b4f181e8 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/Runtime/PatchOperationOP/PatchOperationOP_UpdatePackageManifest.cs: -------------------------------------------------------------------------------- 1 | using SangoUtils.Patchs_YooAsset.Utils; 2 | using System.Collections; 3 | using UnityEngine; 4 | using YooAsset; 5 | 6 | namespace SangoUtils.Patchs_YooAsset 7 | { 8 | internal class PatchOperationOP_UpdatePackageManifest : PatchOperationOP_Base 9 | { 10 | internal override PatchOperationEventCode PatchOperationEventCode => PatchOperationEventCode.UpdatePackageManifest; 11 | 12 | internal override void OnEvent() 13 | { 14 | EventBus_Patchs.SangoPatchRoot.SendMessage(this, new PatchSystemEventArgs(PatchSystemEventCode.PatchStatesChange, "更新资源清单!")); 15 | UpdateManifest().Start(); 16 | } 17 | 18 | private IEnumerator UpdateManifest() 19 | { 20 | yield return new WaitForSecondsRealtime(0.5f); 21 | 22 | var packageName = EventBus_Patchs.PatchOperation.PatchOperationData.PatchConfig.PackageName; 23 | var packageVersion = EventBus_Patchs.PatchOperation.PatchOperationData.PackageVersion; 24 | var timeout = EventBus_Patchs.PatchOperation.PatchOperationData.PatchConfig.Timeout; 25 | var package = YooAssets.GetPackage(packageName); 26 | bool savePackageVersion = true; 27 | var operation = package.UpdatePackageManifestAsync(packageVersion, savePackageVersion, timeout); 28 | yield return operation; 29 | 30 | if (operation.Status != EOperationStatus.Succeed) 31 | { 32 | Debug.LogWarning(operation.Error); 33 | EventBus_Patchs.SangoPatchRoot.SendMessage(this, new PatchSystemEventArgs(PatchSystemEventCode.PatchManifestUpdateFailed)); 34 | yield break; 35 | } 36 | else 37 | { 38 | EventBus_Patchs.PatchOperation.SendMessage(this, new PatchOperationEventArgs(PatchOperationEventCode.CreatePackageDownloader)); 39 | } 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /Scripts/Runtime/PatchOperationOP/PatchOperationOP_UpdatePackageManifest.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: be131e507c994df45a97a2254fa22b53 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/Runtime/PatchOperationOP/PatchOperationOP_UpdatePackageVersion.cs: -------------------------------------------------------------------------------- 1 | using SangoUtils.Patchs_YooAsset.Utils; 2 | using System.Collections; 3 | using UnityEngine; 4 | using YooAsset; 5 | 6 | namespace SangoUtils.Patchs_YooAsset 7 | { 8 | internal class PatchOperationOP_UpdatePackageVersion : PatchOperationOP_Base 9 | { 10 | internal override PatchOperationEventCode PatchOperationEventCode => PatchOperationEventCode.UpdatePackageVersion; 11 | 12 | internal override void OnEvent() 13 | { 14 | EventBus_Patchs.SangoPatchRoot.SendMessage(this, new PatchSystemEventArgs(PatchSystemEventCode.PatchStatesChange, "获取最新的资源版本!")); 15 | UpdatePackageVersion().Start(); 16 | } 17 | 18 | private IEnumerator UpdatePackageVersion() 19 | { 20 | yield return new WaitForSecondsRealtime(0.5f); 21 | 22 | var appendTimeTicks = EventBus_Patchs.PatchOperation.PatchOperationData.PatchConfig.AppendTimeTicks; 23 | var timeout = EventBus_Patchs.PatchOperation.PatchOperationData.PatchConfig.Timeout; 24 | var packageName = EventBus_Patchs.PatchOperation.PatchOperationData.PatchConfig.PackageName; 25 | var package = YooAssets.GetPackage(packageName); 26 | var operation = package.UpdatePackageVersionAsync(appendTimeTicks, timeout); 27 | yield return operation; 28 | 29 | if (operation.Status != EOperationStatus.Succeed) 30 | { 31 | Debug.LogWarning(operation.Error); 32 | EventBus_Patchs.SangoPatchRoot.SendMessage(this, new PatchSystemEventArgs(PatchSystemEventCode.PackageVersionUpdateFailed)); 33 | } 34 | else 35 | { 36 | EventBus_Patchs.PatchOperation.PatchOperationData.PackageVersion = operation.PackageVersion; 37 | EventBus_Patchs.PatchOperation.SendMessage(this, new PatchOperationEventArgs(PatchOperationEventCode.UpdatePackageManifest)); 38 | } 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /Scripts/Runtime/PatchOperationOP/PatchOperationOP_UpdatePackageVersion.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bd1b5543d684df142b12c2ce7a7ec2ea 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/Runtime/PatchOperationOP/PatchOperationOP_UpdaterDone.cs: -------------------------------------------------------------------------------- 1 | using SangoUtils.Patchs_YooAsset.Utils; 2 | using UnityEngine; 3 | using YooAsset; 4 | 5 | namespace SangoUtils.Patchs_YooAsset 6 | { 7 | internal class PatchOperationOP_UpdaterDone : PatchOperationOP_Base 8 | { 9 | internal override PatchOperationEventCode PatchOperationEventCode => PatchOperationEventCode.UpdaterDone; 10 | 11 | internal override void OnEvent() 12 | { 13 | LoadGameRootObject(); 14 | EventBus_Patchs.PatchOperation.PatchOperationData.PatchConfig.OnUpdaterDone?.Invoke(); 15 | } 16 | 17 | private void LoadGameRootObject() 18 | { 19 | var packageName = EventBus_Patchs.PatchOperation.PatchOperationData.PatchConfig.PackageName; 20 | var package = YooAssets.GetPackage(packageName); 21 | var GameRootObject = EventBus_Patchs.PatchOperation.PatchOperationData.PatchConfig.GameRootObjectName; 22 | var asset1 = package.LoadAssetSync(GameRootObject); 23 | var asset1Transform = GameObject.Find(EventBus_Patchs.PatchOperation.PatchOperationData.PatchConfig.GameRootParentTransform).transform; 24 | asset1.InstantiateSync(new Vector3(0, 0, 0), Quaternion.identity, asset1Transform); 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /Scripts/Runtime/PatchOperationOP/PatchOperationOP_UpdaterDone.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 843b255bbf84f9e40867839071da7e83 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/Runtime/PatchService.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 220f12635322d944a8fd2a404490319f 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Scripts/Runtime/PatchService/EventBus_Patchs.cs: -------------------------------------------------------------------------------- 1 | namespace SangoUtils.Patchs_YooAsset.Utils 2 | { 3 | internal static class EventBus_Patchs 4 | { 5 | internal static SangoPatchRoot SangoPatchRoot { get; set; } 6 | internal static PatchOperation PatchOperation { get; set; } 7 | internal static PatchOperationData PatchOperationData { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Scripts/Runtime/PatchService/EventBus_Patchs.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 32bb9dd5ebfe1944d9902c847901ec46 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/Runtime/PatchService/PatchOperation.cs: -------------------------------------------------------------------------------- 1 | using SangoUtils.Patchs_YooAsset.Utils; 2 | using System; 3 | using System.Collections.Generic; 4 | using YooAsset; 5 | 6 | namespace SangoUtils.Patchs_YooAsset 7 | { 8 | internal class PatchOperation : GameAsyncOperation 9 | { 10 | private readonly SangoPatchConfig _currentPatchConfig; 11 | 12 | private event EventHandler _onPatchUserEventHandler; 13 | private event EventHandler _onPatchOperationEventHandler; 14 | 15 | internal PatchOperationData PatchOperationData { get; set; } 16 | 17 | private readonly Dictionary _patchOperationOPs = new Dictionary(); 18 | 19 | internal PatchOperation(SangoPatchConfig patchConfig) 20 | { 21 | _currentPatchConfig = patchConfig; 22 | EventBus_Patchs.PatchOperation = this; 23 | _onPatchUserEventHandler += C_OnPatchUserEvent; 24 | _onPatchOperationEventHandler += C_OnPatchOperationEvent; 25 | AddPatchOperationOPs(); 26 | } 27 | 28 | internal void SendMessage(object sender, PatchUserEventArgs eventArgs) 29 | { 30 | _onPatchUserEventHandler?.Invoke(sender, eventArgs); 31 | } 32 | 33 | internal void SendMessage(object sender, PatchOperationEventArgs eventArgs) 34 | { 35 | _onPatchOperationEventHandler?.Invoke(sender, eventArgs); 36 | } 37 | 38 | protected override void OnStart() 39 | { 40 | SendMessage(this, new PatchOperationEventArgs(PatchOperationEventCode.InitializePackage)); 41 | } 42 | 43 | protected override void OnUpdate() { } 44 | 45 | protected override void OnAbort() { } 46 | 47 | private void AddPatchOperationOPs() 48 | { 49 | Add(); 50 | Add(); 51 | Add(); 52 | Add(); 53 | Add(); 54 | Add(); 55 | Add(); 56 | Add(); 57 | Add(); 58 | 59 | PatchOperationData = new PatchOperationData(_currentPatchConfig); 60 | 61 | void Add() where T : PatchOperationOP_Base 62 | { 63 | T patchOperation = Activator.CreateInstance(); 64 | _patchOperationOPs.Add(patchOperation.PatchOperationEventCode, patchOperation); 65 | } 66 | } 67 | 68 | private void C_OnPatchUserEvent(object sender, PatchUserEventArgs eventArgs) 69 | { 70 | switch (eventArgs.PatchUserEventCode) 71 | { 72 | case PatchUserEventCode.UserTryInitialize: 73 | SendMessage(this, new PatchOperationEventArgs(PatchOperationEventCode.InitializePackage)); 74 | break; 75 | case PatchUserEventCode.UserBeginDownloadWebFiles: 76 | SendMessage(this, new PatchOperationEventArgs(PatchOperationEventCode.DownloadPackageFiles)); 77 | break; 78 | case PatchUserEventCode.UserTryUpdatePackageVersion: 79 | SendMessage(this, new PatchOperationEventArgs(PatchOperationEventCode.UpdatePackageVersion)); 80 | break; 81 | case PatchUserEventCode.UserTryUpdatePatchManifest: 82 | SendMessage(this, new PatchOperationEventArgs(PatchOperationEventCode.UpdatePackageManifest)); 83 | break; 84 | case PatchUserEventCode.UserTryDownloadWebFiles: 85 | SendMessage(this, new PatchOperationEventArgs(PatchOperationEventCode.CreatePackageDownloader)); 86 | break; 87 | } 88 | } 89 | 90 | private void C_OnPatchOperationEvent(object sender, PatchOperationEventArgs eventArgs) 91 | { 92 | if (_patchOperationOPs.TryGetValue(eventArgs.PatchOperationEventCode, out var patchOperationOP)) 93 | { 94 | patchOperationOP.OnEvent(); 95 | } 96 | if (eventArgs.PatchOperationEventCode == PatchOperationEventCode.UpdaterDone) 97 | { 98 | _onPatchUserEventHandler = null; 99 | Status = EOperationStatus.Succeed; 100 | } 101 | } 102 | } 103 | } -------------------------------------------------------------------------------- /Scripts/Runtime/PatchService/PatchOperation.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: fafa44b74779da344bf5c354f917a132 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/Runtime/PatchService/PatchService.cs: -------------------------------------------------------------------------------- 1 | using SangoUtils.Patchs_YooAsset.Utils; 2 | using System; 3 | using System.Collections; 4 | using UnityEngine; 5 | using UnityEngine.Networking; 6 | using YooAsset; 7 | 8 | namespace SangoUtils.Patchs_YooAsset 9 | { 10 | internal class PatchService : MonoBehaviour 11 | { 12 | private static PatchService _instance; 13 | 14 | internal static PatchService Instance 15 | { 16 | get 17 | { 18 | if (_instance == null) 19 | { 20 | _instance = FindObjectOfType(typeof(PatchService)) as PatchService; 21 | if (_instance == null) 22 | { 23 | GameObject gameObject = new GameObject("[" + typeof(PatchService).FullName + "]"); 24 | _instance = gameObject.AddComponent(); 25 | gameObject.hideFlags = HideFlags.HideInHierarchy; 26 | DontDestroyOnLoad(gameObject); 27 | } 28 | } 29 | return _instance; 30 | } 31 | } 32 | 33 | private void Awake() 34 | { 35 | if (null != _instance && _instance != this) 36 | { 37 | Destroy(gameObject); 38 | } 39 | } 40 | 41 | private SangoPatchConfig _currentPatchConfig; 42 | 43 | public Action OnPatchCompleted { get; set; } 44 | 45 | internal void Initialize(SangoPatchConfig patchConfig) 46 | { 47 | _currentPatchConfig = patchConfig; 48 | StartOperation().Start(); 49 | } 50 | 51 | public UnityWebRequest CustomWebRequester(string url) 52 | { 53 | var request = new UnityWebRequest(url, UnityWebRequest.kHttpVerbGET); 54 | if (_currentPatchConfig.SkipCertificate) 55 | { 56 | request.certificateHandler = new WebRequestSkipCertificate(); 57 | } 58 | return request; 59 | } 60 | 61 | /// 62 | /// 跳过Web请求证书 63 | /// 64 | public class WebRequestSkipCertificate : CertificateHandler 65 | { 66 | protected override bool ValidateCertificate(byte[] certificateData) 67 | { 68 | return true; 69 | } 70 | } 71 | 72 | private IEnumerator StartOperation() 73 | { 74 | YooAssets.Initialize(); 75 | 76 | YooAssets.SetDownloadSystemUnityWebRequest(CustomWebRequester); 77 | 78 | PatchOperation hotFixOperation = new PatchOperation(_currentPatchConfig); 79 | YooAssets.StartOperation(hotFixOperation); 80 | yield return hotFixOperation; 81 | 82 | ResourcePackage assetPackage = YooAssets.GetPackage(_currentPatchConfig.PackageName); 83 | YooAssets.SetDefaultPackage(assetPackage); 84 | 85 | EventBus_Patchs.SangoPatchRoot.SendMessage(this, new PatchSystemEventArgs(PatchSystemEventCode.ClosePatchWindow)); 86 | OnPatchCompleted?.Invoke(true); 87 | } 88 | } 89 | } -------------------------------------------------------------------------------- /Scripts/Runtime/PatchService/PatchService.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: eb1bc15feeb10e940b707c426d6d9027 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/Runtime/PatchService/PatchSystemEventMessages.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | using UnityEngine.Events; 5 | using YooAsset; 6 | 7 | namespace SangoUtils.Patchs_YooAsset 8 | { 9 | internal class PatchSystemEventArgs : EventArgs 10 | { 11 | internal PatchSystemEventArgs(PatchSystemEventCode patchSystemEventCode, params object[] data) 12 | { 13 | PatchSystemEventCode = patchSystemEventCode; 14 | ExtensionData = data; 15 | } 16 | 17 | internal PatchSystemEventCode PatchSystemEventCode { get; } 18 | internal object[] ExtensionData { get; } 19 | } 20 | 21 | internal enum PatchSystemEventCode 22 | { 23 | InitializeFailed, 24 | PatchStatesChange, 25 | FoundUpdateFiles, 26 | PackageVersionUpdateFailed, 27 | PatchManifestUpdateFailed, 28 | WebFileDownloadFailed, 29 | ClosePatchWindow 30 | } 31 | 32 | internal class PatchSystem_DownloadProgressUpdateEventArgs : EventArgs 33 | { 34 | public PatchSystem_DownloadProgressUpdateEventArgs(int totalDownloadCount, int currentDownloadCount, long totalDownloadSizeBytes, long currentDownloadSizeBytes) 35 | { 36 | TotalDownloadCount = totalDownloadCount; 37 | CurrentDownloadCount = currentDownloadCount; 38 | TotalDownloadSizeBytes = totalDownloadSizeBytes; 39 | CurrentDownloadSizeBytes = currentDownloadSizeBytes; 40 | } 41 | 42 | internal int TotalDownloadCount { get; } 43 | internal int CurrentDownloadCount { get; } 44 | internal long TotalDownloadSizeBytes { get; } 45 | internal long CurrentDownloadSizeBytes { get; } 46 | } 47 | 48 | internal class PatchUserEventArgs : EventArgs 49 | { 50 | internal PatchUserEventArgs(PatchUserEventCode patchUserEventCode) 51 | { 52 | PatchUserEventCode = patchUserEventCode; 53 | } 54 | 55 | internal PatchUserEventCode PatchUserEventCode { get; } 56 | } 57 | 58 | internal enum PatchUserEventCode 59 | { 60 | UserTryInitialize, 61 | UserBeginDownloadWebFiles, 62 | UserTryUpdatePackageVersion, 63 | UserTryUpdatePatchManifest, 64 | UserTryDownloadWebFiles 65 | } 66 | 67 | internal class PatchOperationEventArgs : EventArgs 68 | { 69 | internal PatchOperationEventArgs(PatchOperationEventCode patchOperationEventCode) 70 | { 71 | PatchOperationEventCode = patchOperationEventCode; 72 | } 73 | 74 | internal PatchOperationEventCode PatchOperationEventCode { get; } 75 | } 76 | 77 | internal enum PatchOperationEventCode 78 | { 79 | InitializePackage, 80 | UpdatePackageVersion, 81 | UpdatePackageManifest, 82 | CreatePackageDownloader, 83 | DownloadPackageFiles, 84 | DownloadPackageOver, 85 | ClearPackageCache, 86 | LoadHotfixDlls, 87 | UpdaterDone 88 | } 89 | 90 | internal abstract class PatchOperationOP_Base 91 | { 92 | internal abstract PatchOperationEventCode PatchOperationEventCode { get; } 93 | 94 | internal abstract void OnEvent(); 95 | } 96 | 97 | internal class PatchOperationData 98 | { 99 | internal SangoPatchConfig PatchConfig { get; set; } 100 | 101 | internal string PackageVersion { get; set; } 102 | internal ResourceDownloaderOperation ResourceDownloaderOperation { get; set; } 103 | 104 | internal PatchOperationData(SangoPatchConfig patchConfig) 105 | { 106 | PatchConfig = patchConfig; 107 | } 108 | } 109 | } -------------------------------------------------------------------------------- /Scripts/Runtime/PatchService/PatchSystemEventMessages.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5f59e04a0159dc9499b25ff17c44826c 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/Runtime/PublicAssets.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 90d7636529747bc43aea914f2fc89d59 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Scripts/Runtime/PublicAssets/SangoAssetService.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | using UnityEngine.Video; 5 | using YooAsset; 6 | 7 | namespace SangoUtils.Patchs_YooAsset 8 | { 9 | public class SangoAssetService : MonoBehaviour 10 | { 11 | private static SangoAssetService _instance; 12 | 13 | public static SangoAssetService Instance 14 | { 15 | get 16 | { 17 | if (_instance == null) 18 | { 19 | _instance = FindObjectOfType(typeof(SangoAssetService)) as SangoAssetService; 20 | if (_instance == null) 21 | { 22 | GameObject gameObject = new GameObject("[" + typeof(SangoAssetService).FullName + "]"); 23 | _instance = gameObject.AddComponent(); 24 | gameObject.hideFlags = HideFlags.HideInHierarchy; 25 | DontDestroyOnLoad(gameObject); 26 | } 27 | } 28 | return _instance; 29 | } 30 | } 31 | 32 | private void Awake() 33 | { 34 | if (null != _instance && _instance != this) 35 | { 36 | Destroy(gameObject); 37 | } 38 | } 39 | 40 | private List _cacheAssetHandles = new(); 41 | 42 | private Dictionary _audioClipHandleDict = new(); 43 | private Dictionary _textAssetHandleDict = new(); 44 | private Dictionary _videoClipHandleDict = new(); 45 | private Dictionary _spriteHandleDict = new(); 46 | private Dictionary _prefabHandleDict = new(); 47 | 48 | public void Initialize() 49 | { 50 | _audioClipHandleDict.Clear(); 51 | _textAssetHandleDict.Clear(); 52 | _videoClipHandleDict.Clear(); 53 | _spriteHandleDict.Clear(); 54 | _prefabHandleDict.Clear(); 55 | } 56 | 57 | public AudioClip LoadAudioClip(string packageName, string audioClipPath, bool isCache) 58 | { 59 | AudioClip audioClip = null; 60 | _audioClipHandleDict.TryGetValue(audioClipPath, out AssetHandle handle); 61 | if (handle == null) 62 | { 63 | var package = YooAssets.GetPackage(packageName); 64 | handle = package.LoadAssetSync(audioClipPath); 65 | audioClip = handle.AssetObject as AudioClip; 66 | if (isCache) 67 | { 68 | if (!_audioClipHandleDict.ContainsKey(audioClipPath)) 69 | { 70 | _audioClipHandleDict.Add(audioClipPath, handle); 71 | } 72 | } 73 | else 74 | { 75 | GCAssetHandleTODO(handle); 76 | } 77 | } 78 | else 79 | { 80 | audioClip = handle.AssetObject as AudioClip; 81 | } 82 | return audioClip; 83 | } 84 | 85 | public TextAsset LoadTextAsset(string packageName, string textAssetPath, bool isCache) 86 | { 87 | TextAsset textAsset = null; 88 | _textAssetHandleDict.TryGetValue(textAssetPath, out AssetHandle handle); 89 | if (handle == null) 90 | { 91 | var package = YooAssets.GetPackage(packageName); 92 | handle = package.LoadAssetSync(textAssetPath); 93 | textAsset = handle.AssetObject as TextAsset; 94 | if (isCache) 95 | { 96 | if (!_textAssetHandleDict.ContainsKey(textAssetPath)) 97 | { 98 | _textAssetHandleDict.Add(textAssetPath, handle); 99 | } 100 | } 101 | else 102 | { 103 | GCAssetHandleTODO(handle); 104 | } 105 | } 106 | else 107 | { 108 | textAsset = handle.AssetObject as TextAsset; 109 | } 110 | return textAsset; 111 | } 112 | 113 | public void LoadAudioClipASync(string packageName, string audioClipPath, Action assetLoadedCallBack, bool isCache) 114 | { 115 | AudioClip audioClip = null; 116 | _audioClipHandleDict.TryGetValue(audioClipPath, out AssetHandle handle); 117 | if (handle == null) 118 | { 119 | var package = YooAssets.GetPackage(packageName); 120 | handle = package.LoadAssetAsync(audioClipPath); 121 | handle.Completed += (handle) => 122 | { 123 | audioClip = handle.AssetObject as AudioClip; 124 | assetLoadedCallBack?.Invoke(audioClip); 125 | if (isCache) 126 | { 127 | if (!_audioClipHandleDict.ContainsKey(audioClipPath)) 128 | { 129 | _audioClipHandleDict.Add(audioClipPath, handle); 130 | } 131 | } 132 | else 133 | { 134 | GCAssetHandleTODO(handle); 135 | } 136 | }; 137 | } 138 | else 139 | { 140 | audioClip = handle.AssetObject as AudioClip; 141 | assetLoadedCallBack?.Invoke(audioClip); 142 | } 143 | } 144 | 145 | public VideoClip LoadVideoClip(string packageName, string videoClipPath, bool isCache) 146 | { 147 | VideoClip videoClip = null; 148 | _videoClipHandleDict.TryGetValue(videoClipPath, out AssetHandle handle); 149 | if (handle == null) 150 | { 151 | var package = YooAssets.GetPackage(packageName); 152 | handle = package.LoadAssetSync(videoClipPath); 153 | videoClip = handle.AssetObject as VideoClip; 154 | if (isCache) 155 | { 156 | if (!_videoClipHandleDict.ContainsKey(videoClipPath)) 157 | { 158 | _videoClipHandleDict.Add(videoClipPath, handle); 159 | } 160 | } 161 | else 162 | { 163 | GCAssetHandleTODO(handle); 164 | } 165 | } 166 | else 167 | { 168 | videoClip = handle.AssetObject as VideoClip; 169 | } 170 | return videoClip; 171 | } 172 | 173 | public void LoadVideoClipASync(string packageName, string videoClipPath, Action assetLoadedCallBack, bool isCache) 174 | { 175 | VideoClip videoClip = null; 176 | _videoClipHandleDict.TryGetValue(videoClipPath, out AssetHandle handle); 177 | if (handle == null) 178 | { 179 | var package = YooAssets.GetPackage(packageName); 180 | handle = package.LoadAssetAsync(videoClipPath); 181 | handle.Completed += (handle) => 182 | { 183 | videoClip = handle.AssetObject as VideoClip; 184 | assetLoadedCallBack?.Invoke(videoClip); 185 | if (isCache) 186 | { 187 | if (!_videoClipHandleDict.ContainsKey(videoClipPath)) 188 | { 189 | _videoClipHandleDict.Add(videoClipPath, handle); 190 | } 191 | } 192 | else 193 | { 194 | GCAssetHandleTODO(handle); 195 | } 196 | }; 197 | } 198 | else 199 | { 200 | videoClip = handle.AssetObject as VideoClip; 201 | assetLoadedCallBack?.Invoke(videoClip); 202 | } 203 | } 204 | 205 | public GameObject LoadPrefab(string packageName, string prefabPath, bool isCache) 206 | { 207 | GameObject prefab = null; 208 | _prefabHandleDict.TryGetValue(prefabPath, out AssetHandle handle); 209 | if (handle == null) 210 | { 211 | var package = YooAssets.GetPackage(packageName); 212 | handle = package.LoadAssetSync(prefabPath); 213 | prefab = handle.AssetObject as GameObject; 214 | if (isCache) 215 | { 216 | if (!_prefabHandleDict.ContainsKey(prefabPath)) 217 | { 218 | _prefabHandleDict.Add(prefabPath, handle); 219 | } 220 | } 221 | else 222 | { 223 | GCAssetHandleTODO(handle); 224 | } 225 | } 226 | else 227 | { 228 | prefab = handle.AssetObject as GameObject; 229 | } 230 | return prefab; 231 | } 232 | 233 | public void LoadPrefabASync(string packageName, string prefabPath, Action assetLoadedCallBack, bool isCache) 234 | { 235 | GameObject prefab = null; 236 | _prefabHandleDict.TryGetValue(prefabPath, out AssetHandle handle); 237 | if (handle == null) 238 | { 239 | var package = YooAssets.GetPackage(packageName); 240 | handle = package.LoadAssetAsync(prefabPath); 241 | handle.Completed += (handle) => 242 | { 243 | prefab = handle.AssetObject as GameObject; 244 | assetLoadedCallBack?.Invoke(prefab); 245 | if (isCache) 246 | { 247 | if (!_prefabHandleDict.ContainsKey(prefabPath)) 248 | { 249 | _prefabHandleDict.Add(prefabPath, handle); 250 | } 251 | } 252 | else 253 | { 254 | GCAssetHandleTODO(handle); 255 | } 256 | }; 257 | } 258 | else 259 | { 260 | prefab = handle.AssetObject as GameObject; 261 | assetLoadedCallBack?.Invoke(prefab); 262 | } 263 | } 264 | 265 | public GameObject InstantiatePrefab(string packageName, Transform parentTrans, string prefabPath, bool isCache) 266 | { 267 | GameObject prefab = LoadPrefab(packageName, prefabPath, isCache); 268 | GameObject instantiatedPrefab = Instantiate(prefab, parentTrans); 269 | return instantiatedPrefab; 270 | } 271 | 272 | public void InstantiatePrefabASync(string packageName, Transform parentTrans, string prefabPath, Action assetLoadedCallBack, bool isCache) 273 | { 274 | GameObject prefab = null; 275 | _prefabHandleDict.TryGetValue(prefabPath, out AssetHandle handle); 276 | if (handle == null) 277 | { 278 | var package = YooAssets.GetPackage(packageName); 279 | handle = package.LoadAssetAsync(prefabPath); 280 | handle.Completed += (handle) => 281 | { 282 | prefab = handle.InstantiateSync(parentTrans); 283 | assetLoadedCallBack?.Invoke(prefab); 284 | if (isCache) 285 | { 286 | if (!_prefabHandleDict.ContainsKey(prefabPath)) 287 | { 288 | _prefabHandleDict.Add(prefabPath, handle); 289 | } 290 | } 291 | else 292 | { 293 | GCAssetHandleTODO(handle); 294 | } 295 | }; 296 | } 297 | else 298 | { 299 | prefab = handle.AssetObject as GameObject; 300 | assetLoadedCallBack?.Invoke(prefab); 301 | } 302 | } 303 | 304 | private void GCAssetHandleTODO(AssetHandle assetHandle) 305 | { 306 | _cacheAssetHandles.Add(assetHandle); 307 | } 308 | 309 | public void ReleaseAssetHandles() 310 | { 311 | for (int i = 0; i < _cacheAssetHandles.Count; i++) 312 | { 313 | _cacheAssetHandles[i].Release(); 314 | } 315 | _cacheAssetHandles.Clear(); 316 | } 317 | 318 | #region UnloadAsset 319 | // 卸载所有引用计数为零的资源包。 320 | // 可以在切换场景之后调用资源释放方法或者写定时器间隔时间去释放。 321 | public void UnloadUnusedAssets(string packageName) 322 | { 323 | var package = YooAssets.GetPackage(packageName); 324 | package.UnloadUnusedAssets(); 325 | } 326 | 327 | // 尝试卸载指定的资源对象 328 | // 注意:如果该资源还在被使用,该方法会无效。 329 | public void TryUnloadUnusedAsset(string packageName, string path) 330 | { 331 | var package = YooAssets.GetPackage(packageName); 332 | package.TryUnloadUnusedAsset(path); 333 | } 334 | 335 | // 强制卸载所有资源包,该方法请在合适的时机调用。 336 | // 注意:Package在销毁的时候也会自动调用该方法。 337 | public void ForceUnloadAllAssets(string packageName) 338 | { 339 | var package = YooAssets.GetPackage(packageName); 340 | package.ForceUnloadAllAssets(); 341 | } 342 | 343 | #endregion 344 | } 345 | } -------------------------------------------------------------------------------- /Scripts/Runtime/PublicAssets/SangoAssetService.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: dab0c275d576c9740a7466457a433d40 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/Runtime/PublicAssets/SangoPatchConfig.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UnityEngine; 3 | using UnityEngine.Events; 4 | using YooAsset; 5 | 6 | namespace SangoUtils.Patchs_YooAsset 7 | { 8 | [CreateAssetMenu(fileName = "SangoPatchConfigAssets", menuName = "ScriptableObjects/Patchs_YooAsset/SangoPatchConfigAssets", order = 1)] 9 | public class SangoPatchConfig : ScriptableObject 10 | { 11 | public string HostServerIP; 12 | public string AppID; 13 | public string AppVersion; 14 | public bool AppendTimeTicks = true; 15 | public bool SkipCertificate = false; 16 | public int Timeout = 60; 17 | public int DownloadingMaxNum = 10; 18 | public int FailedTryAgain = 3; 19 | 20 | public string PackageName = "DefaultPackage"; 21 | public EPlayMode PlayMode = EPlayMode.EditorSimulateMode; 22 | public EDefaultBuildPipeline BuildPipeline = EDefaultBuildPipeline.BuiltinBuildPipeline; 23 | 24 | public GameObject SangoPatchWnd; 25 | public string GameRootObjectName; 26 | public string GameRootParentTransform; 27 | public List HotUpdateDllList; 28 | public List AOTMetaAssemblyNames; 29 | 30 | public UnityEvent OnUpdaterDone; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Scripts/Runtime/PublicAssets/SangoPatchConfig.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bae4189d474187e488ca523c4fceb2a0 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/Runtime/PublicAssets/SangoPatchRoot.cs: -------------------------------------------------------------------------------- 1 | using SangoUtils.Patchs_YooAsset.Utils; 2 | using System; 3 | using UnityEngine; 4 | 5 | namespace SangoUtils.Patchs_YooAsset 6 | { 7 | public class SangoPatchRoot : MonoBehaviour 8 | { 9 | private SangoPatchWnd _sangoPatchWnd; 10 | 11 | private event EventHandler _onPatchSystemEventHandler; 12 | private event EventHandler _onPatchSystemDownloadProgressUpdateEventHandler; 13 | 14 | public void Initialize(SangoPatchConfig config) 15 | { 16 | PatchService.Instance.Initialize(config); 17 | OnInit(config); 18 | } 19 | 20 | private void OnInit(SangoPatchConfig patchConfig) 21 | { 22 | var patchWndTransform = GameObject.Find(patchConfig.GameRootParentTransform).transform; 23 | GameObject patchWnd = Instantiate(patchConfig.SangoPatchWnd, new Vector3(0, 0, 0), Quaternion.identity, patchWndTransform); 24 | 25 | _sangoPatchWnd = patchWnd.AddComponent(); 26 | 27 | EventBus_Patchs.SangoPatchRoot = this; 28 | _onPatchSystemEventHandler += C_OnPatchSystemEvent; 29 | _onPatchSystemDownloadProgressUpdateEventHandler += C_OnPatchSystemDownloadProgressUpdateEvent; 30 | 31 | _sangoPatchWnd.SetRoot(this); 32 | _sangoPatchWnd.gameObject.SetActive(true); 33 | _sangoPatchWnd.Initialize(); 34 | } 35 | 36 | internal void SendMessage(object sender, PatchSystemEventArgs eventArgs) 37 | { 38 | _onPatchSystemEventHandler?.Invoke(sender, eventArgs); 39 | } 40 | 41 | internal void SendMessage(object sender, PatchSystem_DownloadProgressUpdateEventArgs eventArgs) 42 | { 43 | _onPatchSystemDownloadProgressUpdateEventHandler?.Invoke(sender, eventArgs); 44 | } 45 | 46 | private void C_OnPatchSystemEvent(object sender, PatchSystemEventArgs eventArgs) 47 | { 48 | switch (eventArgs.PatchSystemEventCode) 49 | { 50 | case PatchSystemEventCode.InitializeFailed: 51 | Action callback = delegate 52 | { 53 | EventBus_Patchs.PatchOperation.SendMessage(this, new PatchUserEventArgs(PatchUserEventCode.UserTryInitialize)); 54 | }; 55 | _sangoPatchWnd.ShowMessageBox($"Failed to initialize package !", callback); 56 | break; 57 | case PatchSystemEventCode.PatchStatesChange: 58 | string tips = eventArgs.ExtensionData[0].ToString(); 59 | _sangoPatchWnd.UpdateTips(tips); 60 | break; 61 | case PatchSystemEventCode.FoundUpdateFiles: 62 | int totalCount = int.Parse(eventArgs.ExtensionData[0].ToString()); 63 | long totalSizeBytes = long.Parse(eventArgs.ExtensionData[1].ToString()); 64 | Action callback1 = delegate 65 | { 66 | EventBus_Patchs.PatchOperation.SendMessage(this, new PatchUserEventArgs(PatchUserEventCode.UserBeginDownloadWebFiles)); 67 | }; 68 | float sizeMB = totalSizeBytes / 1048576f; 69 | sizeMB = Mathf.Clamp(sizeMB, 0.1f, float.MaxValue); 70 | string totalSizeMB = sizeMB.ToString("f1"); 71 | _sangoPatchWnd.ShowMessageBox($"Found update patch files, Total count {totalCount} Total szie {totalSizeMB}MB", callback1); 72 | break; 73 | case PatchSystemEventCode.PackageVersionUpdateFailed: 74 | Action callback2 = delegate 75 | { 76 | EventBus_Patchs.PatchOperation.SendMessage(this, new PatchUserEventArgs(PatchUserEventCode.UserTryUpdatePackageVersion)); 77 | }; 78 | _sangoPatchWnd.ShowMessageBox($"Failed to update static version, please check the network status.", callback2); 79 | break; 80 | case PatchSystemEventCode.PatchManifestUpdateFailed: 81 | Action callback3 = delegate 82 | { 83 | EventBus_Patchs.PatchOperation.SendMessage(this, new PatchUserEventArgs(PatchUserEventCode.UserTryUpdatePatchManifest)); 84 | }; 85 | _sangoPatchWnd.ShowMessageBox($"Failed to update patch manifest, please check the network status.", callback3); 86 | break; 87 | case PatchSystemEventCode.WebFileDownloadFailed: 88 | string fileName = eventArgs.ExtensionData[0].ToString(); 89 | string Error = eventArgs.ExtensionData[1].ToString(); 90 | Action callback4 = delegate 91 | { 92 | EventBus_Patchs.PatchOperation.SendMessage(this, new PatchUserEventArgs(PatchUserEventCode.UserTryDownloadWebFiles)); 93 | }; 94 | _sangoPatchWnd.ShowMessageBox($"Failed to download file : {fileName}", callback4); 95 | break; 96 | case PatchSystemEventCode.ClosePatchWindow: 97 | _sangoPatchWnd.gameObject.SetActive(false); 98 | break; 99 | } 100 | } 101 | 102 | private void C_OnPatchSystemDownloadProgressUpdateEvent(object sender, PatchSystem_DownloadProgressUpdateEventArgs eventArgs) 103 | { 104 | int totalDownloadCount = eventArgs.TotalDownloadCount; 105 | int currentDownloadCount = eventArgs.CurrentDownloadCount; 106 | long totalDownloadSizeBytes = eventArgs.TotalDownloadSizeBytes; 107 | long currentDownloadSizeBytes = eventArgs.CurrentDownloadSizeBytes; 108 | float sliderValue = (float)currentDownloadCount / totalDownloadCount; 109 | _sangoPatchWnd.UpdateSliderValue(sliderValue); 110 | string currentSizeMB = (currentDownloadSizeBytes / 1048576f).ToString("f1"); 111 | string totalSizeMB = (totalDownloadSizeBytes / 1048576f).ToString("f1"); 112 | string tips = $"{currentDownloadCount}/{totalDownloadCount} {currentSizeMB}MB/{totalSizeMB}MB"; 113 | _sangoPatchWnd.UpdateTips(tips); 114 | } 115 | } 116 | } -------------------------------------------------------------------------------- /Scripts/Runtime/PublicAssets/SangoPatchRoot.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0d64334410c86344782da80d1ba2066a 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Scripts/Runtime/PublicAssets/SangoPatchWnd.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using TMPro; 3 | using UnityEngine; 4 | using UnityEngine.UI; 5 | 6 | namespace SangoUtils.Patchs_YooAsset 7 | { 8 | public class SangoPatchWnd : MonoBehaviour 9 | { 10 | private SangoPatchRoot _sangoHotFixRoot; 11 | private Transform _messageBoxTrans; 12 | private Transform _hotFixProgressPanel; 13 | private TMP_Text _tips; 14 | private TMP_Text _messageBoxContent; 15 | private Image _loadingProgressFG; 16 | private Image _loadingProgressPoint; 17 | private TMP_Text _loadingProgressText; 18 | private Action _clickMessageBoxOkCB; 19 | private Button _messageBoxOkBtn; 20 | private Button _messageBoxCancelBtn; 21 | 22 | private float _loadingProgressFGWidth; 23 | private float _loadingProgressPointYPos; 24 | 25 | internal void Initialize() 26 | { 27 | _messageBoxTrans = transform.Find("MessageBox"); 28 | _hotFixProgressPanel = transform.Find("HotFixProgressPanel"); 29 | _tips = _hotFixProgressPanel.Find("Tips").GetComponent(); 30 | 31 | _messageBoxOkBtn = _messageBoxTrans.Find("messageBoxOkBtn").GetComponent