コード例 #1
0
        bool UnloadAssetBundle(string path, bool force = false)
        {
            var cachePath         = path.ToLower();
            var loadedAssetBundle = this.TryGetLoadedAssetBundle(cachePath);

            if (loadedAssetBundle == null)
            {
                return(false);
            }

            var isManifest = path == ResConfig.MAINIFEST;
            var bundleName = isManifest ? path : ResConfig.ConvertToBundleName(path) + ResConfig.BUNDLE_EXTENSION;

            // Try unload bundle assets, and remove from cache
            if (force)
            {
                loadedAssetBundle.ReferencedCount = 0;
            }
            else
            {
                loadedAssetBundle.ReferencedCount--;
            }

            // Check referencedCount
            var unload = false;

            if (loadedAssetBundle.ReferencedCount <= 0)
            {
                unload = true;
                loadedAssetBundle.Unload();
                _assetBundles.Remove(cachePath);
                this.DebugDeallocBundle(cachePath);
                if (isManifest)
                {
                    _manifest = null;
                }
            }

            // Try unload depenceBundle
            if (unload == true && _dependenceInfos.ContainsKey(bundleName))
            {
                var dependencies = _dependenceInfos[bundleName];
                for (var i = 0; i < dependencies.Length; ++i)
                {
                    var dependencePath = ResConfig.ReverseFromBundleName(dependencies[i]);
                    this.UnloadAssetBundle(dependencePath, force);
                }
                _dependenceInfos.Remove(bundleName);
            }

            return(true);
        }
コード例 #2
0
        LoadedAssetBundle LoadAssetBundle(string path, bool isDependence = false)
        {
            this.EnsureManifest();
            var cachePath         = path.ToLower();
            var loadedAssetBundle = this.TryGetLoadedAssetBundle(cachePath);

            if (loadedAssetBundle != null)
            {
                loadedAssetBundle.ReferencedCount++;
                return(loadedAssetBundle);
            }

            var isManifest = path == ResConfig.MAINIFEST;
            var bundleName = isManifest ? path : ResConfig.ConvertToBundleName(path) + ResConfig.BUNDLE_EXTENSION;

            // Load dependencies
            if (isDependence == false)
            {
                var dependencies = this.GetDependencies(bundleName, path);
                for (var i = 0; i < dependencies.Length; ++i)
                {
                    var dependencePath   = ResConfig.ReverseFromBundleName(dependencies[i]);
                    var dependenceBundle = this.LoadAssetBundle(dependencePath, true);
                    if (dependenceBundle == null)
                    {
                        LogManager.Error(string.Format(
                                             "ResManager::LoadAssetFromBundle error, dependence({0}) is null!",
                                             dependencePath
                                             ));
                    }
                }
            }

            // Load & cache assetBundle
            loadedAssetBundle = new LoadedAssetBundle(path, bundleName);
            loadedAssetBundle.ReferencedCount = 1;
            _assetBundles.Add(cachePath, loadedAssetBundle);
            this.DebugAllocBundle(cachePath);

            return(loadedAssetBundle);
        }