Exemplo n.º 1
0
    /// <summary>
    /// 迭代unload资源加载的ab
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    IEnumerator DisposeDPAB(string name)
    {
        string[] dpAbs = mMainManifest.GetAllDependencies(name); //取这个资源的所有依赖资源
        if (dpAbs.Length == 0)
        {                                                        //这个资源已经是最小单元了
            if (mAssetsABDic.ContainsKey(name))
            {
                AssetsBundleData abd = mAssetsABDic[name];

                abd.depIndex -= 1;
                if (abd.depIndex <= 0)
                {
                    if (abd.ab != null)
                    {
                        abd.ab.Unload(false);
                        abd.ab = null;
                    }
                    mAssetsABDic.Remove(name);
                    abd = null;
                }
            }
        }
        else
        {
            for (int i = 0; i < dpAbs.Length; i++)
            {
                yield return(StartCoroutine(DisposeDPAB(dpAbs[i])));
            }
        }

        /*
         * if (mAssetsDpDic.ContainsKey(name))
         * {
         *  AssetsBundleData abd = mAssetsDpDic[name];
         *  abd.depIndex -= 1;
         *  if (abd.depIndex <= 0)
         *  {
         *      if (abd.ab != null)
         *      {
         *          abd.ab.Unload(false);
         *          abd.ab = null;
         *      }
         *      mAssetsDpDic.Remove(name);
         *      abd = null;
         *  }
         * }
         * */
        yield return(null);
    }
Exemplo n.º 2
0
 /// <summary>
 /// 清除被依赖的资源包
 /// </summary>
 /// <param name="name"></param>
 private void UnLoadDpAssets(string name)
 {
     string[] dpAbs = mMainManifest.GetAllDependencies(name); //取这个依赖资源的所有依赖资源
     if (dpAbs.Length == 0)
     {                                                        //这个资源包没有依赖其他的
         if (mAssetsABDic.ContainsKey(name))
         {
             //计数器-1
             AssetsBundleData abd = mAssetsABDic[name];
             abd.depIndex -= 1;
             if (abd.depIndex <= 0)
             {
                 if (abd.ab != null)
                 {
                     abd.ab.Unload(false);
                     abd.ab = null;
                 }
                 Debug.LogError("remove ab:" + name);
                 mAssetsABDic.Remove(name);//移除索引计数器
                 abd = null;
             }
         }
     }
     else   //还有依赖的
     {
         for (int i = 0; i < dpAbs.Length; i++)
         {
             UnLoadDpAssets(dpAbs[i]);
         }
     }
     if (mAssetsABDic.ContainsKey(name))
     {
         //计数器-1
         AssetsBundleData abd = mAssetsABDic[name];
         abd.depIndex -= 1;
         if (abd.depIndex <= 0)
         {
             if (abd.ab != null)
             {
                 abd.ab.Unload(false);
                 abd.ab = null;
             }
             Debug.LogError("remove ab:" + name);
             mAssetsABDic.Remove(name);//移除索引计数器
             abd = null;
         }
     }
 }
 void LoadAssets(string path, LoadComplete cb, object obj = null)
 {
     if (mAssetsABDic.ContainsKey(path))
     {
         AssetsBundleData abd = mAssetsABDic[path];
         abd.depIndex += 1;
         UnityEngine.Object o = GetObj(abd.ab, path);
         if (cb != null)
         {
             cb.Invoke(o, obj);
         }
     }
     else
     {
         SynLoadAssets(path, false, obj, cb);
     }
 }
Exemplo n.º 4
0
    /// <summary>
    /// 卸载所有已加载的资源包
    /// </summary>
    public override void UnLoadAllRes()
    {
        Debug.LogError("UnLoadAllRes");
        foreach (string key in mAssetsABDic.Keys)
        {
            AssetsBundleData abd = mAssetsABDic[key];
            if (abd.ab != null)
            {
                abd.ab.Unload(false);
                abd.ab = null;
                abd    = null;
            }
        }
        mAssetsABDic.Clear();

        //mAssetsLoaded.Clear();
        Resources.UnloadUnusedAssets();
        GC.Collect();
    }
    /// <summary>
    /// 真正加载的地方
    /// </summary>
    /// <param name="path"></param>
    /// <param name="dp"></param>
    /// <param name="cb"></param>
    /// <param name="obj"></param>
    /// <returns></returns>

    void SynLoadAssets(string path, bool dp, object obj, LoadComplete cb)
    {
        if (mNameMD5Dic.ContainsKey(path))
        {
            VersionAssetData vad = mNameMD5Dic[path];
            string           url = GetAssetsFilePath(vad.path, vad.md5);
            AssetBundle      ab  = null;
            if (!dp)
            {
                // 作为主资源加载的
                AssetsBundleData abd = null;
                if (mAssetsABDic.ContainsKey(path))//已经被加载过 计数器自增
                {
                    abd           = mAssetsABDic[path];
                    abd.depIndex += 1;
                    ab            = abd.ab;
                }
                else
                {
                    // 新加载的
                    ab           = AssetBundle.LoadFromFile(url);
                    abd          = new AssetsBundleData();
                    abd.name     = path;
                    abd.depIndex = 1;
                    abd.ab       = ab;

                    mAssetsABDic.Add(path, abd);
                }
                string[] dpAbs = mMainManifest.GetAllDependencies(path); //取这个资源的所有依赖资源
                #region
                if (dpAbs != null && dpAbs.Length == 0)                  //没有依赖 获取资源
                {
                    UnityEngine.Object o = GetObj(ab, path);
                    if (cb != null)
                    {
                        cb.Invoke(o, obj);
                    }
                }
                #endregion
                #region
                else
                {
                    //存在依赖资源
                    #region
                    for (int i = 0; i < dpAbs.Length; i++)
                    {
                        if (mAssetsABDic.ContainsKey(dpAbs[i]))
                        {
                            // 依赖计数器中已经存在了 计数器+1
                            abd           = mAssetsABDic[dpAbs[i]];
                            abd.depIndex += 1;
                        }
                        else
                        {
                            SynLoadAssets(dpAbs[i], true, obj, cb);
                        }
                    }
                    //依赖都加载完毕了 再看主资源
                    UnityEngine.Object o = GetObj(ab, path);

                    if (cb != null)
                    {
                        cb.Invoke(o, obj);
                    }
                    #endregion
                }
            }
            #endregion
            else
            {
                // 作为被依赖资源下载
                AssetsBundleData abd = null;
                if (mAssetsABDic.ContainsKey(path))
                {
                    abd           = mAssetsABDic[path];
                    abd.depIndex += 1;
                }
                else//被依赖的 缓存
                {
                    ab           = AssetBundle.LoadFromFile(url);
                    abd          = new AssetsBundleData();
                    abd.name     = path;
                    abd.depIndex = 1;
                    abd.ab       = ab;

                    mAssetsABDic.Add(path, abd);
                }
            }
        }
        else
        {
            Debug.LogError("cannot find:" + path);
        }
    }
Exemplo n.º 6
0
    /// <summary>
    /// 加载资源包
    /// </summary>
    /// <param name="dpName"></param>
    /// <param name="mainName">主资源名称</param>
    /// <returns></returns>
    IEnumerator WWWLoadAssets(string name, bool dp)
    {
        if (mAssetsABDic.ContainsKey(name))
        {
            AssetsBundleData abd = mAssetsABDic[name];
            abd.depIndex += 1;
        }
        else
        {
            if (mNameMD5Dic.ContainsKey(name))
            {
                VersionAssetData vad = mNameMD5Dic[name];

                /*
                 * string url = GetAssetsWWWPath(vad.path, vad.md5);
                 * WWW abWWW = new WWW(url);
                 * yield return abWWW;
                 */
                string url   = GetAssetsFilePath(vad.path, vad.md5);
                byte[] bytes = ComTool.ReadFile(url);

                if (bytes != null)
                {
                    AssetBundle ab = null;

                    if (!dp)
                    {                                                            //作为主资源加载的
                        ab = AssetBundle.LoadFromMemory(bytes);
                        string[] dpAbs = mMainManifest.GetAllDependencies(name); //取这个资源的所有依赖资源
                        if (dpAbs.Length == 0)                                   //没有依赖
                        {
                            #region
                            AssetsBundleData abd = new AssetsBundleData();
                            abd.name     = name;
                            abd.depIndex = 1;
                            abd.ab       = ab;
                            mAssetsABDic.Add(name, abd);
                            #endregion
                        }
                        else
                        { //存在依赖资源
                            #region

                            for (int i = 0; i < dpAbs.Length; i++)
                            {
                                if (mAssetsABDic.ContainsKey(dpAbs[i]))
                                { //依赖计数器中已经存在了 计数器+1
                                    AssetsBundleData abd = mAssetsABDic[dpAbs[i]];
                                    abd.depIndex += 1;
                                }
                                else
                                {
                                    yield return(StartCoroutine(WWWLoadAssets(dpAbs[i], true)));
                                }
                            }
                            #endregion
                            //依赖都加载完毕了 再看主资源
                            #region
                            if (!mAssetsABDic.ContainsKey(name))
                            {
                                AssetsBundleData abd = new AssetsBundleData();
                                abd.name     = name;
                                abd.depIndex = 1;
                                abd.ab       = ab;
                                mAssetsABDic.Add(name, abd);
                            }
                            else
                            {
                                AssetsBundleData abd = mAssetsABDic[name];
                                abd.depIndex += 1;
                            }
                            #endregion
                        }
                    }
                    else
                    {//作为被依赖资源下载
                        AssetsBundleData abd = null;
                        if (mAssetsABDic.ContainsKey(name))
                        {
                            abd           = mAssetsABDic[name];
                            abd.depIndex += 1;
                        }
                        else
                        {
                            ab           = AssetBundle.LoadFromMemory(bytes);
                            abd          = new AssetsBundleData();
                            abd.name     = name;
                            abd.depIndex = 1;
                            abd.ab       = ab;
                            mAssetsABDic.Add(name, abd);
                        }
                    }

                    if (!dp)
                    { //资源包加载完成计数+1
                        mLoadedNum += 1;
                        //Debug.LogError("module loaded num:" + mLoadedNum);
                    }
                }
                else
                {
                    Debug.LogError("cannot find:" + url);
                }
            }
        }
    }