// 从AssetBundle中加载资源 public void LoadAssetFromBundle(LoaderGroup group, string path, string name, Type type, GroupLoadedCallback onLoaded, bool async = true, bool persistent = false, LoadPriority priority = LoadPriority.Normal) { path = path.ToLower(); LoadAssetBundle(group, path, (group1, data) => { AssetBundleInfo cache = data as AssetBundleInfo; LoadBundleAsset(group1, cache, name, type, onLoaded, async); }, async, persistent, true, priority); }
// ------------------------------------------------------------------------------------------ // 从AssetBundle里加载资源 private void LoadBundleAsset(LoaderGroup group, AssetBundleInfo info, string name, Type type, GroupLoadedCallback onLoaded, bool async = true, LoadPriority priority = LoadPriority.Normal) { if (info == null || string.IsNullOrEmpty(name)) { if (onLoaded != null) { onLoaded(group, null); } return; } if (!async) { // 同步,直接加载 //Logger.Log(string.Format("-->LoadBundleAsset: {0}", name)); Object asset = info.LoadAsset(name, type); if (onLoaded != null) { onLoaded(group, asset); } } else { // 异步,创建一个加载器后加载 BundleAssetLoadParam param = new BundleAssetLoadParam { Bundle = info.Bundle, Type = type }; m_task.AddLoadTask(group, Loader.LoaderType.BundleAsset, name, param, (group1, data1) => { // 加载回调 if (onLoaded != null) { onLoaded(group1, data1); } }, true, priority, true); } }
// 加载AssetBundle(先从persistentData读,没有找到则从streamingAssets读,带后缀) private void LoadAssetBundle(LoaderGroup group, string path, GroupLoadedCallback onLoaded, bool async = true, bool persistent = false, bool manifest = true, LoadPriority priority = LoadPriority.Normal) { path = path.ToLower(); if (async && group == null) { group = m_task.PopGroup(priority); } if (manifest) { if (!HasBundle(path)) { // Manifest里没有这个AssetBundle,说明是一个错误的路径 Logger.LogError(string.Format("ab不存在:{0}", path)); if (onLoaded != null) { if (!async) { onLoaded(group, null); } else { m_task.AddAsyncCallback(onLoaded, group, null); } } return; } // 加载依赖 LoadDependencies(group, path, async, persistent); } // 检查是否有缓存 if (m_cache.CheckAssetBundleInfo(group, path, onLoaded, persistent, async)) { return; } // 添加加载任务 m_task.AddLoadTask(group, Loader.LoaderType.Bundle, path, null, (group1, data) => { AssetBundle ab = data as AssetBundle; AssetBundleInfo info = null; if (ab != null) { info = m_cache.SetAssetBundle(path, ab); #if UNITY_EDITOR RefreshShader(ab); #endif } // 加载回调 if (onLoaded != null) { onLoaded(group1, info); } }, async, priority); }