public static T LoadAssetFromAssetBundleUnit <T>(AssetBundleUnit assetBundleUnit, string name, bool release = false) where T : Object { if (assetBundleUnit != null && assetBundleUnit.assetBundle != null) { T asset = assetBundleUnit.assetBundle.LoadAsset <T>(name); if (release) { // 立即卸载AssetBundle会报错 // error message: // Cancelling DisplayDialog because it was run from a thread that is not the main thread: Opening file failed Opening file TaskHelper.Create <CoroutineTask>() .Delay(1) .Do(() => { AssetBundleManager.instance.Release(assetBundleUnit); Log.I(TAG, "Release assetbundleunit by time delay"); }); } return(asset); } Log.W(TAG, "Load Asset {0} from {1} is null", name, assetBundleUnit.name); return(null); }
private IEnumerator <object> Load(string assetBundleName, bool isRoot = false) { lock (obj) { if (!caches.ContainsKey(assetBundleName) || caches[assetBundleName] == null) { AssetBundleCreateRequest assetBundleCreateRequest = AssetBundle.LoadFromFileAsync(Path.Combine(Application.streamingAssetsPath, assetBundleName)); yield return(assetBundleCreateRequest); // wait one frame yield return(null); AssetBundleUnit unit = new AssetBundleUnit(); unit.referenceCount++; unit.name = assetBundleName; unit.assetBundle = assetBundleCreateRequest.assetBundle; if (isRoot) { unit.dependencies = GetDependencies(assetBundleName); } caches.Add(assetBundleName, unit); } else { caches[assetBundleName].referenceCount++; } yield return(null); } }
public override void OnSingletonInit() { base.OnSingletonInit(); caches = new Dictionary <string, AssetBundleUnit>(); AssetBundleUnit infoUnit = Load("StreamingAssets"); assetBundleManifest = infoUnit.assetBundle.LoadAsset <AssetBundleManifest>("assetbundlemanifest"); Release(infoUnit); }
public static T LoadAsset <T>(string path, string name) where T : Object { if (IsResources(path)) { T asset = Resources.Load <T>(GetResourcesName(path, name)); return(asset); } AssetBundleUnit assetBundleUnit = LoadAssetBundleUnit(path); T ret = LoadAssetFromAssetBundleUnit <T>(assetBundleUnit, name); return(ret); }
private static IEnumerator Load <T>(AssetBundleUnit assetBundleUnit, string name, System.Action <T> action) where T : Object { if (assetBundleUnit != null && assetBundleUnit.assetBundle != null) { AssetBundleRequest request = assetBundleUnit.assetBundle.LoadAssetAsync <T>(name); yield return(request); action.InvokeGracefully(request.asset); } else { action.InvokeGracefully(null); } }
public AssetBundleUnit Load(string name) { if (!caches.ContainsKey(name)) { AssetBundleUnit assetBundleUnit = new AssetBundleUnit(); assetBundleUnit.name = name; assetBundleUnit.assetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, name)); assetBundleUnit.referenceCount++; if (assetBundleManifest != null) { assetBundleUnit.dependencies = assetBundleManifest.GetAllDependencies(name); assetBundleUnit.dependencies.ForEach((index, it) => { Load(it); }); } caches.Add(name, assetBundleUnit); } return(caches[name]); }
private void Unload(AssetBundleUnit assetBundleUnit, bool unloadAllLoadedObjects = false) { if (assetBundleUnit == null) { Log.W(this, "Unload asset bundle is null!"); return; } if (caches.ContainsKey(assetBundleUnit.name)) { caches.Remove(assetBundleUnit.name); } if (assetBundleUnit.assetBundle != null) { assetBundleUnit.assetBundle.Unload(unloadAllLoadedObjects); } assetBundleUnit.name = null; assetBundleUnit.assetBundle = null; assetBundleUnit.dependencies = null; assetBundleUnit.referenceCount = 0; }
public void Release(AssetBundleUnit bundleUnit, bool unloadAllLoadedObjects = false) { if (bundleUnit == null) { Log.W(this, "Release asset bundle is null!"); return; } string[] dependencies = bundleUnit.dependencies; dependencies.ForEach((index, it) => { if (caches.ContainsKey(it)) { Release(caches[it]); } }); bundleUnit.referenceCount--; if (bundleUnit.referenceCount <= 0) { Unload(bundleUnit); } }
public static void LoadAssetFromAssetBundleUnitAsyc <T>(AssetBundleUnit assetBundleUnit, string name, System.Action <T> finish, bool release = false) where T : Object { if (assetBundleUnit != null && assetBundleUnit.assetBundle != null) { TaskHelper.Create <CoroutineTask>() .Delay(Load(assetBundleUnit, name, finish)) .Do(() => { if (release) { AssetBundleManager.instance.Release(assetBundleUnit); } }) .Execute(); } else { Log.W(TAG, "Load Asset {0} from {1} is null", name, assetBundleUnit.name); finish.InvokeGracefully(null); } }
public static AssetBundleUnit LoadAssetBundleUnit(string path) { AssetBundleUnit assetBundleUnit = AssetBundleManager.instance.Load(path); return(assetBundleUnit); }