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); } } }
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; }
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); } } }