164 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C#
		
	
	
	
| using System;
 | |
| using System.Collections;
 | |
| using System.Collections.Generic;
 | |
| using System.IO;
 | |
| using System.Linq;
 | |
| using System.Xml.Linq;
 | |
| using UnityEditor;
 | |
| using UnityEngine;
 | |
| using UnityEngine.Networking;
 | |
| using UnityEditor.PackageManager.Requests;
 | |
| using UnityEditor.PackageManager;
 | |
| using System.Threading.Tasks;
 | |
| using System.Threading;
 | |
| 
 | |
| namespace AnyThink.Scripts.IntegrationManager.Editor
 | |
| {
 | |
|     public class ATIntegrationHotFix {
 | |
|         public static ATIntegrationHotFix Instance = new ATIntegrationHotFix();
 | |
| 
 | |
|         private ATIntegrationHotFix()
 | |
|         {
 | |
|             
 | |
|         }
 | |
| 
 | |
|         private static string plugin_hot_fix_data_file_name = "plugin_hot_fix_data.json";
 | |
| 
 | |
|         public void loadHotFixData()
 | |
|         {
 | |
|             var downloadUrl = ATNetInfo.getHotfixPluginDownloadUrl(ATConfig.PLUGIN_VERSION);
 | |
|             ATLog.log("loadHotFixData() >>> downloadUrl: " + downloadUrl);
 | |
|             ATEditorCoroutine.startCoroutine(loadHotFixDataWithIEnumerator(downloadUrl));
 | |
|         }
 | |
| 
 | |
|         private IEnumerator loadHotFixDataWithIEnumerator(string url) {
 | |
|             var hotFixDataRequest = UnityWebRequest.Get(url);
 | |
|             var webRequest = hotFixDataRequest.SendWebRequest();
 | |
|             while (!webRequest.isDone)
 | |
|             {
 | |
|                 yield return new WaitForSeconds(0.1f);
 | |
|             }
 | |
| 
 | |
| #if UNITY_2020_1_OR_NEWER
 | |
|             if (hotFixDataRequest.result != UnityWebRequest.Result.Success)
 | |
| #elif UNITY_2017_2_OR_NEWER
 | |
|             if (hotFixDataRequest.isNetworkError || hotFixDataRequest.isHttpError)
 | |
| #else
 | |
|             if (hotFixDataRequest.isError)
 | |
| #endif
 | |
|             {
 | |
|                 // Debug.Log("loadPluginData failed.");
 | |
|                 // callback(null);
 | |
|                 ATLog.log("load hotfix data failed.");
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 //解析热修复的数据
 | |
|                 try {
 | |
|                     string hotFixData = hotFixDataRequest.downloadHandler.text;
 | |
|                     var hotFixDataObj = JsonUtility.FromJson<HotfixPluginData>(hotFixData);
 | |
|                     ATLog.log("loadHotFixDataWithIEnumerator() >>> hotFixData: " + hotFixData);
 | |
|                     //判断status是否需要进行热更新
 | |
|                     if (hotFixDataObj.status != 1) {
 | |
|                          ATLog.log("loadHotFixDataWithIEnumerator() >>> 热更新被禁止");
 | |
|                     } else {
 | |
|                          var localHotFixDataObj = getHotfixPluginData();
 | |
|                         if (localHotFixDataObj == null) {
 | |
|                             //本地未曾下载过热更新
 | |
|                             ATLog.log("loadHotFixDataWithIEnumerator() >>> 本地未曾下载过热更新");
 | |
|                             ATEditorCoroutine.startCoroutine(loadHotFixPlugin(hotFixDataObj));
 | |
|                         } else {
 | |
|                             var compareVersionResult = ATDataUtil.CompareVersions(localHotFixDataObj.hot_fix_version, hotFixDataObj.hot_fix_version);
 | |
|                             ATLog.log("loadHotFixDataWithIEnumerator() >>> compareVersionResult: " + compareVersionResult);
 | |
|                             //本地版本比远端版本低,则需要更新
 | |
|                             if (compareVersionResult == VersionComparisonResult.Lesser) {
 | |
|                                 ATEditorCoroutine.startCoroutine(loadHotFixPlugin(hotFixDataObj));
 | |
|                             } else {
 | |
|                                 //不需要热更新
 | |
|                                 saveHotfixData(hotFixData);
 | |
|                             }
 | |
|                         }
 | |
|                     }
 | |
|                 } catch(Exception e) {
 | |
|                     ATLog.logError("parseNetworksJson() >>> failed: " + e);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private IEnumerator loadHotFixPlugin(HotfixPluginData hotFixDataObj) {
 | |
|             var path = Path.Combine(Application.temporaryCachePath, hotFixDataObj.file_name);
 | |
|             ATLog.log("downloadPluginWithEnumerator() >>> path: " + path);
 | |
| #if UNITY_2017_2_OR_NEWER
 | |
|             var downloadHandler = new DownloadHandlerFile(path);
 | |
| #else
 | |
|             var downloadHandler = new ATDownloadHandler(path);
 | |
| #endif
 | |
|             var downloadUrl = hotFixDataObj.download_url;
 | |
|             UnityWebRequest downloadPluginRequest = new UnityWebRequest(downloadUrl) 
 | |
|             {    method = UnityWebRequest.kHttpVerbGET,
 | |
|                 downloadHandler = downloadHandler
 | |
|             };
 | |
| 
 | |
| #if UNITY_2017_2_OR_NEWER
 | |
|             var operation = downloadPluginRequest.SendWebRequest();
 | |
| #else
 | |
|             var operation = downloadPluginRequest.Send();
 | |
| #endif
 | |
|             while (!operation.isDone)
 | |
|             {
 | |
|                 yield return new WaitForSeconds(0.1f); // Just wait till downloadPluginRequest is completed. Our coroutine is pretty rudimentary.
 | |
|                 if (operation.progress != 1 && operation.isDone)
 | |
|                 {
 | |
| 
 | |
|                 }
 | |
|             }
 | |
| 
 | |
| #if UNITY_2020_1_OR_NEWER
 | |
|             if (downloadPluginRequest.result != UnityWebRequest.Result.Success)
 | |
| #elif UNITY_2017_2_OR_NEWER
 | |
|             if (downloadPluginRequest.isNetworkError || downloadPluginRequest.isHttpError)
 | |
| #else
 | |
|             if (downloadPluginRequest.isError)
 | |
| #endif
 | |
|             {
 | |
|                 ATLog.log(downloadPluginRequest.error);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 AssetDatabase.ImportPackage(path, false);
 | |
|                 AssetDatabase.Refresh();
 | |
| 
 | |
|                 string hotFixData = JsonUtility.ToJson(hotFixDataObj);
 | |
|                 saveHotfixData(hotFixData);
 | |
|             }
 | |
|             downloadPluginRequest.Dispose();
 | |
|             downloadPluginRequest = null;
 | |
|         }
 | |
| 
 | |
| 
 | |
|         private void saveHotfixData(string hotfixPluginData) {
 | |
|             var directoryPath = ATConfig.plugin_setting_data_path;
 | |
|              // 确保目标文件夹存在
 | |
|             if (!Directory.Exists(directoryPath))
 | |
|             {
 | |
|                 // 如果目录不存在,则创建它
 | |
|                 Directory.CreateDirectory(directoryPath);
 | |
|             }
 | |
|             string fullPath = Path.Combine(directoryPath, plugin_hot_fix_data_file_name);
 | |
|             ATLog.log("saveHotfixData() >>> fullPath: " + fullPath + " hotfixPluginData: " + hotfixPluginData);
 | |
|             File.WriteAllText(fullPath, hotfixPluginData);
 | |
|         }
 | |
| 
 | |
|         private HotfixPluginData getHotfixPluginData() {
 | |
|             string fullPath = Path.Combine(ATConfig.plugin_setting_data_path, plugin_hot_fix_data_file_name);
 | |
|             if (!File.Exists(fullPath)) {
 | |
|                 return null;
 | |
|             }
 | |
|             string json = File.ReadAllText(fullPath);
 | |
|             if(json == "") {
 | |
|                 return null;
 | |
|             }
 | |
|             return JsonUtility.FromJson<HotfixPluginData>(json);
 | |
|         }
 | |
|     }
 | |
| } |