public static IEnumerator AssetBundleLoop() { while (true) { while (hasTaskToFinish == false) { yield return(new WaitForEndOfFrame()); } //处理Task while (assetTaskQueue.Count > 0) { AssetRequestTask current = assetTaskQueue.Dequeue(); //AssetBundle已经被读取 if (LoadedAssets.ContainsKey(current.GetABName())) { if (LoadedAssets[current.GetABName()] == null) { current.onAssetLoaded(null); Debug.LogError("Null Asset Request Critical!"); continue; } string assetPath = LoadedAssets[current.GetABName()].GetAllAssetNames()[0]; AssetBundleRequest abRequest = LoadedAssets[current.GetABName()].LoadAssetAsync(assetPath); yield return(abRequest); current.onAssetLoaded(abRequest.asset); } //AssetBundle尚未读取 else { //依赖包 Loop for (var i = 0; i < assetBundleManifestList.Count; i++) { var DependenciesInfo = assetBundleManifestList[i].GetAllDependencies(current.GetABName()); for (var j = 0; j < DependenciesInfo.Length; j++) { if (LoadedAssets.ContainsKey(DependenciesInfo[j])) { continue; } var isDependenceAssetLoaded = false; MonoActiveObject.StartCoroutine(LoadAsset(DependenciesInfo[j], () => { isDependenceAssetLoaded = true; })); while (!isDependenceAssetLoaded) { yield return(new WaitForEndOfFrame()); } } } //主AB bool isMainLoaded = false; MonoActiveObject.StartCoroutine(LoadAsset(current.GetABName(), () => { isMainLoaded = true; })); while (!isMainLoaded) { yield return(new WaitForEndOfFrame()); } //添加回队列 等待队列回调 assetTaskQueue.Enqueue(current); yield return(new WaitForEndOfFrame()); } } hasTaskToFinish = false; } }
public static void Init() { activationData.OnLoad(); //TODO: Mod Manager modDirs = new List <string>(); DirectoryInfo dir = null; switch (Application.platform) { case RuntimePlatform.WindowsEditor: dir = new DirectoryInfo(Application.dataPath + "/../mods/"); break; case RuntimePlatform.WindowsPlayer: dir = new DirectoryInfo(Application.dataPath + "/../mods/"); break; case RuntimePlatform.Android: dir = new DirectoryInfo(Application.persistentDataPath + "/mods/"); break; } if (dir != null) { if (!dir.Exists) { dir.Create(); } var scriptableMods = new GameObject("ScriptableModManager", typeof(ScriptableModManager)).GetComponent <ScriptableModManager>(); //Unzip Mod packs var installDir = new DirectoryInfo(dir.FullName + "Installs"); if (!installDir.Exists) { installDir.Create(); } var zips = installDir.GetFiles("*.modpack"); var fastZip = new FastZip(); foreach (var zip in zips) { var packDir = new DirectoryInfo(dir.FullName + Path.GetFileNameWithoutExtension(zip.Name)); if (!packDir.Exists) { packDir.Create(); } fastZip.ExtractZip(zip.FullName, packDir.FullName, null); var detectInstalled = new FileInfo(zip.Directory.FullName + "/" + Path.GetFileNameWithoutExtension(zip.Name) + ".installed"); if (detectInstalled.Exists) { detectInstalled.Delete(); } zip.MoveTo(zip.Directory.FullName + "/" + Path.GetFileNameWithoutExtension(zip.Name) + ".installed"); } foreach (var subDir in dir.GetDirectories()) { if (activationData.ModsIgnoreList.Contains(subDir.FullName + "/")) { continue; } modDirs.Add(subDir.FullName + "/"); //Filter Files if (Application.platform == RuntimePlatform.Android) { if (!subDir.Name.Contains("Android")) { continue; } } if (Application.platform == RuntimePlatform.WindowsPlayer) { if (!subDir.Name.Contains("Windows")) { continue; } } if (subDir.Name.Contains("(")) { continue; } foreach (var dll in subDir.GetFiles("*.dll")) { scriptableMods.dllDirs.Add(dll.FullName); } foreach (var modInfoFile in subDir.GetFiles("*.modpackdata")) { var assetRequest = new AssetRequestTask() { onAssetLoaded = (val) => { var modPackageData = val as ModPackageData; if (modPackageData != null) { modPackageData.installedDirectory = subDir.Name; ModActivationData.modPackagesList.Add(modPackageData); } } }; assetRequest.SetAssetBundleName(modInfoFile.Name); LoadAssetFromAssetBundle(assetRequest); } } scriptableMods.Mount(); } }
public static void LoadAssetFromAssetBundle(AssetRequestTask assetRequestTask) { assetTaskQueue.Enqueue(assetRequestTask); hasTaskToFinish = true; }