// Where we actuall call WWW to download the assetBundle. protected bool LoadAssetBundleInternal(string assetBundleName, int level = 0) { // Already loaded. LoadedAssetBundle bundle = null; m_LoadedAssetBundles.TryGetValue(assetBundleName, out bundle); if (bundle != null) { bundle.m_ReferencedCount++; return(true); } // @TODO: Do we need to consider the referenced count of WWWs? // In the demo, we never have duplicate WWWs as we wait LoadAssetAsync()/LoadLevelAsync() to be finished before calling another LoadAssetAsync()/LoadLevelAsync(). // But in the real case, users can call LoadAssetAsync()/LoadLevelAsync() several times then wait them to be finished which might have duplicate WWWs. if (m_DownloadingBundles.Contains(assetBundleName)) { return(true); } VersionBundle vb = null; VersionHelper.instance.GetBundleHttp(assetBundleName, out vb); if (vb != null) { string id = vb.versionValue + "_" + vb.id; if (ResHelper.Instance().downloadedFiles.ContainsKey(id)) { string url = PathUtils.MakeFilePath(id, PathUtils.PathType.MobileDiskWrite); AssetBundleCreateRequest abcr = AssetBundle.LoadFromFileAsync(url); m_InProgressOperations.Add(new AssetBundleDownloadFromFile(assetBundleName, abcr, url)); } else { string url = GameConfig.HOST_RES() + vb.id + "?v=" + vb.versionValue; m_InProgressOperations.Add(new AssetBundleDownloadFromWebOperation(assetBundleName, url, vb.versionValue, vb.crc, level)); } } else { PathUtils.PathType eType = PathUtils.PathType.None; string url = PathUtils.GetReadablePath(assetBundleName, ref eType, false); AssetBundleCreateRequest abcr = AssetBundle.LoadFromFileAsync(url); m_InProgressOperations.Add(new AssetBundleDownloadFromFile(assetBundleName, abcr, url)); } m_DownloadingBundles.Add(assetBundleName); return(false); }
/************************************ * 函数说明: 获取本地可读资源路径 * 返 回 值: string ************************************/ public static string GetReadablePath(string fileName, ref PathUtils.PathType eType, bool addPre = true) { string szUrl = ""; do { //if (!GameConfig.useLocalRes) { if (eType == PathUtils.PathType.None) { switch (platform) { case RuntimePlatform.OSXEditor: case RuntimePlatform.OSXPlayer: case RuntimePlatform.WindowsPlayer: case RuntimePlatform.WindowsEditor: szUrl = PathUtils.MakeFilePath(fileName, PathUtils.PathType.MobileDiskWrite); break; case RuntimePlatform.Android: szUrl = PathUtils.MakeFilePath(fileName, PathUtils.PathType.MobileDiskWrite); break; case RuntimePlatform.IPhonePlayer: szUrl = PathUtils.MakeFilePath(fileName, PathUtils.PathType.MobileDiskWrite); break; default: JZLog.LogError("GetBundle : Error For Platform"); break; } if (GameUtils.FileExist(szUrl) == true) { eType = PathUtils.PathType.MobileDiskWrite; break; } } } /** @brief: 默认手机盘只读数据 */ if (eType == PathUtils.PathType.None) { switch (platform) { case RuntimePlatform.OSXEditor: case RuntimePlatform.OSXPlayer: case RuntimePlatform.WindowsPlayer: case RuntimePlatform.WindowsEditor: szUrl = PathUtils.MakeFilePath(fileName, PathUtils.PathType.MobileDiskStreamAssert); break; case RuntimePlatform.Android: szUrl = dataPath + "!assets/" + fileName; break; case RuntimePlatform.IPhonePlayer: szUrl = PathUtils.MakeFilePath(fileName, PathUtils.PathType.MobileDiskStreamAssert); break; default: JZLog.LogError("GetBundle : Error For Platform"); break; } eType = PathUtils.PathType.MobileDiskStreamAssert; } } while (false); return(szUrl); }
/************************************ * 函数说明: 内部加载资源 * 返 回 值: System.Collections.IEnumerator * 参数说明: resRequest * 注意事项: ************************************/ private IEnumerator LoadResources(string szPkgName, System.Action <string, AssetBundle> callback) { do { /** @brief: 检查参数 */ if (string.IsNullOrEmpty(szPkgName)) { //JZLog.LogError("AsyncLoadRes : Error szPkgName == null"); yield break; } ResourceMgrData resourceData = null; /** @brief: 检查是否加载过此包 或者正在加载此包 */ if (gDicPkgResource.ContainsKey(szPkgName) == false) { resourceData = new ResourceMgrData() { eState = ResourceMgrData.State.None, assetBundle = null }; gDicPkgResource[szPkgName] = resourceData; } else { resourceData = gDicPkgResource[szPkgName]; if (resourceData.eState == ResourceMgrData.State.LoadFinish) { if (null != callback) { callback(szPkgName, resourceData.assetBundle); callback = null; } yield break; } } /** @brief: 避免一帧时间过长 */ /** @brief: Non matching Profiler.EndSample (BeginSample and EndSample count must match) */ /** @brief: One is catching an exception from another object, the other is long frame times. If it's either of those two, it can only be fixed by the Unity team. */ // yield return new WaitForEndOfFrame(); if (gDicPkgResource.ContainsKey(szPkgName) == false) { //JZLog.LogError("LoadResources : Warning Pkg == " + szPkgName + " Have no this Pkg , MayBe Remove it!"); yield break; } if (resourceData.eState == ResourceMgrData.State.None) { resourceData.eState = ResourceMgrData.State.Loading; } else { break; } VersionBundle bundle = VersionHelper.instance.GetBundle(szPkgName); if (null != bundle && null != bundle.dependency && bundle.dependency.Length > 0) { for (int i = 0; i < bundle.dependency.Length; i++) { string depName = bundle.dependency[i]; if (gDicPkgResource.ContainsKey(depName) == false || gDicPkgResource[depName].assetBundle == null) { yield return(GameWorld.instance.StartCoroutine(LoadResources(depName, null))); } } } AssetBundle asset = null; if (VersionHelper.instance.HasBundleHttp(szPkgName)) { VersionBundle httpAB = VersionHelper.instance.GetBundle(szPkgName); string szUrl = GameConfig.HOST_RES() + httpAB.id + "?v=" + httpAB.versionValue; WWW www = WWW.LoadFromCacheOrDownload(szUrl, httpAB.versionValue, httpAB.crc); yield return(www); if (null != www && null == www.error) { asset = www.assetBundle; www.Dispose(); www = null; } else { JZLog.LogError("LoadResources : Load from www Error: " + szUrl + "\n" + www.error); } } else { PathUtils.PathType eType = PathUtils.PathType.None; string szUrl = PathUtils.GetReadablePath(szPkgName, ref eType, false); AssetBundleCreateRequest abcr = AssetBundle.LoadFromFileAsync(szUrl); yield return(abcr); if (null != abcr.assetBundle) { asset = abcr.assetBundle; } else { JZLog.LogError("LoadResources : Load from file Error: " + szUrl); } } if (null != asset) { if (resourceData.eState == ResourceMgrData.State.Loading) { resourceData.assetBundle = asset; #if UNITY_EDITOR if ("shader_greymaterial.ab".Equals(szPkgName)) { Material mat = gDicPkgResource[szPkgName].assetBundle.LoadAsset <Material>("GreyMaterial"); mat.shader = Shader.Find(mat.shader.name); } #endif } } else { resourceData.assetBundle = null; } /** @brief: 判断是否提前释放 */ if (resourceData.eState == ResourceMgrData.State.Loading) { resourceData.eState = ResourceMgrData.State.LoadFinish; } else { if (IsInvalid(resourceData.assetBundle) == false) { resourceData.assetBundle.Unload(true); resourceData.assetBundle = null; } } } while (false); ResourceMgrData resourceMgrData = gDicPkgResource[szPkgName]; /** @brief: 等待下载完成进行检测 */ while (resourceMgrData.eState == ResourceMgrData.State.Loading) { yield return(new WaitForEndOfFrame()); } /** @brief: 提前释放 */ if (resourceMgrData.eState == ResourceMgrData.State.None) { callback = null; ////JZLog.LogWarning("LoadResources : You have Destroyed this bundle " + szPkgName + " , Ignore ..."); yield break; } InitHideFlag(resourceMgrData.assetBundle); if (callback != null) { callback.Invoke(szPkgName, resourceMgrData.assetBundle); callback = null; } }