Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
            }
        }
Esempio n. 3
0
        public override void OnSingletonInit()
        {
            base.OnSingletonInit();

            caches = new Dictionary <string, AssetBundleUnit>();

            AssetBundleUnit infoUnit = Load("StreamingAssets");

            assetBundleManifest = infoUnit.assetBundle.LoadAsset <AssetBundleManifest>("assetbundlemanifest");
            Release(infoUnit);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
            }
        }
Esempio n. 6
0
        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]);
        }
Esempio n. 7
0
        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;
        }
Esempio n. 8
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);
            }
        }
Esempio n. 9
0
 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);
     }
 }
Esempio n. 10
0
        public static AssetBundleUnit LoadAssetBundleUnit(string path)
        {
            AssetBundleUnit assetBundleUnit = AssetBundleManager.instance.Load(path);

            return(assetBundleUnit);
        }