예제 #1
0
        private void Update()
        {
            // clean out any unloaded bundles
            for (int i = mPendingAssetBundleUnloads.Count - 1; i >= 0; i--)
            {
                mLoadedAssets.Remove(mPendingAssetBundleUnloads[i]);
                mPendingAssetBundleUnloads.RemoveAt(i);
            }

            // update pending asset bundle loads
            for (int i = mPendingAssetBundleLoads.Count - 1; i >= 0; i--)
            {
                var pending = mPendingAssetBundleLoads[i];
                if (pending.request.isDone)
                {
                    AssetBundleStatus status = new AssetBundleStatus();
                    status.bundle   = pending.request.assetBundle;
                    status.type     = pending.type;
                    status.refcount = pending.type == AssetBundleLoadType.Dependency ? 1 : 0;
                    mLoadedAssets.Add(pending.request.assetBundle.name, status);
                    if (pending.type == AssetBundleLoadType.Manifest)
                    {
                        LoadAllFromAsset <AssetBundleManifest>(pending.request.assetBundle.name, delegate(Object[] o)
                        {
                            mManifest = o[0] as AssetBundleManifest;
                            state     = AssetBundleManagerState.Ready;
                        });
                    }
                    mPendingAssetBundleLoads.RemoveAt(i);
                }
            }

            if (Initialized() && mPendingAssetBundleLoads.Count == 0)
            {
                state = AssetBundleManagerState.Ready;
            }

            // update pending loads _from_ assetbundles
            for (int i = mPendingAssetBundleRequests.Count - 1; i >= 0; i--)
            {
                var pending = mPendingAssetBundleRequests[i];
                if (pending.request.isDone)
                {
                    pending.callback(pending.request.allAssets);
                    mPendingAssetBundleRequests.RemoveAt(i);
                }
            }

            if (state == AssetBundleManagerState.Ready)
            {
                for (int i = mDeferredAssetBundleLoads.Count - 1; i >= 0; i--)
                {
                    LoadAssetBundle(mDeferredAssetBundleLoads[i].bundle, mDeferredAssetBundleLoads[i].type);
                    mDeferredAssetBundleLoads.RemoveAt(i);
                }
            }
        }
예제 #2
0
        void LoadManifest()
        {
            if (state != AssetBundleManagerState.Uninitialized)
            {
                Debug.LogError("AssetBundleManager:  Should only load manifest once");
            }
            string bundleName = RuntimePlatformToAssetBundlePath(Application.platform);

            LoadAssetBundle(bundleName, AssetBundleLoadType.Manifest);
            state = AssetBundleManagerState.LoadingManifest;
        }
예제 #3
0
        public void LoadAssetBundle(string assetbundle, AssetBundleLoadType type)
        {
            string platform = RuntimePlatformToAssetBundlePath(Application.platform);
            string fullpath = Application.streamingAssetsPath + assetBundleLocation + platform + "/" + assetbundle;

            if (Initialized() && type != AssetBundleLoadType.Manifest)
            {
                if (type == AssetBundleLoadType.Primary ||
                    type == AssetBundleLoadType.Permanent)
                {
                    if (type == AssetBundleLoadType.Primary)
                    {
                        mPrimaryBundle = assetbundle;
                    }
                    // promotion of bundle previously loaded as dependency
                    if (mLoadedAssets.ContainsKey(assetbundle) &&
                        mLoadedAssets[assetbundle].type == AssetBundleLoadType.Dependency)
                    {
                        mLoadedAssets[assetbundle].type = type;
                    }
                    // don't load dependencies for a bundle that's already loaded
                    if (!mLoadedAssets.ContainsKey(assetbundle))
                    {
                        // get dependencies
                        string[] deps = mManifest.GetAllDependencies(assetbundle);
                        foreach (var dep in deps)
                        {
                            if (!mLoadedAssets.ContainsKey(dep))
                            {
                                LoadAssetBundle(dep, AssetBundleLoadType.Dependency);
                            }
                            else
                            {
                                mLoadedAssets[dep].refcount++;
                            }
                        }
                    }
                }
                // don't load already loaded bundles
                if (!mLoadedAssets.ContainsKey(assetbundle))
                {
                    AssetBundleLoadStatus status = new AssetBundleLoadStatus();
                    status.request = AssetBundle.LoadFromFileAsync(fullpath);
                    status.type    = type;
                    mPendingAssetBundleLoads.Add(status);
                    state = AssetBundleManagerState.Working;
                }
            }
            else if (!Initialized())
            {
                if (type == AssetBundleLoadType.Manifest)
                {
                    AssetBundleLoadStatus status = new AssetBundleLoadStatus();
                    status.request = AssetBundle.LoadFromFileAsync(fullpath);
                    status.type    = AssetBundleLoadType.Manifest;
                    mPendingAssetBundleLoads.Add(status);
                }
                else if (type == AssetBundleLoadType.Primary ||
                         type == AssetBundleLoadType.Permanent)
                {
                    DeferredAssetBundleLoad load = new DeferredAssetBundleLoad();
                    load.bundle = assetbundle;
                    load.type   = type;
                    mDeferredAssetBundleLoads.Add(load);
                }
            }
        }