diff --git a/Editor/PackageManager/RepositoryDataFetcher.cs b/Editor/PackageManager/RepositoryDataFetcher.cs index abf8ac4..00f02c6 100644 --- a/Editor/PackageManager/RepositoryDataFetcher.cs +++ b/Editor/PackageManager/RepositoryDataFetcher.cs @@ -4,7 +4,6 @@ using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; using Newtonsoft.Json; -using Unity.EditorCoroutines.Editor; using UnityEditor; @@ -80,6 +79,29 @@ namespace AlicizaX.PackageManager.Editor } } + internal class PackageManagerCoroutines : MonoBehaviour + { + public static PackageManagerCoroutines Coroutines; + + public static void CreateCoroutines() + { + if (Coroutines == null) + { + Coroutines = new GameObject("Coroutines").AddComponent(); + } + } + + public static void DestroyCoroutines() + { + if (Coroutines != null) + { + Coroutines.StopAllCoroutines(); + DestroyImmediate(Coroutines.gameObject); + Coroutines = null; + } + } + } + public static class RepositoryDataFetcher { private const string BaseApiUrl = "http://101.34.252.46:3000/api/v1/repos/search?q=unity&topic=false"; @@ -88,22 +110,25 @@ namespace AlicizaX.PackageManager.Editor public static void FetchRepositoryData(Action> callback) { + PackageManagerCoroutines.CreateCoroutines(); EditorPrefs.SetString("PackageUpdateDate", DateTime.Now.ToString()); - EditorCoroutineUtility.StartCoroutineOwnerless(FetchDataRoutine(callback)); + PackageManagerCoroutines.Coroutines.StartCoroutine(FetchDataRoutine(callback)); } private static IEnumerator FetchDataRoutine(Action> callback) { + Debug.Log("Fetching repository data..."); // 第一阶段:获取仓库列表 using (var request = CreateWebRequest(BaseApiUrl)) { - yield return request.SendWebRequest(); + yield return request.SendWebRequest(); if (!HandleRequestError(request, "Repository request failed")) { callback?.Invoke(null); yield break; } + Debug.Log(request.downloadHandler.text); var repoResponse = JsonConvert.DeserializeObject(request.downloadHandler.text); if (!repoResponse.ok || repoResponse.data == null) @@ -123,6 +148,8 @@ namespace AlicizaX.PackageManager.Editor var packageData = CreateBaseRepositoryData(repo); var packageUrl = repo.html_url + PackageJsonPath; + Debug.Log(packageUrl); + using (var packageRequest = CreateWebRequest(packageUrl)) { yield return packageRequest.SendWebRequest(); @@ -144,12 +171,10 @@ namespace AlicizaX.PackageManager.Editor results.Add(packageData); } - - // 防止同时发起太多请求,每帧处理一个 - yield return null; } callback?.Invoke(results); + PackageManagerCoroutines.DestroyCoroutines(); } } diff --git a/Editor/PackageManager/Window/FrameworkPackageManagerWindow.cs b/Editor/PackageManager/Window/FrameworkPackageManagerWindow.cs index 68ee20c..ba6def3 100644 --- a/Editor/PackageManager/Window/FrameworkPackageManagerWindow.cs +++ b/Editor/PackageManager/Window/FrameworkPackageManagerWindow.cs @@ -46,6 +46,11 @@ namespace AlicizaX.PackageManager.Editor GetWindow().Show(); } + private void OnDestroy() + { + PackageManagerCoroutines.DestroyCoroutines(); + } + private void CreateGUI() { VisualTreeAsset visualTree = AssetDatabase.LoadAssetAtPath(VisualAssetPath);