コード例 #1
0
    /// <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);
        }
    }