private void UnloadAssetBundle(string abName) { // 卸载本包 ABItem item = null; m_loadedABs.TryGetValue(abName, out item); if (item != null) { item.Release(); Debug.Log(string.Format("释放AB包:{0} 引用: {1}", abName, item.ReferencedCount)); if (item.ReferencedCount <= 0) { item.UnLoad(); m_loadedABs.Remove(abName); GameMgr.m_ObjectMgr.Recycle <ABItem>(item); Debug.Log(string.Format("删除AB包:{0}", abName)); } } // 卸载依赖 string[] dependence = null; m_ABToDependence.TryGetValue(abName, out dependence); if (dependence != null && dependence.Length > 0) { for (int i = 0; i < dependence.Length; i++) { UnloadAssetBundle(dependence[i]); } } }
private void ResetCfg() { if (ABUtility.LoadMode != LoadModeEnum.EditorOrigin) { // asset to ab name 读取 if (m_assetToABNames.Count > 0) { UnloadAssetBundle("configs"); m_assetToABNames.Clear(); m_ABToDependence.Clear(); } ABItem ab = LoadAssetBundle("configs"); AssetBundleConfig cfg2 = ab.AssetBundle.LoadAsset <AssetBundleConfig>("AssetBundleConfig.asset"); foreach (var item in cfg2.ResDict) { m_assetToABNames.Add(item.Path, item.ABName); } foreach (var item in cfg2.ABDict) { m_ABToDependence.Add(item.Name, item.DependenceNames); } } }
private ABItem LoadAssetBundle(string abName) { Debug.Log("同步加载AB包: " + abName); Assert.IsFalse(m_loadingABNames.Contains(abName), "在异步加载尚未结束时不能再同步加载AB包:" + abName); // AB包的依赖项 string[] dependence = null; m_ABToDependence.TryGetValue(abName, out dependence); if (dependence != null && dependence.Length > 0) { for (int i = 0; i < dependence.Length; i++) { LoadAssetBundle(dependence[i]); } } // AB包本身 ABItem abItem = null; m_loadedABs.TryGetValue(abName, out abItem); if (abItem != null) { abItem.Retain(); } else { string abPath = ABUtility.ABAbsolutePath + abName; Debug.Log("Path:" + abPath); AssetBundle ab = AssetBundle.LoadFromFile(abPath); abItem = GameMgr.m_ObjectMgr.Spawn <ABItem>(); abItem.Init(ab, abName); m_loadedABs[abName] = abItem; } Debug.Log(string.Format("同步加载AB包完毕: {0} 引用 {1}", abName, abItem.ReferencedCount)); return(abItem); }
/// <summary> /// 同步加载AssetItem /// </summary> /// <param name="fullPath"></param> /// <returns></returns> public AssetItem LoadAsset(string fullPath) { switch (ABUtility.LoadMode) { # if UNITY_EDITOR case LoadModeEnum.EditorOrigin: UnityEngine.Object obj = UnityEditor.AssetDatabase.LoadAssetAtPath <UnityEngine.Object>(fullPath); AssetItem assetItem = GameMgr.m_ObjectMgr.Spawn <AssetItem>(); assetItem.Init("", fullPath, obj); return(assetItem); case LoadModeEnum.EditorAB: #endif case LoadModeEnum.StandaloneAB: case LoadModeEnum.DeviceFullAotAB: ABItem ABItem = LoadAssetBundleByAssetName(fullPath); UnityEngine.Object obj2 = null; if (!fullPath.EndsWith(".unity")) { obj2 = ABItem.AssetBundle.LoadAsset(fullPath); } AssetItem assetItem2 = GameMgr.m_ObjectMgr.Spawn <AssetItem>(); assetItem2.Init(ABItem.ABName, fullPath, obj2); return(assetItem2); default: return(null); } }
public void CreatResSetting() { resSetting = new ResSetting(); resSetting.manifestName = "ab"; GetFile(nowData.outpath); for (int i = 0; i < _files.Count; i++) { string file = _files[i]; EditorUtility.DisplayProgressBar("正在生成 res.json", string.Format("文件:{0}", file), ((float)i / resSetting.items.Count)); FileInfo fi = new FileInfo(file); if (fi.Extension == ".manifest" || fi.Extension == ".dll" || fi.Extension == ".pdb") { continue; } ABItem item = new ABItem(); item.name = _files[i].Replace(nowData.outpath, "").Replace("\\", "/"); item.version = GetMD5(_files[i]); item.size = fi.Length; resSetting.items.Add(item); } string u = FileTools.GetLocalPath("", "ResVersion.json");; string data = JsonMapper.ToJson(resSetting); ShowNotification(new GUIContent("生成配置完成")); File.WriteAllText(u, data); EditorUtility.ClearProgressBar(); }
IEnumerator Start() { yield return(new ABUpdater()); try { AssetBundlesManager.Instance.Init(); string assetName = "Assets/~Temp/Prefabs/tea_pot.prefab"; ABItem item = AssetBundlesManager.Instance.BeginLoadABContain(assetName); GameObject go = item.ab.LoadAsset <GameObject>(assetName); Object.Instantiate(go, Vector3.zero, Quaternion.identity); AssetBundlesManager.Instance.EndLoad(true); assetName = "Assets/~Temp/Prefabs/box.prefab"; item = AssetBundlesManager.Instance.BeginLoadABContain(assetName); go = item.ab.LoadAsset <GameObject>(assetName); Object.Instantiate(go, -Vector3.one, Quaternion.identity); AssetBundlesManager.Instance.EndLoad(true); assetName = "Assets/~Temp/Prefabs/@Sphere.prefab"; item = AssetBundlesManager.Instance.BeginLoadABContain(assetName); go = item.ab.LoadAsset <GameObject>(assetName); Object.Instantiate(go, Vector3.one, Quaternion.identity); AssetBundlesManager.Instance.EndLoad(false); } catch (Exception e) { Debug.Log(e); } Destroy(this); }
public AssetBundle LoadAB(string name) { ABItem item = null; uint crc = Crc32.GetCrc32(name); if (!abItemDict.TryGetValue(crc, out item)) { AssetBundle ab = null; string fullPath = Application.streamingAssetsPath + $"/{name}"; ab = AssetBundle.LoadFromFile(fullPath); if (ab == null) { throw new Exception($"ab 加载失败:{fullPath}"); } item = abItemPool.Spawn(); item.AB = ab; item.Retain(); abItemDict.Add(crc, item); } else { item.Retain(); } return(item.AB); }
private ABItem LoadAssetBundleByAssetName(string assetFullPath) { Assert.IsTrue(m_assetToABNames.ContainsKey(assetFullPath), assetFullPath + "没有对应的AB包!"); string abName = m_assetToABNames[assetFullPath]; ABItem abItem = LoadAssetBundle(abName); return(abItem); }
private IEnumerator _loadAssetFromABItemAsync(ABItem item, string assetFullPath, Action <AssetItem> successCall) { var request = item.AssetBundle.LoadAssetAsync(assetFullPath); yield return(request.isDone); AssetItem item2 = GameMgr.m_ObjectMgr.Spawn <AssetItem>(); item2.Init(item.ABName, assetFullPath, request.asset); successCall?.Invoke(item2); }
private IEnumerator LoadAssetBundleAsync(string abName, Action <ABItem> successCall, Action failCall = null) { Debug.Log("异步加载AB包: " + abName); // AB包的依赖项 string[] dependence = null; m_ABToDependence.TryGetValue(abName, out dependence); if (dependence != null && dependence.Length > 0) { for (int i = 0; i < dependence.Length; i++) { GameMgr.StartCoroutine(LoadAssetBundleAsync(dependence[i], null)); } } // AB包本身 ABItem abItem = null; m_loadedABs.TryGetValue(abName, out abItem); if (abItem != null) { abItem.Retain(); Debug.Log(string.Format("异步加载AB包完毕: {0} 引用 {1}", abName, abItem.ReferencedCount)); successCall?.Invoke(abItem); } else { string abPath = ABUtility.ABAbsolutePath + abName; // 加载中 if (m_loadingABNames.Contains(abName)) { yield return(m_loadedABs.ContainsKey(abName)); abItem = m_loadedABs[abName]; abItem.Retain(); Debug.Log(string.Format("异步加载AB包完毕: {0} 引用 {1}", abName, abItem.ReferencedCount)); successCall?.Invoke(abItem); } else { // 从头加载 Debug.Log("Path:" + abPath); m_loadingABNames.Add(abName); var abRequest = AssetBundle.LoadFromFileAsync(abPath); yield return(abRequest.isDone); abItem = GameMgr.m_ObjectMgr.Spawn <ABItem>(); abItem.Init(abRequest.assetBundle, abName); m_loadedABs[abName] = abItem; m_loadingABNames.Remove(abName); Debug.Log(string.Format("异步加载AB包完毕: {0} 引用 {1}", abName, abItem.ReferencedCount)); successCall?.Invoke(abItem); } } }
/// <summary> /// 获取AB包的引用 /// </summary> /// <param name="abName"></param> /// <returns></returns> public int GetABReferencedCount(string abName) { if (string.IsNullOrEmpty(abName)) { return(-1); } else { ABItem item = null; m_loadedABs.TryGetValue(abName, out item); if (item != null) { return(item.ReferencedCount); } else { return(-1); } } }
public void UnloadAB(string name) { ABItem item = null; var crc = Crc32.GetCrc32(name); if (abItemDict.TryGetValue(crc, out item) && item != null) { item.Release(); if (item.RefCount > 0) { return; } abItemPool.Recycle(item); abItemDict.Remove(crc); } else { Debug.LogError($"无法释放AB:{name}"); } }