IEnumerator CoLoadBundleAsync <T>(string assetName, string bundleName, E_LoadAsset eloadAsset, System.Action <T> callback) where T : IAssetGetter, new() { AssetBundle bundle = null; BundleHolder bundleHolder = null; AssetBundleCreateRequest bundleRequest; // 没有加载过bundle string bundlePath; if (!bundleHolders.TryGetValue(bundleName, out bundleHolder)) { bundlePath = GetBundlePath(bundleName); //bundleRequest = AssetBundle.LoadFromFileAsync(Path.Combine(bundleRootPath, bundleName)); bundleRequest = AssetBundle.LoadFromFileAsync(bundlePath); while (!bundleRequest.isDone) { yield return(bundleRequest); } //存bundleHolder bundle = bundleRequest.assetBundle; bundleHolder = new BundleHolder(bundle); bundleHolder.AddRefence(assetName); //Debug.LogError(Time.realtimeSinceStartup + " " + bundleName + " " + assetName); bundleHolders.Add(bundleName, bundleHolder); } else { bundleHolder.AddRefence(assetName); bundle = bundleHolder.Get(); } // 加载依赖的bundle string[] dependencies = manifest.GetAllDependencies(bundleName); for (int i = 0, iMax = dependencies.Length; i < iMax; ++i) { BundleHolder dependBundleHolder = null; if (bundleHolders.TryGetValue(dependencies[i], out dependBundleHolder)) { //已经存在的bundle只增加引用 dependBundleHolder.AddRefence(assetName); continue; } //没加载过的 AssetBundle dependBundle = null; bundlePath = GetBundlePath(dependencies[i]); bundleRequest = AssetBundle.LoadFromFileAsync(bundlePath); while (!bundleRequest.isDone) { yield return(bundleRequest); } dependBundle = bundleRequest.assetBundle; dependBundleHolder = new BundleHolder(dependBundle); dependBundleHolder.AddRefence(assetName); //存bundleHolder bundleHolders.Add(dependencies[i], dependBundleHolder); } yield return(CoLoadAssetAsync <T>(bundle, assetName, eloadAsset, callback)); }
IEnumerator CoLoadAssetAsync <T>(AssetBundle assetBundle, string assetName, E_LoadAsset eloadAsset, System.Action <T> callback) where T : IAssetGetter, new() { AssetBundleRequest assetRequest = null; switch (eloadAsset) { case E_LoadAsset.LoadSingle: int index = assetName.LastIndexOf("/"); string assetNameInBundle = assetName.Substring(index + 1); assetRequest = assetBundle.LoadAssetAsync(assetNameInBundle); break; case E_LoadAsset.LoadAll: assetRequest = assetBundle.LoadAllAssetsAsync <Object>(); break; } while (!assetRequest.isDone) { yield return(assetRequest); } AssetHolder assetHolder = null; switch (eloadAsset) { case E_LoadAsset.LoadSingle: assetHolder = new AssetHolder(assetRequest.asset); break; case E_LoadAsset.LoadAll: assetHolder = new AssetHolder(assetRequest.allAssets); break; } T getter = new T(); getter.SetAssetHolder(assetHolder); nameAssetHolders.Add(assetName, assetHolder); #if UNITY_EDITOR var request = bundleAsyncs.Dequeue(); Logger.LogWarp.Log(request.assetName + " " + request.currRequestID + " Dequeue"); #else bundleAsyncs.Dequeue(); #endif if (callback != null) { callback(getter); } }
void LoadAssetAsync <T>(string assetName, E_LoadAsset eloadAsset, System.Action <T> callback) where T : IAssetGetter, new() { T getter; string bundleName = GetBundleName(assetName); if (LoadAssetFromNameAssetHolder(assetName, bundleName, out getter)) { callback(getter); } //BundleAsyncRequest bundleRequest = new BundleAsyncRequest(assetName, eloadAsset, callback); BundleAsyncRequest bundleRequest = new BundleAsyncRequest(assetName, eloadAsset); bundleAsyncs.Enqueue(bundleRequest); RunCoroutine.Run(CoBundleAsyncRequest <T>(bundleRequest, callback)); }
IEnumerator CoLoadAssetAsync <T>(AssetBundle assetBundle, string assetName, E_LoadAsset eloadAsset, System.Action <T> callback) where T : IAssetGetter, new() { AssetBundleRequest assetRequest = null; switch (eloadAsset) { case E_LoadAsset.LoadSingle: int index = assetName.LastIndexOf("/"); string assetNameInBundle = assetName.Substring(index + 1); Debug.LogError(assetName + " " + assetNameInBundle); //assetRequest = assetBundle.LoadAssetAsync(assetName); assetRequest = assetBundle.LoadAssetAsync(assetNameInBundle); break; case E_LoadAsset.LoadAll: assetRequest = assetBundle.LoadAllAssetsAsync <Object>(); break; } while (!assetRequest.isDone) { yield return(assetRequest); } AssetHolder assetHolder = null; switch (eloadAsset) { case E_LoadAsset.LoadSingle: assetHolder = new AssetHolder(assetRequest.asset); break; case E_LoadAsset.LoadAll: assetHolder = new AssetHolder(assetRequest.allAssets); break; } T getter = new T(); getter.SetAssetHolder(assetHolder); nameAssetHolders.Add(assetName, assetHolder); callback(getter); bundleAsyncs.Dequeue(); }
T LoadAsset <T>(string assetName, E_LoadAsset eLoadAsset) where T : IAssetGetter, new() { T getter; string bundleName = GetBundleName(assetName); if (LoadAssetFromNameAssetHolder(assetName, bundleName, out getter)) { return(getter); } AssetBundle bundle = LoadBundle(assetName, bundleName); if (bundle == null) { return(getter); } //所有bundle加载完毕 AssetHolder assetHolder = null; switch (eLoadAsset) { case E_LoadAsset.LoadSingle: int index = assetName.LastIndexOf("/"); string assetNameInBundle = assetName.Substring(index + 1); //Debug.LogError(assetName + " " + assetNameInBundle); assetHolder = new AssetHolder(bundle.LoadAsset(assetNameInBundle)); break; case E_LoadAsset.LoadAll: assetHolder = new AssetHolder(bundle.LoadAllAssets()); break; } getter.SetAssetHolder(assetHolder); nameAssetHolders.Add(assetName, assetHolder); return(getter); }
void LoadAssetAsync <T>(string assetName, E_LoadAsset eloadAsset, System.Action <T> callback) where T : IAssetGetter, new() { T getter; string bundleName = GetBundleName(assetName); if (LoadAssetFromNameAssetHolder(assetName, bundleName, out getter)) { if (callback != null) { callback(getter); } return; } BundleAsyncRequest bundleRequest = new BundleAsyncRequest(assetName, eloadAsset); Logger.LogWarp.Log(assetName + " request " + bundleRequest.currRequestID); bundleAsyncs.Enqueue(bundleRequest); RunCoroutine.Run(CoBundleAsyncRequest <T>(bundleRequest, callback)); }
public BundleAsyncRequest(string assetName, E_LoadAsset eLoadAsset) { this.assetName = assetName; this.eLoadAsset = eLoadAsset; currRequestID = requestID++; }