Example #1
0
    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]);
            }
        }
    }
Example #2
0
    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);
            }
        }
    }
Example #3
0
    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);
    }
Example #4
0
    /// <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();
        }
Example #6
0
    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);
    }
Example #7
0
        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);
        }
Example #8
0
    private ABItem LoadAssetBundleByAssetName(string assetFullPath)
    {
        Assert.IsTrue(m_assetToABNames.ContainsKey(assetFullPath), assetFullPath + "没有对应的AB包!");
        string abName = m_assetToABNames[assetFullPath];
        ABItem abItem = LoadAssetBundle(abName);

        return(abItem);
    }
Example #9
0
    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);
    }
Example #10
0
    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);
            }
        }
    }
Example #11
0
 /// <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);
         }
     }
 }
Example #12
0
        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}");
            }
        }